diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2004-06-30 11:13:41 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2004-06-30 11:13:41 +0000 |
commit | 556d03d97b0689ee32cc20d35e8715e655745c80 (patch) | |
tree | 7748befd88de39fe247949b17f593fcd39266843 | |
parent | 71e9f86fc65f242b18539c196d6e6ff52de5f8c7 (diff) | |
download | libfuse-556d03d97b0689ee32cc20d35e8715e655745c80.tar.gz |
add inode locking for open/release
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | kernel/file.c | 7 | ||||
-rw-r--r-- | lib/fuse.c | 1 |
3 files changed, 12 insertions, 1 deletions
@@ -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; @@ -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, |