From 4c282411eb8ec58fc655cd83b4bc6fc05296f3cb Mon Sep 17 00:00:00 2001 From: Su Yue Date: Tue, 30 Mar 2021 10:28:30 +0800 Subject: [PATCH] btrfs-progs: check: continue to check space cache if sb cache_generation is 0 User reported that test fsck-tests/037-freespacetree-repair fails: # TEST=037\* ./fsck-tests.sh [TEST/fsck] 037-freespacetree-repair btrfs check should have detected corruption test failed for case 037-freespacetree-repair The test tries to corrupt FST, call btrfs check readonly then repair FST using btrfs check. Above case failed at the second readonly check step. Test log said "cache and super generation don't match, space cache will be invalidated" which is printed by validate_free_space_cache(). If cache_generation of the superblock is not -1ULL, validate_free_space_cache() requires that cache_generation must equal to the superblock's generation. Otherwise, it skips the check of space cache(v1, v2) like the above case where the sb cache_generation is 0. Since kernel commit 948462294577 ("btrfs: keep sb cache_generation consistent with space_cache"), sb cache_generation will be set to be 0 once space cache v1 is disabled (nospace_cache/space_cache=v2). But progs check was forgotten to be added the 0 case support. Fix it by adding the condition if sb cache_generation is 0 in validate_free_space_cache() as the 0 case is valid now since the kernel commit mentioned above. Issue: #338 Signed-off-by: Su Yue Reviewed-by: Boris Burkov Signed-off-by: David Sterba --- check/main.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/check/main.c b/check/main.c index 74590cda..ee6cf793 100644 --- a/check/main.c +++ b/check/main.c @@ -9955,7 +9955,12 @@ static int validate_free_space_cache(struct btrfs_root *root) { int ret; + /* + * If cache generation is between 0 and -1ULL, sb generation must be + * equal to sb cache generation or the v1 space caches are outdated. + */ if (btrfs_super_cache_generation(gfs_info->super_copy) != -1ULL && + btrfs_super_cache_generation(gfs_info->super_copy) != 0 && btrfs_super_generation(gfs_info->super_copy) != btrfs_super_cache_generation(gfs_info->super_copy)) { printf(