summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2008-05-15 04:49:12 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2008-08-06 10:10:56 -0700
commit6fcbb3d556084dad886a6e910e90435fefda49bd (patch)
tree5d05f466b9825f591fb790886e0a764b7dcfd8e8
parentb6eb09b2fcf2b5d928f582ae866ab073820518e6 (diff)
return to old errno choice in mkdir() et.al.
commit e9baf6e59842285bcf9570f5094e4c27674a0f7c upstream In case when both EEXIST and EROFS would apply we used to return the former in mkdir(2) and friends. Lest anyone suspects us of being consistent, in the same situation knfsd gave clients nfs_erofs... ro-bind series had switched the syscall side of things to returning -EROFS and immediately broke an application - namely, mkdir -p. Patch restores the original behaviour... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk> Acked-by: Jan Blunck <jblunck@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r--fs/namei.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 8cf9bb9c2fc0..a16f1ae6081b 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -1904,18 +1904,22 @@ struct dentry *lookup_create(struct nameidata *nd, int is_dir)
if (IS_ERR(dentry))
goto fail;
+ if (dentry->d_inode)
+ goto eexist;
/*
* Special case - lookup gave negative, but... we had foo/bar/
* From the vfs_mknod() POV we just have a negative dentry -
* all is fine. Let's be bastards - you had / on the end, you've
* been asking for (non-existent) directory. -ENOENT for you.
*/
- if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
- goto enoent;
+ if (unlikely(!is_dir && nd->last.name[nd->last.len])) {
+ dput(dentry);
+ dentry = ERR_PTR(-ENOENT);
+ }
return dentry;
-enoent:
+eexist:
dput(dentry);
- dentry = ERR_PTR(-ENOENT);
+ dentry = ERR_PTR(-EEXIST);
fail:
return dentry;
}