On Mon, Nov 07, 2022 at 07:53:48AM +0800, Qu Wenruo wrote: > 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 ++ Hi, btrfs/278 has been taken, please rebase on the latest for-next branch, or use a big enough number. > 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. So 786672e9e1a3 is the commit which brought in this regression issue? Is there a fix patch or commit by reviewed? > +# > +. ./common/preamble > +_begin_fstest auto quick scrub > + > +# Import common functions. > +. ./common/filter > +. ./common/btrfs The common/btrfs is imported automatically, so don't need to import it at here. And I think this case doesn't use any filter, if so, the common/filter isn't needed either. > + > +# real QA test starts here > + > +# Modify as appropriate. This comment can be removed. > +_supported_fs btrfs > + > +# Need to use 4K as sector size > +_require_btrfs_support_sectorsize 4096 > +_require_scratch > + > +_scratch_mkfs >> $seqres.full Just check with you, do you need "-s 4k" so make sure sector size is 4k (even if 4k is supported)? Thanks, Zorro > +_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 >