From a7acd7f46e0382e55f3a8a7811c5862ecb4d4b43 Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Wed, 2 Feb 2005 11:31:36 +0000 Subject: [PATCH] fix --- kernel/dev.c | 18 +++++++++++------- 1 file 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) -- 2.30.2