[PATCH v2 09/12] btrfs-progs: make check detect and fix problems with super_bytes_used
From: Josef Bacik <josef@toxicpanda.com>
Date: 2021-08-18 21:33:52
Subsystem:
the rest · Maintainer:
Linus Torvalds
We do not detect problems with our bytes_used counter in the super block. Thankfully the same method to fix block groups is used to re-set the value in the super block, so simply add some extra code to validate the bytes_used field and then piggy back on the repair code for block groups. Signed-off-by: Josef Bacik <josef@toxicpanda.com> --- check/main.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
diff --git a/check/main.c b/check/main.c
index af9e0ff3..b1b1b866 100644
--- a/check/main.c
+++ b/check/main.c@@ -8663,12 +8663,14 @@ static int check_block_groups(struct block_group_tree *bg_cache) struct btrfs_trans_handle *trans; struct cache_extent *item; struct block_group_record *bg_rec; + u64 used = 0; int ret = 0; for (item = first_cache_extent(&bg_cache->tree); item; item = next_cache_extent(item)) { bg_rec = container_of(item, struct block_group_record, cache); + used += bg_rec->actual_used; if (bg_rec->disk_used == bg_rec->actual_used) continue; fprintf(stderr,
@@ -8678,6 +8680,19 @@ static int check_block_groups(struct block_group_tree *bg_cache) ret = -1; } + /* + * We check the super bytes_used here because it's the sum of all block + * groups used, and the repair actually happens in + * btrfs_fix_block_accounting, so we can kill both birds with the same + * stone here. + */ + if (used != btrfs_super_bytes_used(gfs_info->super_copy)) { + fprintf(stderr, + "super bytes used %llu mismatches actual used %llu\n", + btrfs_super_bytes_used(gfs_info->super_copy), used); + ret = -1; + } + if (!repair || !ret) return ret;
--
2.26.3