diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2006-06-25 08:48:54 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-25 13:01:19 -0400 |
commit | a4d27e75ffb7b8ecb7eed0c7db0df975525f3fd7 (patch) | |
tree | 2353706a33196438547ed4651afd9f2d81dd96e8 /fs/fuse/fuse_i.h | |
parent | f9a2842e5612b93fa20a624a8baa6c2a7ecea504 (diff) |
[PATCH] fuse: add request interruption
Add synchronous request interruption. This is needed for file locking
operations which have to be interruptible. However filesystem may implement
interruptibility of other operations (e.g. like NFS 'intr' mount option).
Signed-off-by: Miklos Szeredi <miklos@szeredi.hu>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs/fuse/fuse_i.h')
-rw-r--r-- | fs/fuse/fuse_i.h | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index fd65e75e1622..c862df58da92 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h | |||
@@ -131,6 +131,7 @@ enum fuse_req_state { | |||
131 | FUSE_REQ_PENDING, | 131 | FUSE_REQ_PENDING, |
132 | FUSE_REQ_READING, | 132 | FUSE_REQ_READING, |
133 | FUSE_REQ_SENT, | 133 | FUSE_REQ_SENT, |
134 | FUSE_REQ_WRITING, | ||
134 | FUSE_REQ_FINISHED | 135 | FUSE_REQ_FINISHED |
135 | }; | 136 | }; |
136 | 137 | ||
@@ -144,9 +145,15 @@ struct fuse_req { | |||
144 | fuse_conn */ | 145 | fuse_conn */ |
145 | struct list_head list; | 146 | struct list_head list; |
146 | 147 | ||
148 | /** Entry on the interrupts list */ | ||
149 | struct list_head intr_entry; | ||
150 | |||
147 | /** refcount */ | 151 | /** refcount */ |
148 | atomic_t count; | 152 | atomic_t count; |
149 | 153 | ||
154 | /** Unique ID for the interrupt request */ | ||
155 | u64 intr_unique; | ||
156 | |||
150 | /* | 157 | /* |
151 | * The following bitfields are either set once before the | 158 | * The following bitfields are either set once before the |
152 | * request is queued or setting/clearing them is protected by | 159 | * request is queued or setting/clearing them is protected by |
@@ -165,6 +172,9 @@ struct fuse_req { | |||
165 | /** Request is sent in the background */ | 172 | /** Request is sent in the background */ |
166 | unsigned background:1; | 173 | unsigned background:1; |
167 | 174 | ||
175 | /** The request has been interrupted */ | ||
176 | unsigned interrupted:1; | ||
177 | |||
168 | /** Data is being copied to/from the request */ | 178 | /** Data is being copied to/from the request */ |
169 | unsigned locked:1; | 179 | unsigned locked:1; |
170 | 180 | ||
@@ -262,6 +272,9 @@ struct fuse_conn { | |||
262 | /** Number of requests currently in the background */ | 272 | /** Number of requests currently in the background */ |
263 | unsigned num_background; | 273 | unsigned num_background; |
264 | 274 | ||
275 | /** Pending interrupts */ | ||
276 | struct list_head interrupts; | ||
277 | |||
265 | /** Flag indicating if connection is blocked. This will be | 278 | /** Flag indicating if connection is blocked. This will be |
266 | the case before the INIT reply is received, and if there | 279 | the case before the INIT reply is received, and if there |
267 | are too many outstading backgrounds requests */ | 280 | are too many outstading backgrounds requests */ |
@@ -320,6 +333,9 @@ struct fuse_conn { | |||
320 | /** Is create not implemented by fs? */ | 333 | /** Is create not implemented by fs? */ |
321 | unsigned no_create : 1; | 334 | unsigned no_create : 1; |
322 | 335 | ||
336 | /** Is interrupt not implemented by fs? */ | ||
337 | unsigned no_interrupt : 1; | ||
338 | |||
323 | /** The number of requests waiting for completion */ | 339 | /** The number of requests waiting for completion */ |
324 | atomic_t num_waiting; | 340 | atomic_t num_waiting; |
325 | 341 | ||