aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog4
-rw-r--r--kernel/dev.c20
2 files changed, 12 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog
index a1f4876..3dcc915 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2005-02-02 Miklos Szeredi <miklos@szeredi.hu>
+
+ * Fix possible race when operation is interrupted
+
2005-01-28 Miklos Szeredi <miklos@szeredi.hu>
* Fix compilation on 2.6.7
diff --git a/kernel/dev.c b/kernel/dev.c
index 8ce078b..c040180 100644
--- a/kernel/dev.c
+++ b/kernel/dev.c
@@ -221,35 +221,31 @@ static void background_request(struct fuse_req *req)
get_file(req->file);
}
-static int request_wait_answer_nonint(struct fuse_req *req)
+static void request_wait_answer_nonint(struct fuse_req *req)
{
- int err;
sigset_t oldset;
block_sigs(&oldset);
- err = wait_event_interruptible(req->waitq, req->finished);
+ 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)
- intr = wait_event_interruptible(req->waitq, req->finished);
+ wait_event_interruptible(req->waitq, req->finished);
else
- intr = request_wait_answer_nonint(req);
+ request_wait_answer_nonint(req);
spin_lock(&fuse_lock);
- if (intr && interruptible && req->sent) {
+ if (interruptible && !req->finished && req->sent) {
/* If request is already in userspace, only allow KILL
signal to interrupt */
spin_unlock(&fuse_lock);
- intr = request_wait_answer_nonint(req);
+ request_wait_answer_nonint(req);
spin_lock(&fuse_lock);
}
- if (!intr)
+ if (req->finished)
return;
if (!interruptible || req->sent)
@@ -271,7 +267,7 @@ static void request_wait_answer(struct fuse_req *req, int interruptible)
if (!req->sent && !list_empty(&req->list)) {
list_del(&req->list);
__fuse_put_request(req);
- } else if (req->sent)
+ } else if (!req->finished && req->sent)
background_request(req);
}