|
@@ -2676,9 +2676,14 @@ struct dentry *d_splice_alias(struct inode *inode, struct dentry *dentry)
|
|
new = __d_find_alias(inode, 1);
|
|
new = __d_find_alias(inode, 1);
|
|
if (new) {
|
|
if (new) {
|
|
BUG_ON(!(new->d_flags & DCACHE_DISCONNECTED));
|
|
BUG_ON(!(new->d_flags & DCACHE_DISCONNECTED));
|
|
|
|
+ write_seqlock(&rename_lock);
|
|
|
|
+ __d_materialise_dentry(dentry, new);
|
|
|
|
+ write_sequnlock(&rename_lock);
|
|
|
|
+ __d_drop(new);
|
|
|
|
+ _d_rehash(new);
|
|
|
|
+ spin_unlock(&new->d_lock);
|
|
spin_unlock(&inode->i_lock);
|
|
spin_unlock(&inode->i_lock);
|
|
security_d_instantiate(new, inode);
|
|
security_d_instantiate(new, inode);
|
|
- d_move(new, dentry);
|
|
|
|
iput(inode);
|
|
iput(inode);
|
|
} else {
|
|
} else {
|
|
/* already taking inode->i_lock, so d_add() by hand */
|
|
/* already taking inode->i_lock, so d_add() by hand */
|