|
@@ -3852,11 +3852,11 @@ int vfs_rmdir(struct inode *dir, struct dentry *dentry)
|
|
|
if (error)
|
|
|
goto out;
|
|
|
|
|
|
- shrink_dcache_parent(dentry);
|
|
|
error = dir->i_op->rmdir(dir, dentry);
|
|
|
if (error)
|
|
|
goto out;
|
|
|
|
|
|
+ shrink_dcache_parent(dentry);
|
|
|
dentry->d_inode->i_flags |= S_DEAD;
|
|
|
dont_mount(dentry);
|
|
|
detach_mounts(dentry);
|
|
@@ -4439,8 +4439,6 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|
|
old_dir->i_nlink >= max_links)
|
|
|
goto out;
|
|
|
}
|
|
|
- if (is_dir && !(flags & RENAME_EXCHANGE) && target)
|
|
|
- shrink_dcache_parent(new_dentry);
|
|
|
if (!is_dir) {
|
|
|
error = try_break_deleg(source, delegated_inode);
|
|
|
if (error)
|
|
@@ -4457,8 +4455,10 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
|
|
goto out;
|
|
|
|
|
|
if (!(flags & RENAME_EXCHANGE) && target) {
|
|
|
- if (is_dir)
|
|
|
+ if (is_dir) {
|
|
|
+ shrink_dcache_parent(new_dentry);
|
|
|
target->i_flags |= S_DEAD;
|
|
|
+ }
|
|
|
dont_mount(new_dentry);
|
|
|
detach_mounts(new_dentry);
|
|
|
}
|