d_add_ci() should just accept a hashed exact match if it finds one
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
ca5358ef75
commit
427c77d461
1 changed files with 7 additions and 39 deletions
46
fs/dcache.c
46
fs/dcache.c
|
@ -1888,51 +1888,19 @@ struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode,
|
|||
* if not go ahead and create it now.
|
||||
*/
|
||||
found = d_hash_and_lookup(dentry->d_parent, name);
|
||||
if (unlikely(IS_ERR(found)))
|
||||
goto err_out;
|
||||
if (!found) {
|
||||
new = d_alloc(dentry->d_parent, name);
|
||||
if (!new) {
|
||||
found = ERR_PTR(-ENOMEM);
|
||||
goto err_out;
|
||||
} else {
|
||||
found = d_splice_alias(inode, new);
|
||||
if (found) {
|
||||
dput(new);
|
||||
return found;
|
||||
}
|
||||
return new;
|
||||
}
|
||||
|
||||
found = d_splice_alias(inode, new);
|
||||
if (found) {
|
||||
dput(new);
|
||||
return found;
|
||||
}
|
||||
return new;
|
||||
}
|
||||
|
||||
/*
|
||||
* If a matching dentry exists, and it's not negative use it.
|
||||
*
|
||||
* Decrement the reference count to balance the iget() done
|
||||
* earlier on.
|
||||
*/
|
||||
if (found->d_inode) {
|
||||
if (unlikely(found->d_inode != inode)) {
|
||||
/* This can't happen because bad inodes are unhashed. */
|
||||
BUG_ON(!is_bad_inode(inode));
|
||||
BUG_ON(!is_bad_inode(found->d_inode));
|
||||
}
|
||||
iput(inode);
|
||||
return found;
|
||||
}
|
||||
|
||||
/*
|
||||
* Negative dentry: instantiate it unless the inode is a directory and
|
||||
* already has a dentry.
|
||||
*/
|
||||
new = d_splice_alias(inode, found);
|
||||
if (new) {
|
||||
dput(found);
|
||||
found = new;
|
||||
}
|
||||
return found;
|
||||
|
||||
err_out:
|
||||
iput(inode);
|
||||
return found;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue