btrfs: cleanup orphans while looking up default subvolume
diff mbox

Message ID 550C60A1.9000708@suse.com
State Accepted
Headers show

Commit Message

Jeff Mahoney March 20, 2015, 6:02 p.m. UTC
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>
---
 fs/btrfs/super.c | 9 +++++++++
 1 file changed, 9 insertions(+)

Comments

David Sterba March 23, 2015, 11:51 p.m. UTC | #1
On Fri, Mar 20, 2015 at 02:02:09PM -0400, Jeff Mahoney wrote:
> 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>
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch
diff mbox

diff --git a/fs/btrfs/super.c b/fs/btrfs/super.c
index 05fef19..e477ed6 100644
--- 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;