There is a regression in v6.1-rc kernel, which will prevent btrfs scrub from detecting corruption (thus no repair either). The regression is caused by commit 786672e9e1a3 ("btrfs: scrub: use larger block size for data extent scrub"). The new test case will: - Create a data extent with 2 sectors - Corrupt the second sector of above data extent - Scrub to make sure we detect the corruption Signed-off-by: Qu Wenruo <wqu@xxxxxxxx> --- tests/btrfs/278 | 66 +++++++++++++++++++++++++++++++++++++++++++++ tests/btrfs/278.out | 2 ++ 2 files changed, 68 insertions(+) create mode 100755 tests/btrfs/278 create mode 100644 tests/btrfs/278.out diff --git a/tests/btrfs/278 b/tests/btrfs/278 new file mode 100755 index 00000000..ebbf207a --- /dev/null +++ b/tests/btrfs/278 @@ -0,0 +1,66 @@ +#! /bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Copyright (C) 2022 SUSE Linux Products GmbH. All Rights Reserved. +# +# FS QA Test 278 +# +# A regression test for offending commit 786672e9e1a3 ("btrfs: scrub: use +# larger block size for data extent scrub"), which makes btrfs scrub unable +# to detect corruption if it's not the first sector of an data extent. +# +. ./common/preamble +_begin_fstest auto quick scrub + +# Import common functions. +. ./common/filter +. ./common/btrfs + +# real QA test starts here + +# Modify as appropriate. +_supported_fs btrfs + +# Need to use 4K as sector size +_require_btrfs_support_sectorsize 4096 +_require_scratch + +_scratch_mkfs >> $seqres.full +_scratch_mount + +# Create a data extent with 2 sectors +$XFS_IO_PROG -fc "pwrite -S 0xff 0 8k" $SCRATCH_MNT/foobar >> $seqres.full +sync + +first_logical=$(_btrfs_get_first_logical $SCRATCH_MNT/foobar) +echo "logical of the first sector: $first_logical" >> $seqres.full + +second_logical=$(( $first_logical + 4096 )) +echo "logical of the second sector: $second_logical" >> $seqres.full + +second_physical=$(_btrfs_get_physical $second_logical 1) +echo "physical of the second sector: $second_physical" >> $seqres.full + +second_dev=$(_btrfs_get_device_path $second_logical 1) +echo "device of the second sector: $second_dev" >> $seqres.full + +_scratch_unmount + +# Corrupt the second sector of the data extent. +$XFS_IO_PROG -c "pwrite -S 0x00 $second_physical 4k" $second_dev >> $seqres.full +_scratch_mount + +# Redirect stderr and stdout, as if btrfs detected the unrepairable corruption, +# it will output an error message. +$BTRFS_UTIL_PROG scrub start -B $SCRATCH_MNT &> $tmp.output +cat $tmp.output >> $seqres.full +_scratch_unmount + +if ! grep -q "csum=1" $tmp.output; then + echo "Scrub failed to detect corruption" +fi + +echo "Silence is golden" + +# success, all done +status=0 +exit diff --git a/tests/btrfs/278.out b/tests/btrfs/278.out new file mode 100644 index 00000000..b4c4a95d --- /dev/null +++ b/tests/btrfs/278.out @@ -0,0 +1,2 @@ +QA output created by 278 +Silence is golden -- 2.38.0