add inode locking for open/release
authorMiklos Szeredi <miklos@szeredi.hu>
Wed, 30 Jun 2004 11:13:41 +0000 (11:13 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Wed, 30 Jun 2004 11:13:41 +0000 (11:13 +0000)
ChangeLog
kernel/file.c
lib/fuse.c

index af26120d7f8f419ca119fdfe1ccedcae2cb0331f..6786d2eea613802f6d9834a5dc500a8be1a0e0d0 100644 (file)
--- 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
index e845d867686a771396f1255b8857120a9cdbe451..9a7da73af53fbf13ece9ca7ae22bb6c3795c4719 100644 (file)
@@ -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;
index 2b7947944f00ef2535f174d485fc66d7f3e93ee8..d4e95f29d0e54f619524af5e5d393968a1718c1e 100644 (file)
@@ -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,