mirror of
https://github.com/torvalds/linux
synced 2024-11-02 18:48:59 +00:00
[PATCH] return to old errno choice in mkdir() et.al.
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>
This commit is contained in:
parent
23c4971e3d
commit
e9baf6e598
1 changed files with 8 additions and 4 deletions
12
fs/namei.c
12
fs/namei.c
|
@ -2003,18 +2003,22 @@ struct dentry *lookup_create(struct nameidata *nd, int is_dir)
|
||||||
if (IS_ERR(dentry))
|
if (IS_ERR(dentry))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
|
if (dentry->d_inode)
|
||||||
|
goto eexist;
|
||||||
/*
|
/*
|
||||||
* Special case - lookup gave negative, but... we had foo/bar/
|
* Special case - lookup gave negative, but... we had foo/bar/
|
||||||
* From the vfs_mknod() POV we just have a negative dentry -
|
* 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
|
* all is fine. Let's be bastards - you had / on the end, you've
|
||||||
* been asking for (non-existent) directory. -ENOENT for you.
|
* been asking for (non-existent) directory. -ENOENT for you.
|
||||||
*/
|
*/
|
||||||
if (!is_dir && nd->last.name[nd->last.len] && !dentry->d_inode)
|
if (unlikely(!is_dir && nd->last.name[nd->last.len])) {
|
||||||
goto enoent;
|
dput(dentry);
|
||||||
|
dentry = ERR_PTR(-ENOENT);
|
||||||
|
}
|
||||||
return dentry;
|
return dentry;
|
||||||
enoent:
|
eexist:
|
||||||
dput(dentry);
|
dput(dentry);
|
||||||
dentry = ERR_PTR(-ENOENT);
|
dentry = ERR_PTR(-EEXIST);
|
||||||
fail:
|
fail:
|
||||||
return dentry;
|
return dentry;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue