aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2005-02-02 11:31:36 +0000
committerMiklos Szeredi <miklos@szeredi.hu>2005-02-02 11:31:36 +0000
commita7acd7f46e0382e55f3a8a7811c5862ecb4d4b43 (patch)
tree4656082243855d1352f0ac06e6cc1eaea1323f01
parente5183747da2b268f53a9464fda5fd6b4856c62a4 (diff)
downloadlibfuse-a7acd7f46e0382e55f3a8a7811c5862ecb4d4b43.tar.gz
fix
-rw-r--r--kernel/dev.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/kernel/dev.c b/kernel/dev.c
index c040180..f6e8b1f 100644
--- a/kernel/dev.c
+++ b/kernel/dev.c
@@ -221,31 +221,35 @@ static void background_request(struct fuse_req *req)
get_file(req->file);
}
-static void request_wait_answer_nonint(struct fuse_req *req)
+static int request_wait_answer_nonint(struct fuse_req *req)
{
+ int err;
sigset_t oldset;
block_sigs(&oldset);
- wait_event_interruptible(req->waitq, req->finished);
+ err = wait_event_interruptible(req->waitq, req->finished);
restore_sigs(&oldset);
+ return err;
}
/* Called with fuse_lock held. Releases, and then reacquires it. */
static void request_wait_answer(struct fuse_req *req, int interruptible)
{
+ int intr;
+
spin_unlock(&fuse_lock);
if (interruptible)
- wait_event_interruptible(req->waitq, req->finished);
+ intr = wait_event_interruptible(req->waitq, req->finished);
else
- request_wait_answer_nonint(req);
+ intr = request_wait_answer_nonint(req);
spin_lock(&fuse_lock);
- if (interruptible && !req->finished && req->sent) {
+ if (intr && interruptible && req->sent) {
/* If request is already in userspace, only allow KILL
signal to interrupt */
spin_unlock(&fuse_lock);
- request_wait_answer_nonint(req);
+ intr = request_wait_answer_nonint(req);
spin_lock(&fuse_lock);
}
- if (req->finished)
+ if (!intr)
return;
if (!interruptible || req->sent)