From 22ea3dc045ca3bfc67b3cbb8e33e8f63a6f46a5e Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Mon, 16 Aug 2004 13:29:11 +0000 Subject: fix --- kernel/dev.c | 24 ++++++++++++++++++++---- kernel/file.c | 2 +- kernel/fuse_i.h | 5 +++++ 3 files changed, 26 insertions(+), 5 deletions(-) (limited to 'kernel') diff --git a/kernel/dev.c b/kernel/dev.c index 07c19ee..31b76a6 100644 --- a/kernel/dev.c +++ b/kernel/dev.c @@ -62,12 +62,17 @@ static int request_restartable(enum fuse_opcode opcode) } /* Called with fuse_lock held. Releases, and then reaquires it. */ -static void request_wait_answer(struct fuse_req *req) +static void request_wait_answer(struct fuse_req *req, int interruptible) { int intr; spin_unlock(&fuse_lock); - intr = wait_event_interruptible(req->waitq, req->finished); + if (interruptible) + intr = wait_event_interruptible(req->waitq, req->finished); + else { + wait_event(req->waitq, req->finished); + intr = 0; + } spin_lock(&fuse_lock); if (!intr) return; @@ -171,7 +176,8 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req) } } -void request_send(struct fuse_conn *fc, struct fuse_req *req) +static void __request_send(struct fuse_conn *fc, struct fuse_req *req, + int interruptible) { req->issync = 1; req->end = NULL; @@ -182,12 +188,22 @@ void request_send(struct fuse_conn *fc, struct fuse_req *req) req->in.h.unique = get_unique(fc); list_add_tail(&req->list, &fc->pending); wake_up(&fc->waitq); - request_wait_answer(req); + request_wait_answer(req, interruptible); list_del(&req->list); } spin_unlock(&fuse_lock); } +void request_send(struct fuse_conn *fc, struct fuse_req *req) +{ + __request_send(fc, req, 1); +} + +void request_send_nonint(struct fuse_conn *fc, struct fuse_req *req) +{ + __request_send(fc, req, 0); +} + void request_send_noreply(struct fuse_conn *fc, struct fuse_req *req) { req->issync = 0; diff --git a/kernel/file.c b/kernel/file.c index facd36c..18c155e 100644 --- a/kernel/file.c +++ b/kernel/file.c @@ -144,7 +144,7 @@ static int fuse_release(struct inode *inode, struct file *file) req->in.numargs = 1; req->in.args[0].size = sizeof(struct fuse_release_in); req->in.args[0].value = inarg; - request_send(fc, req); + request_send_nonint(fc, req); fuse_put_request(fc, req); kfree(ff); up(&inode->i_sem); diff --git a/kernel/fuse_i.h b/kernel/fuse_i.h index c121148..d92e795 100644 --- a/kernel/fuse_i.h +++ b/kernel/fuse_i.h @@ -347,6 +347,11 @@ void fuse_put_request(struct fuse_conn *fc, struct fuse_req *req); */ void request_send(struct fuse_conn *fc, struct fuse_req *req); +/** + * Send a non-interruptible request + */ +void request_send_nonint(struct fuse_conn *fc, struct fuse_req *req); + /** * Send a request for which a reply is not expected */ -- cgit v1.2.3