From 556d03d97b0689ee32cc20d35e8715e655745c80 Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Wed, 30 Jun 2004 11:13:41 +0000 Subject: [PATCH] add inode locking for open/release --- ChangeLog | 5 +++++ kernel/file.c | 7 ++++++- lib/fuse.c | 1 + 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index af26120..6786d2e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-06-30 Miklos Szeredi + + * Acquire inode->i_sem before open and release methods to prevent + concurrent rename or unlink operations. + 2004-06-27 Miklos Szeredi * 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, -- 2.30.2