Btrfs-progs: re-search tree root if it changes
authorJosef Bacik <jbacik@fb.com>
Fri, 10 Oct 2014 20:57:12 +0000 (16:57 -0400)
committerDavid Sterba <dsterba@suse.cz>
Tue, 14 Oct 2014 08:41:51 +0000 (10:41 +0200)
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 <jbacik@fb.com>
Signed-off-by: David Sterba <dsterba@suse.cz>
cmds-check.c

index 131eba95d11650a4dc19b3f5cc5860b400c8e98f..4f400032a1230b4a21e1032c7335875c91c73021 100644 (file)
@@ -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);