diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2005-09-09 16:10:39 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-09-09 17:03:48 -0400 |
commit | 7c352bdf048811b8128019ffc1e886161e09c11c (patch) | |
tree | 74c48298b67d37295433d9b2bb08d590a5f97a78 /fs/fuse/fuse_i.h | |
parent | 8254798199332966e2ab647380c990193af7e854 (diff) |
[PATCH] FUSE: don't allow restarting of system calls
This patch removes ability to interrupt and restart operations while there
hasn't been any side-effect.
The reason: applications. There are some apps it seems that generate
signals at a fast rate. This means, that if the operation cannot make
enough progress between two signals, it will be restarted for ever. This
bug actually manifested itself with 'krusader' trying to open a file for
writing under sshfs. Thanks to Eduard Czimbalmos for the report.
The problem can be solved just by making open() uninterruptible, because in
this case it was the truncate operation that slowed down the progress. But
it's better to solve this by simply not allowing interrupts at all (except
SIGKILL), because applications don't expect file operations to be
interruptible anyway. As an added bonus the code is simplified somewhat.
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 | 12 |
1 files changed, 1 insertions, 11 deletions
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index d7647289d8a1..24d761518d86 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h | |||
@@ -410,27 +410,17 @@ void fuse_reset_request(struct fuse_req *req); | |||
410 | struct fuse_req *fuse_get_request(struct fuse_conn *fc); | 410 | struct fuse_req *fuse_get_request(struct fuse_conn *fc); |
411 | 411 | ||
412 | /** | 412 | /** |
413 | * Reserve a preallocated request, only interruptible by SIGKILL | ||
414 | */ | ||
415 | struct fuse_req *fuse_get_request_nonint(struct fuse_conn *fc); | ||
416 | |||
417 | /** | ||
418 | * Decrement reference count of a request. If count goes to zero put | 413 | * Decrement reference count of a request. If count goes to zero put |
419 | * on unused list (preallocated) or free reqest (not preallocated). | 414 | * on unused list (preallocated) or free reqest (not preallocated). |
420 | */ | 415 | */ |
421 | void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req); | 416 | void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req); |
422 | 417 | ||
423 | /** | 418 | /** |
424 | * Send a request (synchronous, interruptible) | 419 | * Send a request (synchronous) |
425 | */ | 420 | */ |
426 | void request_send(struct fuse_conn *fc, struct fuse_req *req); | 421 | void request_send(struct fuse_conn *fc, struct fuse_req *req); |
427 | 422 | ||
428 | /** | 423 | /** |
429 | * Send a request (synchronous, non-interruptible except by SIGKILL) | ||
430 | */ | ||
431 | void request_send_nonint(struct fuse_conn *fc, struct fuse_req *req); | ||
432 | |||
433 | /** | ||
434 | * Send a request with no reply | 424 | * Send a request with no reply |
435 | */ | 425 | */ |
436 | void request_send_noreply(struct fuse_conn *fc, struct fuse_req *req); | 426 | void request_send_noreply(struct fuse_conn *fc, struct fuse_req *req); |