fix
authorMiklos Szeredi <miklos@szeredi.hu>
Sun, 10 Oct 2004 07:56:12 +0000 (07:56 +0000)
committerMiklos Szeredi <miklos@szeredi.hu>
Sun, 10 Oct 2004 07:56:12 +0000 (07:56 +0000)
ChangeLog
kernel/file.c

index bee808782b8e7fdbc253b79778d8250a24698329..5d33766f5aec98d0e05ec58b0e4ce0b0c346c34f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2004-10-09  Miklos Szeredi <miklos@szeredi.hu>
+
+       * Don't allow fuse_flush() to be interrupted (bug found by David
+       Shaw)
+
 2004-09-27  Miklos Szeredi <miklos@szeredi.hu>
 
        * Add PID to fuse_context.  Patch by Steven James
index 18c155e25b9dd98bdae672f493830a5c0c7b9c10..ec2e40c771f73f06569ff709307fe7fd7717dd86 100644 (file)
@@ -158,17 +158,14 @@ static int fuse_flush(struct file *file)
        struct inode *inode = file->f_dentry->d_inode;
        struct fuse_conn *fc = INO_FC(inode);
        struct fuse_file *ff = file->private_data;
-       struct fuse_req *req;
+       struct fuse_req *req = ff->release_req;
        struct fuse_flush_in inarg;
        int err;
        
        if (fc->no_flush)
                return 0;
 
-       req = fuse_get_request(fc);
-       if (!req)
-               return -EINTR;
-
+       down(&inode->i_sem);
        memset(&inarg, 0, sizeof(inarg));
        inarg.fh = ff->fh;
        req->in.h.opcode = FUSE_FLUSH;
@@ -176,13 +173,13 @@ static int fuse_flush(struct file *file)
        req->in.numargs = 1;
        req->in.args[0].size = sizeof(inarg);
        req->in.args[0].value = &inarg;
-       request_send(fc, req);
+       request_send_nonint(fc, req);
        err = req->out.h.error;
+       up(&inode->i_sem);
        if (err == -ENOSYS) {
                fc->no_flush = 1;
                err = 0;
        }
-       fuse_put_request(fc, req);
        return err;
 }