From: Miklos Szeredi Date: Mon, 16 Aug 2004 13:29:11 +0000 (+0000) Subject: fix X-Git-Tag: fuse_1_9~18 X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=22ea3dc045ca3bfc67b3cbb8e33e8f63a6f46a5e;p=qemu-gpiodev%2Flibfuse.git fix --- diff --git a/ChangeLog b/ChangeLog index 085a01f..fb0030a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2004-08-16 Miklos Szeredi + + * Change release method to be non-interruptible. Fixes bug + causing missing release() call when program which has opened files + is killed (reported by Franco Broi and David Shaw) + 2004-07-29 Miklos Szeredi * Add fuse_invalidate() to library API diff --git a/Filesystems b/Filesystems index eecf82e..ced45de 100644 --- a/Filesystems +++ b/Filesystems @@ -171,3 +171,17 @@ Description: as WebDAV API. ============================================================================== +Name: RelFS + +Author: Vincenzo Ciancia + +Homepage: http://relfs.sourceforge.net/ + +Description: + + This is a linux userspace filesystem using fuse and a relational + database to store information about files. Special directories can + represent views on the database, and many powerful features, such as + bayesian classification, are added through plugins. + +============================================================================== 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 */