aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiklos Szeredi <miklos@szeredi.hu>2004-06-30 11:13:41 +0000
committerMiklos Szeredi <miklos@szeredi.hu>2004-06-30 11:13:41 +0000
commit556d03d97b0689ee32cc20d35e8715e655745c80 (patch)
tree7748befd88de39fe247949b17f593fcd39266843
parent71e9f86fc65f242b18539c196d6e6ff52de5f8c7 (diff)
downloadlibfuse-556d03d97b0689ee32cc20d35e8715e655745c80.tar.gz
add inode locking for open/release
-rw-r--r--ChangeLog5
-rw-r--r--kernel/file.c7
-rw-r--r--lib/fuse.c1
3 files changed, 12 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index af26120..6786d2e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2004-06-30 Miklos Szeredi <mszeredi@inf.bme.hu>
+
+ * Acquire inode->i_sem before open and release methods to prevent
+ concurrent rename or unlink operations.
+
2004-06-27 Miklos Szeredi <mszeredi@inf.bme.hu>
* Fix file offset wrap around at 4G when doing large reads
diff --git a/kernel/file.c b/kernel/file.c
index e845d86..9a7da73 100644
--- a/kernel/file.c
+++ b/kernel/file.c
@@ -62,7 +62,9 @@ static int fuse_open(struct inode *inode, struct file *file)
req->in.numargs = 1;
req->in.args[0].size = sizeof(inarg);
req->in.args[0].value = &inarg;
+ down(&inode->i_sem);
request_send(fc, req);
+ up(&inode->i_sem);
err = req->out.h.error;
if (!err && !(fc->flags & FUSE_KERNEL_CACHE)) {
#ifdef KERNEL_2_6
@@ -95,7 +97,10 @@ static int fuse_release(struct inode *inode, struct file *file)
req->in.numargs = 1;
req->in.args[0].size = sizeof(struct fuse_open_in);
req->in.args[0].value = inarg;
- request_send_noreply(fc, req);
+ down(&inode->i_sem);
+ request_send(fc, req);
+ up(&inode->i_sem);
+ fuse_put_request(fc, req);
/* Return value is ignored by VFS */
return 0;
diff --git a/lib/fuse.c b/lib/fuse.c
index 2b79479..d4e95f2 100644
--- a/lib/fuse.c
+++ b/lib/fuse.c
@@ -1010,6 +1010,7 @@ static void do_release(struct fuse *f, struct fuse_in_header *in,
free(path);
}
+ send_reply(f, in, 0, NULL, 0);
}
static void do_read(struct fuse *f, struct fuse_in_header *in,