aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--Filesystems14
-rw-r--r--kernel/dev.c24
-rw-r--r--kernel/file.c2
-rw-r--r--kernel/fuse_i.h5
5 files changed, 46 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 085a01f..fb0030a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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);