On Thu, Aug 28, 2025 at 12:30:10AM +0800, Zorro Lang wrote: > On Wed, Aug 27, 2025 at 11:12:50AM +0930, Qu Wenruo wrote: > > The new test case is a regression test related to the block size < page > > size handling of compressed read. > > > > The test case will only be triggered with 64K page size and 4K btrfs > > block size. > > I'm using aarch64 with 64K page size to trigger the regression. > > > > The test case will create the following file layout: > > > > base: > > [0, 64K): Single compressed data extent at bytenr X. > > > > new: > > [0, 32K): Reflinked from base [32K, 64K) > > [32K, 60K): Reflinked from base [0, 28K) > > [60K, 64K): New 4K write > > > > The range [0, 32K) and [32K, 64K) are pointing to the same compressed > > data. > > > > The last 4K write is a special workaround. It is a block aligned > > write, thus it will create the folio but without reading out the > > remaing part. > > > > This is to avoid readahead path, which has the proper fix. > > We want single folio read without readahead. > > > > Then output the file "new" just after the last 4K write, then cycle > > mount and output the content again. > > > > For patched kernel, or with 4K page sized system, the test will pass, > > the resulted content will not change during mount cycles. > > > > For unpatched kernel and with 64K page size, the test will fail, the > > content after the write will be incorrect (the range [32K, 60K) will be > > zero), but after a mount cycle the content is correct again. > > > > Signed-off-by: Qu Wenruo <wqu@xxxxxxxx> > > --- > > Changelog: > > v3: > > - Fix the golden output which is generated by an unpatched kernel > > > > v2: > > - Remove the unnecessary sync inherited from the kernel fix > > - Use _hexdump instead of open-coded od dumps > > - Use the correct 'clone' group instead of 'reflink' > > - Minor grammar fixes > > All thanks to Filipe. > > --- > > Hi Qu, > > This patch is good to me, just a few picky points below: > > > tests/btrfs/337 | 55 +++++++++++++++++++++++++++++++++++++++++++++ > > tests/btrfs/337.out | 23 +++++++++++++++++++ > > 2 files changed, 78 insertions(+) > > create mode 100755 tests/btrfs/337 > > create mode 100644 tests/btrfs/337.out > > > > diff --git a/tests/btrfs/337 b/tests/btrfs/337 > > new file mode 100755 > > index 00000000..9c409e4d > > --- /dev/null > > +++ b/tests/btrfs/337 > > @@ -0,0 +1,55 @@ > > +#! /bin/bash > > +# SPDX-License-Identifier: GPL-2.0 > > +# Copyright (c) 2025 SUSE Linux Products GmbH. All Rights Reserved. > > +# > > +# FS QA Test 337 > > +# > > +# Test compressed read with shared extents, especially for bs < ps cases. > > +# > > +. ./common/preamble > > +_begin_fstest auto quick compress clone > > + > > +_fixed_by_kernel_commit xxxxxxxxxxxx \ > > + "btrfs: fix corruption reading compressed range when block size is smaller than page size" > > + > > +. ./common/filter > > Looks like you didn't use any helpers of common/filter in this case :) > > > +. ./common/reflink > > + > > +_require_btrfs_support_sectorsize 4096 > > +_require_scratch_reflink > > + > > +# The layout used in the test case is all 4K based, and can only be reproduced > > +# with page size larger than 4K. > > +_scratch_mkfs -s 4k >> $seqres.full > > || _fail "...." > > Fail the test if the mkfs fails. > > > +_scratch_mount "-o compress" > > + > > +# Create the reflink source, which must be a compressed extent. > > +$XFS_IO_PROG -f -c "pwrite -S 0x0f 0 32K" \ > > + -c "pwrite -S 0xf0 32K 32K" \ > > + $SCRATCH_MNT/base >> $seqres.full > > +echo "Reflink source:" > > +_hexdump $SCRATCH_MNT/base > > + > > +# Create the reflink dest, which reverses the order of the two 32K ranges. > > +# > > +# And do a further aligned write into the last block. > > +# This write is to make sure the folio exists in filemap, so that we won't go > > +# through the readahead path (which has the proper handling) for the folio. > > +$XFS_IO_PROG -f -c "reflink $SCRATCH_MNT/base 32K 0 32K" \ > > + -c "reflink $SCRATCH_MNT/base 0 32K 32K" \ > > + -c "pwrite 60K 4K" $SCRATCH_MNT/new >> $seqres.full > > + > > +# This will result an incorrect output for unpatched kernel. > > +# The range [32K, 60K) will be zero due to incorrectly merged compressed read. > > +echo "Before mount cycle:" > > +_hexdump $SCRATCH_MNT/new > > + > > +_scratch_cycle_mount > > + > > +# This will go through readahead path, which has the proper handling, thus give > > +# the correct content. > > +echo "After mount cycle:" > > +_hexdump $SCRATCH_MNT/new > > + > > +status=0 > ^^^ > "_exit 0" does "status=0", so you can save this line. > > Others looks good to me, with above changes: > > Reviewed-by: Zorro Lang <zlang@xxxxxxxxxx> These're simple enough changes, I've helped to change them, you don't need to send one more version (except you hope to change more, please tell me :) Thanks, Zorro > > > +_exit 0 > > diff --git a/tests/btrfs/337.out b/tests/btrfs/337.out > > new file mode 100644 > > index 00000000..cecbbbcf > > --- /dev/null > > +++ b/tests/btrfs/337.out > > @@ -0,0 +1,23 @@ > > +QA output created by 337 > > +Reflink source: > > +000000 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f >................< > > +* > > +008000 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 >................< > > +* > > +010000 > > +Before mount cycle: > > +000000 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 >................< > > +* > > +008000 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f >................< > > +* > > +00f000 cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd >................< > > +* > > +010000 > > +After mount cycle: > > +000000 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 f0 >................< > > +* > > +008000 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f 0f >................< > > +* > > +00f000 cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd cd >................< > > +* > > +010000 > > -- > > 2.49.0 > > > >