Commit 427c77d4 authored by Al Viro's avatar Al Viro

d_add_ci() should just accept a hashed exact match if it finds one

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent ca5358ef
...@@ -1888,15 +1888,11 @@ struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode, ...@@ -1888,15 +1888,11 @@ struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode,
* if not go ahead and create it now. * if not go ahead and create it now.
*/ */
found = d_hash_and_lookup(dentry->d_parent, name); found = d_hash_and_lookup(dentry->d_parent, name);
if (unlikely(IS_ERR(found)))
goto err_out;
if (!found) { if (!found) {
new = d_alloc(dentry->d_parent, name); new = d_alloc(dentry->d_parent, name);
if (!new) { if (!new) {
found = ERR_PTR(-ENOMEM); found = ERR_PTR(-ENOMEM);
goto err_out; } else {
}
found = d_splice_alias(inode, new); found = d_splice_alias(inode, new);
if (found) { if (found) {
dput(new); dput(new);
...@@ -1904,37 +1900,9 @@ struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode, ...@@ -1904,37 +1900,9 @@ struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode,
} }
return new; 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); iput(inode);
return found; 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;
} }
EXPORT_SYMBOL(d_add_ci); EXPORT_SYMBOL(d_add_ci);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment