fix
authorMiklos Szeredi <miklos@szeredi.hu>
Wed, 2 Feb 2005 10:53:59 +0000 (10:53 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Wed, 2 Feb 2005 10:53:59 +0000 (10:53 +0000)
ChangeLog
kernel/dev.c

index a1f4876689a1ec4830921e93f481c32d4dc357da..3dcc9159dd13c197dd87d9a8973067775b1f7c32 100644 (file)
--- 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 
index 8ce078bac71b4f7e9a0a25b03289bdd674f7446c..c0401807e45645f9f318fdd937403756f23d3e5c 100644 (file)
@@ -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);
 }