|
@@ -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;
|
|
|
- }
|
|
|
-
|
|
|
- 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));
|
|
|
+ } else {
|
|
|
+ found = d_splice_alias(inode, new);
|
|
|
+ if (found) {
|
|
|
+ dput(new);
|
|
|
+ return found;
|
|
|
+ }
|
|
|
+ return new;
|
|
|
}
|
|
|
- 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;
|
|
|
}
|