From: Darrick J. Wong <djwong@xxxxxxxxxx> The AGFL fuzz tests first fuzz the entire block header, and second extract flfirst from the AGF header to start a second round of targeted fuzzing of live bno pointers in the AGFL. However, flfirst (and the AGFL field detection at the start of the second round of fuzzing) are detected after we've already been fuzz testing, which means that the AGFL might be garbage because repair failed or was not called. If this is the case, test will fail because the _scratch_xfs_db -c 'agf 0' -c 'p flfirst' call emits things like this: Fuzz AGFL flfirst Metadata corruption detected at 0x55f4f789fbc0, xfs_agfl block 0x3/0x200 Metadata corruption detected at 0x55b7356e0bc0, xfs_agfl block 0x3/0x200 Done fuzzing AGFL flfirst Fix this by restoring the scratch fs before probing flfirst and starting the second round of fuzzing. Signed-off-by: Darrick J. Wong <djwong@xxxxxxxxxx> --- tests/xfs/354 | 7 ++++++- tests/xfs/355 | 7 ++++++- tests/xfs/455 | 7 ++++++- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/tests/xfs/354 b/tests/xfs/354 index b10ce1d68f..8abf527ea6 100755 --- a/tests/xfs/354 +++ b/tests/xfs/354 @@ -28,8 +28,13 @@ echo "Fuzz AGFL" _scratch_xfs_fuzz_metadata '' 'offline' 'agfl 0' >> $seqres.full echo "Done fuzzing AGFL" -echo "Fuzz AGFL flfirst" +# Restore a correct copy of the filesystem before we start the second round of +# fuzzing. This avoids corruption errors from xfs_db when we probe for flfirst +# in the AGF and later when _scratch_xfs_fuzz_metadata probes the AGFL fields. +__scratch_xfs_fuzz_mdrestore flfirst=$(_scratch_xfs_db -c 'agf 0' -c 'p flfirst' | sed -e 's/flfirst = //g') + +echo "Fuzz AGFL flfirst" SCRATCH_XFS_LIST_METADATA_FIELDS="bno[${flfirst}]" _scratch_xfs_fuzz_metadata '' 'offline' 'agfl 0' >> $seqres.full echo "Done fuzzing AGFL flfirst" diff --git a/tests/xfs/355 b/tests/xfs/355 index 530c9a970a..2d552a591c 100755 --- a/tests/xfs/355 +++ b/tests/xfs/355 @@ -28,8 +28,13 @@ echo "Fuzz AGFL" _scratch_xfs_fuzz_metadata '' 'online' 'agfl 0' >> $seqres.full echo "Done fuzzing AGFL" -echo "Fuzz AGFL flfirst" +# Restore a correct copy of the filesystem before we start the second round of +# fuzzing. This avoids corruption errors from xfs_db when we probe for flfirst +# in the AGF and later when _scratch_xfs_fuzz_metadata probes the AGFL fields. +__scratch_xfs_fuzz_mdrestore flfirst=$(_scratch_xfs_db -c 'agf 0' -c 'p flfirst' | sed -e 's/flfirst = //g') + +echo "Fuzz AGFL flfirst" SCRATCH_XFS_LIST_METADATA_FIELDS="bno[${flfirst}]" _scratch_xfs_fuzz_metadata '' 'online' 'agfl 0' >> $seqres.full echo "Done fuzzing AGFL flfirst" diff --git a/tests/xfs/455 b/tests/xfs/455 index 96820bc3b8..9f06c71fa2 100755 --- a/tests/xfs/455 +++ b/tests/xfs/455 @@ -29,8 +29,13 @@ echo "Fuzz AGFL" _scratch_xfs_fuzz_metadata '' 'none' 'agfl 0' >> $seqres.full echo "Done fuzzing AGFL" -echo "Fuzz AGFL flfirst" +# Restore a correct copy of the filesystem before we start the second round of +# fuzzing. This avoids corruption errors from xfs_db when we probe for flfirst +# in the AGF and later when _scratch_xfs_fuzz_metadata probes the AGFL fields. +__scratch_xfs_fuzz_mdrestore flfirst=$(_scratch_xfs_db -c 'agf 0' -c 'p flfirst' | sed -e 's/flfirst = //g') + +echo "Fuzz AGFL flfirst" SCRATCH_XFS_LIST_METADATA_FIELDS="bno[${flfirst}]" _scratch_xfs_fuzz_metadata '' 'none' 'agfl 0' >> $seqres.full echo "Done fuzzing AGFL flfirst"