From 994ce2672dbf89fe5a7a18557b15449f0f83af65 Mon Sep 17 00:00:00 2001 From: Josef Bacik Date: Fri, 10 Oct 2014 16:57:12 -0400 Subject: Btrfs-progs: re-search tree root if it changes If we change something while scanning fs-roots we need to redo our search so that we get valid root items and have valid root cache. Thanks, Signed-off-by: Josef Bacik Signed-off-by: David Sterba --- cmds-check.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'cmds-check.c') diff --git a/cmds-check.c b/cmds-check.c index 131eba95..4f400032 100644 --- a/cmds-check.c +++ b/cmds-check.c @@ -2237,7 +2237,7 @@ static int check_fs_roots(struct btrfs_root *root, struct btrfs_path path; struct btrfs_key key; struct walk_control wc; - struct extent_buffer *leaf; + struct extent_buffer *leaf, *tree_node; struct btrfs_root *tmp_root; struct btrfs_root *tree_root = root->fs_info->tree_root; int ret; @@ -2253,6 +2253,7 @@ static int check_fs_roots(struct btrfs_root *root, cache_tree_init(&wc.shared); btrfs_init_path(&path); +again: key.offset = 0; key.objectid = 0; key.type = BTRFS_ROOT_ITEM_KEY; @@ -2261,7 +2262,13 @@ static int check_fs_roots(struct btrfs_root *root, err = 1; goto out; } + tree_node = tree_root->node; while (1) { + if (tree_node != tree_root->node) { + free_root_recs_tree(root_cache); + btrfs_release_path(&path); + goto again; + } leaf = path.nodes[0]; if (path.slots[0] >= btrfs_header_nritems(leaf)) { ret = btrfs_next_leaf(tree_root, &path); -- cgit v1.2.3