On Fri, Nov 26, 2021 at 10:26 AM Qu Wenruo <wqu@xxxxxxxx> wrote: > > Since kernel commit d4088803f511 ("btrfs: subpage: make lzo_compress_pages() > compatible"), lzo compression no longer respects the max compressed page > limit, and can cause kernel crash. > > The upstream fix is 6f019c0e0193 ("btrfs: fix a out-of-bound access in > copy_compressed_data_to_page()"). > > This patch will add such regression test for all possible compress-force > mount options, including lzo, zstd and zlib. > > And since we're here, also make sure the content of the file matches > after a mount cycle. > > Signed-off-by: Qu Wenruo <wqu@xxxxxxxx> > --- > Changelog: > v2: > - Also test zlib and zstd > - Add file content verification check > v3: > - Use $tmp.good as a known good file source > - Also make sure we didn't get short read for the good copy > --- > tests/btrfs/049 | 67 +++++++++++++++++++++++++++++++++++++++++++++ > tests/btrfs/049.out | 6 ++++ > 2 files changed, 73 insertions(+) > create mode 100755 tests/btrfs/049 > > diff --git a/tests/btrfs/049 b/tests/btrfs/049 > new file mode 100755 > index 00000000..c1f35dc9 > --- /dev/null > +++ b/tests/btrfs/049 > @@ -0,0 +1,67 @@ > +#! /bin/bash > +# SPDX-License-Identifier: GPL-2.0 > +# Copyright (C) 2021 SUSE Linux Products GmbH. All Rights Reserved. > +# > +# FS QA Test 049 > +# > +# Test if btrfs will crash when using compress-force mount option against > +# incompressible data > +# > +. ./common/preamble > +_begin_fstest auto quick compress dangerous > + > +# Override the default cleanup function. > +_cleanup() > +{ > + cd / > + rm -r -f $tmp.* > +} > + > +# Import common functions. > +. ./common/filter > + > +# real QA test starts here > + > +# Modify as appropriate. > +_supported_fs btrfs > +_require_scratch > + > +pagesize=$(get_page_size) > + > +# Read the content from urandom to a known safe location > +$XFS_IO_PROG -f -c "pwrite -i /dev/urandom 0 $pagesize" "$tmp.good" > /dev/null > + > +# Make sure we didn't get short read s/read/write/ > +if [ $(_get_filesize "$tmp.good") != "$pagesize" ]; then > + _fail "Got a short read from /dev/urandom" > +fi > + > +workload() > +{ > + local compression=$1 > + > + echo "=== Testing compress-force=$compression ===" > + _scratch_mkfs -s "$pagesize">> $seqres.full > + _scratch_mount -o compress-force="$compression" > + cp "$tmp.good" "$SCRATCH_MNT/$compression" > + > + # When unpatched, compress-force=lzo would crash at data writeback > + _scratch_cycle_mount > + > + # Make sure the content matches > + if [ "$(_md5_checksum $tmp.good)" != \ > + "$(_md5_checksum $SCRATCH_MNT/$compression)" ]; then > + _fail "Content of '$SCRATCH_MNT/file' mismatch with known good copy" We could just 'echo' instead of '_fail' and let the test continue with the remaining compression algorithms. That's usually the approach preferred for fstests, _fail is for cases where the test can't proceed and must stop immediately. Anyway, those are two minor things that maybe Eryu can fixup when he picks the patch. So I won't ask you to send yet another version. Thanks! Reviewed-by: Filipe Manana <fdmanana@xxxxxxxx> > + else > + echo "OK" > + fi > + _scratch_unmount > +} > + > +workload lzo > +workload zstd > +workload zlib > + > +# success, all done > +status=0 > +exit > diff --git a/tests/btrfs/049.out b/tests/btrfs/049.out > index cb0061b3..41bffeaa 100644 > --- a/tests/btrfs/049.out > +++ b/tests/btrfs/049.out > @@ -1 +1,7 @@ > QA output created by 049 > +=== Testing compress-force=lzo === > +OK > +=== Testing compress-force=zstd === > +OK > +=== Testing compress-force=zlib === > +OK > -- > 2.34.0 > -- Filipe David Manana, “Whether you think you can, or you think you can't — you're right.”