Message ID | 20210330022830.491831-1-l@damenly.su (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2] btrfs-progs: check: continue to check space cache if sb cache_generation is 0 | expand |
On Tue, Mar 30, 2021 at 10:28:30AM +0800, Su Yue wrote: > 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. > > Link: https://github.com/kdave/btrfs-progs/issues/338 > Signed-off-by: Su Yue <l@damenly.su> > Reviewed-by: Boris Burkov <boris@bur.io> Added to devel, thanks.
diff --git a/check/main.c b/check/main.c index a5d2e4ee2dd6..15aa29335240 100644 --- a/check/main.c +++ b/check/main.c @@ -9953,7 +9953,12 @@ static int validate_free_space_cache(struct btrfs_root *root) { int ret; + /* + * If cache generation is between 0 and -1ULL, sb generation must 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(