diff options
Diffstat (limited to 'Documentation/filesystems')
| -rw-r--r-- | Documentation/filesystems/fuse.txt | 48 |
1 files changed, 44 insertions, 4 deletions
diff --git a/Documentation/filesystems/fuse.txt b/Documentation/filesystems/fuse.txt index 324df27704cc..a584f05403a4 100644 --- a/Documentation/filesystems/fuse.txt +++ b/Documentation/filesystems/fuse.txt | |||
| @@ -124,6 +124,46 @@ For each connection the following files exist within this directory: | |||
| 124 | 124 | ||
| 125 | Only the owner of the mount may read or write these files. | 125 | Only the owner of the mount may read or write these files. |
| 126 | 126 | ||
| 127 | Interrupting filesystem operations | ||
| 128 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| 129 | |||
| 130 | If a process issuing a FUSE filesystem request is interrupted, the | ||
| 131 | following will happen: | ||
| 132 | |||
| 133 | 1) If the request is not yet sent to userspace AND the signal is | ||
| 134 | fatal (SIGKILL or unhandled fatal signal), then the request is | ||
| 135 | dequeued and returns immediately. | ||
| 136 | |||
| 137 | 2) If the request is not yet sent to userspace AND the signal is not | ||
| 138 | fatal, then an 'interrupted' flag is set for the request. When | ||
| 139 | the request has been successfully transfered to userspace and | ||
| 140 | this flag is set, an INTERRUPT request is queued. | ||
| 141 | |||
| 142 | 3) If the request is already sent to userspace, then an INTERRUPT | ||
| 143 | request is queued. | ||
| 144 | |||
| 145 | INTERRUPT requests take precedence over other requests, so the | ||
| 146 | userspace filesystem will receive queued INTERRUPTs before any others. | ||
| 147 | |||
| 148 | The userspace filesystem may ignore the INTERRUPT requests entirely, | ||
| 149 | or may honor them by sending a reply to the _original_ request, with | ||
| 150 | the error set to EINTR. | ||
| 151 | |||
| 152 | It is also possible that there's a race between processing the | ||
| 153 | original request and it's INTERRUPT request. There are two possibilities: | ||
| 154 | |||
| 155 | 1) The INTERRUPT request is processed before the original request is | ||
| 156 | processed | ||
| 157 | |||
| 158 | 2) The INTERRUPT request is processed after the original request has | ||
| 159 | been answered | ||
| 160 | |||
| 161 | If the filesystem cannot find the original request, it should wait for | ||
| 162 | some timeout and/or a number of new requests to arrive, after which it | ||
| 163 | should reply to the INTERRUPT request with an EAGAIN error. In case | ||
| 164 | 1) the INTERRUPT request will be requeued. In case 2) the INTERRUPT | ||
| 165 | reply will be ignored. | ||
| 166 | |||
| 127 | Aborting a filesystem connection | 167 | Aborting a filesystem connection |
| 128 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | 168 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| 129 | 169 | ||
| @@ -351,10 +391,10 @@ but is caused by a pagefault. | |||
| 351 | 391 | ||
| 352 | Solution is basically the same as above. | 392 | Solution is basically the same as above. |
| 353 | 393 | ||
| 354 | An additional problem is that while the write buffer is being | 394 | An additional problem is that while the write buffer is being copied |
| 355 | copied to the request, the request must not be interrupted. This | 395 | to the request, the request must not be interrupted/aborted. This is |
| 356 | is because the destination address of the copy may not be valid | 396 | because the destination address of the copy may not be valid after the |
| 357 | after the request is interrupted. | 397 | request has returned. |
| 358 | 398 | ||
| 359 | This is solved with doing the copy atomically, and allowing abort | 399 | This is solved with doing the copy atomically, and allowing abort |
| 360 | while the page(s) belonging to the write buffer are faulted with | 400 | while the page(s) belonging to the write buffer are faulted with |
