aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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,