Skip to content

Commit

Permalink
Btrfs: remove negative dentry when deleting subvolumne
Browse files Browse the repository at this point in the history
The use of btrfs_dentry_delete is removing dentries from the
dcache when deleting subvolumne. btrfs_dentry_delete ignores
negative dentries. This is incorrect since if we don't remove
the negative dentry, its parent dentry can't be removed.

Signed-off-by: Yan Zheng <zheng.yan@oracle.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
  • Loading branch information
Yan, Zheng authored and Chris Mason committed Oct 9, 2009
1 parent ff782e0 commit efefb14
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 5 deletions.
12 changes: 7 additions & 5 deletions fs/btrfs/inode.c
Original file line number Diff line number Diff line change
Expand Up @@ -3629,12 +3629,14 @@ static int btrfs_dentry_delete(struct dentry *dentry)
{
struct btrfs_root *root;

if (!dentry->d_inode)
return 0;
if (!dentry->d_inode && !IS_ROOT(dentry))
dentry = dentry->d_parent;

root = BTRFS_I(dentry->d_inode)->root;
if (btrfs_root_refs(&root->root_item) == 0)
return 1;
if (dentry->d_inode) {
root = BTRFS_I(dentry->d_inode)->root;
if (btrfs_root_refs(&root->root_item) == 0)
return 1;
}
return 0;
}

Expand Down
1 change: 1 addition & 0 deletions fs/btrfs/ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -830,6 +830,7 @@ static noinline int btrfs_ioctl_snap_destroy(struct file *file,
out_unlock:
mutex_unlock(&inode->i_mutex);
if (!err) {
shrink_dcache_sb(root->fs_info->sb);
btrfs_invalidate_inodes(dest);
d_delete(dentry);
}
Expand Down

0 comments on commit efefb14

Please sign in to comment.