All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.