summaryrefslogtreecommitdiff
path: root/fs
diff options
context:
space:
mode:
authorJeff Mahoney <jeffm@suse.com>2015-03-20 14:02:09 -0400
committerChanho Park <chanho61.park@samsung.com>2015-12-22 13:45:51 +0900
commiteb5e1443aec61e0f5f3cc51cc73e6826d1b93fe0 (patch)
tree6d0fe16de8fb45e300503fbf1e5f976d013cf7dc /fs
parentdc80a4e540862fac3ea54fb7738686ec9f5b741a (diff)
downloadlinux-3.10-artik-eb5e1443aec61e0f5f3cc51cc73e6826d1b93fe0.tar.gz
linux-3.10-artik-eb5e1443aec61e0f5f3cc51cc73e6826d1b93fe0.tar.bz2
linux-3.10-artik-eb5e1443aec61e0f5f3cc51cc73e6826d1b93fe0.zip
btrfs: cleanup orphans while looking up default subvolume
commit 727b9784b6085c99c2f836bf4fcc2848dc9cf904 upstream. Orphans in the fs tree are cleaned up via open_ctree and subvolume orphans are cleaned via btrfs_lookup_dentry -- except when a default subvolume is in use. The name for the default subvolume uses a manual lookup that doesn't trigger orphan cleanup and needs to trigger it manually as well. This doesn't apply to the remount case since the subvolumes are cleaned up by walking the root radix tree. Signed-off-by: Jeff Mahoney <jeffm@suse.com> Reviewed-by: David Sterba <dsterba@suse.cz> Signed-off-by: Chris Mason <clm@fb.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs')
-rw-r--r--fs/btrfs/super.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index f0857e092a3..68891ff7e5d 100644
--- a/fs/btrfs/super.c
+++ b/fs/btrfs/super.c
@@ -779,6 +779,15 @@ find_root:
if (btrfs_root_refs(&new_root->root_item) == 0)
return ERR_PTR(-ENOENT);
+ if (!(sb->s_flags & MS_RDONLY)) {
+ int ret;
+ down_read(&fs_info->cleanup_work_sem);
+ ret = btrfs_orphan_cleanup(new_root);
+ up_read(&fs_info->cleanup_work_sem);
+ if (ret)
+ return ERR_PTR(ret);
+ }
+
dir_id = btrfs_root_dirid(&new_root->root_item);
setup_root:
location.objectid = dir_id;