From ff30a6cd43535ec318a26c1d3ec9c7edc268e9c9 Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Wed, 2 Feb 2005 10:53:59 +0000 Subject: [PATCH] fix --- ChangeLog | 4 ++++ kernel/dev.c | 20 ++++++++------------ 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 + + * Fix possible race when operation is interrupted + 2005-01-28 Miklos Szeredi * 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); } -- 2.30.2