|
@@ -1652,26 +1652,12 @@ struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode,
|
|
|
* Negative dentry: instantiate it unless the inode is a directory and
|
|
|
* already has a dentry.
|
|
|
*/
|
|
|
- spin_lock(&inode->i_lock);
|
|
|
- if (!S_ISDIR(inode->i_mode) || list_empty(&inode->i_dentry)) {
|
|
|
- __d_instantiate(found, inode);
|
|
|
- spin_unlock(&inode->i_lock);
|
|
|
- security_d_instantiate(found, inode);
|
|
|
- return found;
|
|
|
+ new = d_splice_alias(inode, found);
|
|
|
+ if (new) {
|
|
|
+ dput(found);
|
|
|
+ found = new;
|
|
|
}
|
|
|
-
|
|
|
- /*
|
|
|
- * In case a directory already has a (disconnected) entry grab a
|
|
|
- * reference to it, move it in place and use it.
|
|
|
- */
|
|
|
- new = list_entry(inode->i_dentry.next, struct dentry, d_alias);
|
|
|
- __dget(new);
|
|
|
- spin_unlock(&inode->i_lock);
|
|
|
- security_d_instantiate(found, inode);
|
|
|
- d_move(new, found);
|
|
|
- iput(inode);
|
|
|
- dput(found);
|
|
|
- return new;
|
|
|
+ return found;
|
|
|
|
|
|
err_out:
|
|
|
iput(inode);
|