aboutsummaryrefslogtreecommitdiffstats
path: root/fs/dcache.c
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2011-07-17 10:52:14 -0400
committerAl Viro <viro@zeniv.linux.org.uk>2011-07-20 20:48:02 -0400
commit4513d899c418ff69052420e29e354e4c64b3ef76 (patch)
treeffe11084d28c4a3d7b4eaa745748539c2eff2fb4 /fs/dcache.c
parent6c673ab393bc18e8bff729cd04cf384d15e72a04 (diff)
switch d_add_ci() to d_splice_alias() in "found negative" case as well
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/dcache.c')
-rw-r--r--fs/dcache.c24
1 files changed, 5 insertions, 19 deletions
diff --git a/fs/dcache.c b/fs/dcache.c
index 2762804a140d..d1d6b3349ec7 100644
--- a/fs/dcache.c
+++ b/fs/dcache.c
@@ -1652,26 +1652,12 @@ struct dentry *d_add_ci(struct dentry *dentry, struct inode *inode,
1652 * Negative dentry: instantiate it unless the inode is a directory and 1652 * Negative dentry: instantiate it unless the inode is a directory and
1653 * already has a dentry. 1653 * already has a dentry.
1654 */ 1654 */
1655 spin_lock(&inode->i_lock); 1655 new = d_splice_alias(inode, found);
1656 if (!S_ISDIR(inode->i_mode) || list_empty(&inode->i_dentry)) { 1656 if (new) {
1657 __d_instantiate(found, inode); 1657 dput(found);
1658 spin_unlock(&inode->i_lock); 1658 found = new;
1659 security_d_instantiate(found, inode);
1660 return found;
1661 } 1659 }
1662 1660 return found;
1663 /*
1664 * In case a directory already has a (disconnected) entry grab a
1665 * reference to it, move it in place and use it.
1666 */
1667 new = list_entry(inode->i_dentry.next, struct dentry, d_alias);
1668 __dget(new);
1669 spin_unlock(&inode->i_lock);
1670 security_d_instantiate(found, inode);
1671 d_move(new, found);
1672 iput(inode);
1673 dput(found);
1674 return new;
1675 1661
1676err_out: 1662err_out:
1677 iput(inode); 1663 iput(inode);