btrfs-progs: check: Fix assert when using lowmem on fs with tree reloc tree
authorQu Wenruo <quwenruo@cn.fujitsu.com>
Mon, 5 Dec 2016 09:07:53 +0000 (17:07 +0800)
committerDavid Sterba <dsterba@suse.com>
Wed, 14 Dec 2016 14:21:26 +0000 (15:21 +0100)
When using lowmem mode, btrfs check will report ASSERT for calling
btrfs_read_fs_root() on tree reloc tree.

Fix it by checking objectid and call btrfs_read_fs_root_no_cache() for
tree reloc tree.

Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com>
Signed-off-by: David Sterba <dsterba@suse.com>
cmds-check.c

index 34209b0a1e4200588cc2f2ee9e4e5e077df28987..2f7b1a8c27c1a0cd6a75eba6400bd42cb832fd32 100644 (file)
@@ -11387,7 +11387,11 @@ static int check_chunks_and_extents_v2(struct btrfs_root *root)
                        goto next;
                key.offset = (u64)-1;
 
-               cur_root = btrfs_read_fs_root(root->fs_info, &key);
+               if (key.objectid == BTRFS_TREE_RELOC_OBJECTID)
+                       cur_root = btrfs_read_fs_root_no_cache(root->fs_info,
+                                       &key);
+               else
+                       cur_root = btrfs_read_fs_root(root->fs_info, &key);
                if (IS_ERR(cur_root) || !cur_root) {
                        error("failed to read tree: %lld", key.objectid);
                        goto next;
@@ -11396,6 +11400,8 @@ static int check_chunks_and_extents_v2(struct btrfs_root *root)
                ret = traverse_tree_block(cur_root, cur_root->node);
                err |= ret;
 
+               if (key.objectid == BTRFS_TREE_RELOC_OBJECTID)
+                       btrfs_free_fs_root(cur_root);
 next:
                ret = btrfs_next_item(root1, &path);
                if (ret)