diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2011-07-17 10:52:14 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2011-07-20 20:48:02 -0400 |
commit | 4513d899c418ff69052420e29e354e4c64b3ef76 (patch) | |
tree | ffe11084d28c4a3d7b4eaa745748539c2eff2fb4 /fs/dcache.c | |
parent | 6c673ab393bc18e8bff729cd04cf384d15e72a04 (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.c | 24 |
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 | ||
1676 | err_out: | 1662 | err_out: |
1677 | iput(inode); | 1663 | iput(inode); |