| From 727b9784b6085c99c2f836bf4fcc2848dc9cf904 Mon Sep 17 00:00:00 2001 |
| From: Jeff Mahoney <jeffm@suse.com> |
| Date: Fri, 20 Mar 2015 14:02:09 -0400 |
| Subject: btrfs: cleanup orphans while looking up default subvolume |
| |
| From: Jeff Mahoney <jeffm@suse.com> |
| |
| 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> |
| |
| --- |
| fs/btrfs/super.c | 9 +++++++++ |
| 1 file changed, 9 insertions(+) |
| |
| --- a/fs/btrfs/super.c |
| +++ b/fs/btrfs/super.c |
| @@ -901,6 +901,15 @@ find_root: |
| if (IS_ERR(new_root)) |
| return ERR_CAST(new_root); |
| |
| + 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; |