* [PATCH] FUSE: interrupted open fix
@ 2005-04-24 15:30 Miklos Szeredi
0 siblings, 0 replies; only message in thread
From: Miklos Szeredi @ 2005-04-24 15:30 UTC (permalink / raw)
To: akpm; +Cc: linux-kernel
This patch fixes incorrect behavior of open(..., O_CREAT|O_EXCL) in
case it is interrupted after the file has been created. In this case
the system call was restarted and returned -EEXIST. The solution is
not to allow interruption. Thanks to David Shaw for the bug report
and testing.
Signed-off-by: Miklos Szeredi <miklos@szeredi.hu>
diff -rup linux-2.6.12-rc2-mm3/fs/fuse/file.c linux-fuse/fs/fuse/file.c
--- linux-2.6.12-rc2-mm3/fs/fuse/file.c 2005-04-22 15:37:21.000000000 +0200
+++ linux-fuse/fs/fuse/file.c 2005-04-22 15:50:32.000000000 +0200
@@ -20,6 +20,9 @@ int fuse_open_common(struct inode *inode
struct fuse_open_out outarg;
struct fuse_file *ff;
int err;
+ /* Restarting the syscall is not allowed if O_CREAT and O_EXCL
+ are both set, because creation will fail on the restart */
+ int excl = (file->f_flags & (O_CREAT|O_EXCL)) == (O_CREAT|O_EXCL);
err = generic_file_open(inode, file);
if (err)
@@ -33,9 +36,12 @@ int fuse_open_common(struct inode *inode
return err;
}
- req = fuse_get_request(fc);
+ if (excl)
+ req = fuse_get_request_nonint(fc);
+ else
+ req = fuse_get_request(fc);
if (!req)
- return -ERESTARTSYS;
+ return excl ? -EINTR : -ERESTARTSYS;
err = -ENOMEM;
ff = kmalloc(sizeof(struct fuse_file), GFP_KERNEL);
@@ -59,7 +65,10 @@ int fuse_open_common(struct inode *inode
req->out.numargs = 1;
req->out.args[0].size = sizeof(outarg);
req->out.args[0].value = &outarg;
- request_send(fc, req);
+ if (excl)
+ request_send_nonint(fc, req);
+ else
+ request_send(fc, req);
err = req->out.h.error;
if (!err && !(fc->flags & FUSE_KERNEL_CACHE))
invalidate_inode_pages(inode->i_mapping);
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2005-04-24 15:31 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-04-24 15:30 [PATCH] FUSE: interrupted open fix Miklos Szeredi
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.