mirror of https://gitee.com/openkylin/linux.git
switch d_add_ci() to d_splice_alias() in "found negative" case as well
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
6c673ab393
commit
4513d899c4
24
fs/dcache.c
24
fs/dcache.c
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue