vfs: fix propagation of atomic_open create error on negative dentry
authorSage Weil <sage@inktank.com>
Wed, 15 Aug 2012 20:30:12 +0000 (13:30 -0700)
committerMiklos Szeredi <mszeredi@suse.cz>
Thu, 16 Aug 2012 17:29:09 +0000 (19:29 +0200)
If ->atomic_open() returns -ENOENT, we take care to return the create
error (e.g., EACCES), if any.  Do the same when ->atomic_open() returns 1
and provides a negative dentry.

This fixes a regression where an unprivileged open O_CREAT fails with
ENOENT instead of EACCES, introduced with the new atomic_open code.  It
is tested by the open/08.t test in the pjd posix test suite, and was
observed on top of fuse (backed by ceph-fuse).

Signed-off-by: Sage Weil <sage@inktank.com>
Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
fs/namei.c

index 26c28ec4f4af92caf0e3b409309c4c69aa6122c4..db76b866a09778288bcbabba420e3a2ad7f54822 100644 (file)
@@ -2489,6 +2489,10 @@ static int atomic_open(struct nameidata *nd, struct dentry *dentry,
                        dput(dentry);
                        dentry = file->f_path.dentry;
                }
+               if (create_error && dentry->d_inode == NULL) {
+                       error = create_error;
+                       goto out;
+               }
                goto looked_up;
        }