diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2004-08-16 13:29:11 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2004-08-16 13:29:11 +0000 |
commit | 22ea3dc045ca3bfc67b3cbb8e33e8f63a6f46a5e (patch) | |
tree | 640fe389753098f47c556eb834f6297a4ac9517a | |
parent | 891b874eedcc9f49364d12b4773e01a8b013fb67 (diff) | |
download | libfuse-22ea3dc045ca3bfc67b3cbb8e33e8f63a6f46a5e.tar.gz |
fix
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | Filesystems | 14 | ||||
-rw-r--r-- | kernel/dev.c | 24 | ||||
-rw-r--r-- | kernel/file.c | 2 | ||||
-rw-r--r-- | kernel/fuse_i.h | 5 |
5 files changed, 46 insertions, 5 deletions
@@ -1,3 +1,9 @@ +2004-08-16 Miklos Szeredi <miklos@szeredi.hu> + + * 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 <miklos@szeredi.hu> * 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 <vincenzo_ml (at) yahoo (dot) it> + +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 @@ -348,6 +348,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 */ void request_send_noreply(struct fuse_conn *fc, struct fuse_req *req); |