Btrfs: remove negative dentry when deleting subvolumne
authorYan, Zheng <zheng.yan@oracle.com>
Fri, 9 Oct 2009 13:25:16 +0000 (09:25 -0400)
committerChris Mason <chris.mason@oracle.com>
Fri, 9 Oct 2009 13:25:16 +0000 (09:25 -0400)
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>
fs/btrfs/inode.c
fs/btrfs/ioctl.c

index ccc4f1121210a255182ab73280f1e200b7b50999..d3585cb6483c5da395a3c300d4cbfae9afa5c7e1 100644 (file)
@@ -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;
 }
 
index 9a780c8d0ac83df7bc2444d90830e3214649e8a4..e8795becad4cda9ce6e97ce87c77edc62f73c9a0 100644 (file)
@@ -830,6 +830,7 @@ out_up_write:
 out_unlock:
        mutex_unlock(&inode->i_mutex);
        if (!err) {
+               shrink_dcache_sb(root->fs_info->sb);
                btrfs_invalidate_inodes(dest);
                d_delete(dentry);
        }