From d45baf454dcbd08ef7c5acd6cf69793eb9150954 Mon Sep 17 00:00:00 2001 From: Miklos Szeredi Date: Sun, 10 Oct 2004 07:56:12 +0000 Subject: [PATCH] fix --- ChangeLog | 5 +++++ kernel/file.c | 11 ++++------- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index bee8087..5d33766 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2004-10-09 Miklos Szeredi + + * Don't allow fuse_flush() to be interrupted (bug found by David + Shaw) + 2004-09-27 Miklos Szeredi * Add PID to fuse_context. Patch by Steven James diff --git a/kernel/file.c b/kernel/file.c index 18c155e..ec2e40c 100644 --- a/kernel/file.c +++ b/kernel/file.c @@ -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; } -- 2.30.2