From 8ca6a4dbbf33d398b3afa736379fd3cd56347e4a Mon Sep 17 00:00:00 2001 From: Liu Bo Date: Wed, 20 Feb 2013 14:10:23 +0000 Subject: [PATCH] --- yaml --- r: 360461 b: refs/heads/master c: fa6ac8765c48a06dfed914e8c8c3a903f9d313a0 h: refs/heads/master i: 360459: 899cf573158a28da137d7f89d1df4dc6fab49cec v: v3 --- [refs] | 2 +- trunk/fs/btrfs/inode.c | 3 ++- trunk/fs/btrfs/ioctl.c | 6 ++++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index db04087cd685..0c141def6daa 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d4edf39bd5db443151efc993dac67ec9d6b5b8c1 +refs/heads/master: fa6ac8765c48a06dfed914e8c8c3a903f9d313a0 diff --git a/trunk/fs/btrfs/inode.c b/trunk/fs/btrfs/inode.c index fce61991213c..b009fb52bd8a 100644 --- a/trunk/fs/btrfs/inode.c +++ b/trunk/fs/btrfs/inode.c @@ -7315,8 +7315,9 @@ int btrfs_drop_inode(struct inode *inode) { struct btrfs_root *root = BTRFS_I(inode)->root; + /* the snap/subvol tree is on deleting */ if (btrfs_root_refs(&root->root_item) == 0 && - !btrfs_is_free_space_inode(inode)) + root != root->fs_info->tree_root) return 1; else return generic_drop_inode(inode); diff --git a/trunk/fs/btrfs/ioctl.c b/trunk/fs/btrfs/ioctl.c index e0893036da08..2bbbed506f5b 100644 --- a/trunk/fs/btrfs/ioctl.c +++ b/trunk/fs/btrfs/ioctl.c @@ -2174,6 +2174,12 @@ static noinline int btrfs_ioctl_snap_destroy(struct file *file, shrink_dcache_sb(root->fs_info->sb); btrfs_invalidate_inodes(dest); d_delete(dentry); + + /* the last ref */ + if (dest->cache_inode) { + iput(dest->cache_inode); + dest->cache_inode = NULL; + } } out_dput: dput(dentry);