On Tue, Oct 15, 2024 at 04:39:34PM +0100, Mark Harmstone wrote: > Adds a test for a bug we encountered on Linux 6.4 on aarch64, where a > race could mean that csums weren't getting written to the log tree, > leading to corruption when it was replayed. > > The patches to detect log this tree corruption are in btrfs-progs 6.11. > > Signed-off-by: Mark Harmstone <maharmstone@xxxxxx> > --- > This is a genericized version of the test I originally proposed as > btrfs/333. > > tests/generic/757 | 71 +++++++++++++++++++++++++++++++++++++++++++ > tests/generic/757.out | 2 ++ > 2 files changed, 73 insertions(+) > create mode 100755 tests/generic/757 > create mode 100644 tests/generic/757.out > > diff --git a/tests/generic/757 b/tests/generic/757 > new file mode 100755 > index 00000000..6ad3d01e > --- /dev/null > +++ b/tests/generic/757 > @@ -0,0 +1,71 @@ > +#! /bin/bash > +# SPDX-License-Identifier: GPL-2.0 > +# > +# FS QA Test 757 > +# > +# Test async dio with fsync to test a btrfs bug where a race meant that csums > +# weren't getting written to the log tree, causing corruptions on remount. > +# This can be seen on subpage FSes on Linux 6.4. > +# > +. ./common/preamble > +_begin_fstest auto quick metadata log recoveryloop > + > +_fixed_by_kernel_commit e917ff56c8e7 \ > + "btrfs: determine synchronous writers from bio or writeback control" > + > +fio_config=$tmp.fio > + > +. ./common/dmlogwrites > + > +_require_scratch > +_require_log_writes > + > +cat >$fio_config <<EOF > +[global] > +iodepth=128 > +direct=1 > +ioengine=libaio > +rw=randwrite > +runtime=1s > +[job0] > +rw=randwrite > +filename=$SCRATCH_MNT/file > +size=1g > +fdatasync=1 > +EOF > + > +_require_fio $fio_config > + > +cat $fio_config >> $seqres.full > + > +_log_writes_init $SCRATCH_DEV > +_log_writes_mkfs >> $seqres.full 2>&1 > +_log_writes_mark mkfs > + > +_log_writes_mount For dmlogwrites test, we generally calls _log_writes_cleanup in _cleanup, to recover the SCRATCH_DEV anyway, even if this test is killed at the middle of its testing phase, to avoid later tests failed. I'll add below code in this case, when I merge it. If there's not objection from you. _cleanup() { cd / _log_writes_cleanup rm -f $tmp.* } Thanks, Zorro > + > +$FIO_PROG $fio_config > /dev/null 2>&1 > +_log_writes_unmount > + > +_log_writes_remove > + > +prev=$(_log_writes_mark_to_entry_number mkfs) > +[ -z "$prev" ] && _fail "failed to locate entry mark 'mkfs'" > +cur=$(_log_writes_find_next_fua $prev) > +[ -z "$cur" ] && _fail "failed to locate next FUA write" > + > +while [ ! -z "$cur" ]; do > + _log_writes_replay_log_range $cur $SCRATCH_DEV >> $seqres.full > + > + _check_scratch_fs > + > + prev=$cur > + cur=$(_log_writes_find_next_fua $(($cur + 1))) > + [ -z "$cur" ] && break > +done > + > +echo "Silence is golden" > + > +# success, all done > +status=0 > +exit > diff --git a/tests/generic/757.out b/tests/generic/757.out > new file mode 100644 > index 00000000..dfbc8094 > --- /dev/null > +++ b/tests/generic/757.out > @@ -0,0 +1,2 @@ > +QA output created by 757 > +Silence is golden > -- > 2.44.2 > >