|
@@ -2003,18 +2003,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;
|
|
|
}
|