[PATCH 14/22] btrfs-progs: check: handle the block group tree properly
From: Josef Bacik <josef@toxicpanda.com>
Date: 2021-11-05 20:41:13
Subsystem:
the rest · Maintainer:
Linus Torvalds
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> --- check/main.c | 27 +++++++++++++++++---------- common/repair.c | 3 +++ 2 files changed, 20 insertions(+), 10 deletions(-)
diff --git a/check/main.c b/check/main.c
index d2d27694..c28fa2f3 100644
--- a/check/main.c
+++ b/check/main.c@@ -8908,6 +8908,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;
@@ -8926,9 +8938,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;
@@ -8961,16 +8971,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; + ret = load_super_root(&normal_trees, gfs_info->chunk_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->block_group_root); if (ret < 0) goto out;
diff --git a/common/repair.c b/common/repair.c
index 0feaf6c3..3e35ad44 100644
--- a/common/repair.c
+++ b/common/repair.c@@ -150,6 +150,9 @@ int btrfs_mark_used_tree_blocks(struct btrfs_fs_info *fs_info, if (!ret) ret = traverse_tree_blocks(fs_info, tree, fs_info->tree_root->node, 1); + if (!ret && fs_info->block_group_root) + ret = traverse_tree_blocks(fs_info, tree, + fs_info->block_group_root->node, 0); return ret; }
--
2.26.3