btrfs-progs: check: handle the block group tree properly
We need to make sure we process the block group root, and mark its blocks as used for the free space tree checking. Signed-off-by: Josef Bacik <josef@toxicpanda.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
37d05e9b1e
commit
c36d8ea235
27
check/main.c
27
check/main.c
|
@ -8947,6 +8947,18 @@ out:
|
|||
return ret;
|
||||
}
|
||||
|
||||
static int load_super_root(struct list_head *head, struct btrfs_root *root)
|
||||
{
|
||||
u8 level;
|
||||
|
||||
if (!root)
|
||||
return 0;
|
||||
|
||||
level = btrfs_header_level(root->node);
|
||||
return add_root_item_to_list(head, root->root_key.objectid,
|
||||
root->node->start, 0, level, 0, NULL);
|
||||
}
|
||||
|
||||
static int check_chunks_and_extents(void)
|
||||
{
|
||||
struct rb_root dev_cache;
|
||||
|
@ -8965,9 +8977,7 @@ static int check_chunks_and_extents(void)
|
|||
int bits_nr;
|
||||
struct list_head dropping_trees;
|
||||
struct list_head normal_trees;
|
||||
struct btrfs_root *root1;
|
||||
struct btrfs_root *root;
|
||||
u8 level;
|
||||
|
||||
root = gfs_info->fs_root;
|
||||
dev_cache = RB_ROOT;
|
||||
|
@ -9000,16 +9010,13 @@ static int check_chunks_and_extents(void)
|
|||
}
|
||||
|
||||
again:
|
||||
root1 = gfs_info->tree_root;
|
||||
level = btrfs_header_level(root1->node);
|
||||
ret = add_root_item_to_list(&normal_trees, root1->root_key.objectid,
|
||||
root1->node->start, 0, level, 0, NULL);
|
||||
ret = load_super_root(&normal_trees, gfs_info->tree_root);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
root1 = gfs_info->chunk_root;
|
||||
level = btrfs_header_level(root1->node);
|
||||
ret = add_root_item_to_list(&normal_trees, root1->root_key.objectid,
|
||||
root1->node->start, 0, level, 0, NULL);
|
||||
ret = load_super_root(&normal_trees, gfs_info->chunk_root);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
ret = load_super_root(&normal_trees, gfs_info->block_group_root);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
|
|
|
@ -149,6 +149,9 @@ int btrfs_mark_used_tree_blocks(struct btrfs_fs_info *fs_info,
|
|||
ret = traverse_tree_blocks(tree, fs_info->chunk_root->node, 0);
|
||||
if (!ret)
|
||||
ret = traverse_tree_blocks(tree, fs_info->tree_root->node, 1);
|
||||
if (!ret && fs_info->block_group_root)
|
||||
ret = traverse_tree_blocks(tree,
|
||||
fs_info->block_group_root->node, 0);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue