-
The FUSE kernel extension used to treat all signals, received while waiting for the user space file system daemon to respond to a file system request, as fatal. On OS X there is no public API to block signals in kernel mode or to determine which signal caused the current interrupt. This is why there have been only two options:
- Treat all signals a fatal and return immediately.
- Ignore all signals, including fatal ones.
Before version 3.0.9 all signals were treated as fatal. Between those two options this one is the "safer" one, as we do not want file systems to hang the whole system. The problem is that it can become virtually impossible to complete any I/O operation under high signal pressure on a high latency (e.g. network) file system.
In 3.0.9, if a process that is issuing a FUSE file system operation is interrupted, the following will happen:
- If the corresponding request is not yet sent to user space, then an "interrupted" flag is set for the request. When the request has been successfully transferred to user space and this flag is set, an
FUSE_INTERRUPT
request is queued. - If the request is already sent to user space, then an
FUSE_INTERRUPT
request is queued. - If a file system request is not yet sent to user space and the process issuing the request is aborted (
SIGKILL
or unhandled fatal signal), then the request is marked as answered and returns immediately.
This fixes issue #213.
-
Improve support for
sigaction(2)
flagSA_RESTART
. This fixes issue #228.