From: Mark Harmstone Date: Tue, 15 Oct 2024 15:39:34 +0000 (+0100) Subject: generic: add test for missing btrfs csums in log when doing async on subpage vol X-Git-Tag: v2024.10.28~10 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=cf97fa373d61e14d3d661fe367a3449996893867;p=xfstests-dev.git generic: add test for missing btrfs csums in log when doing async on subpage vol 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 Reviewed-by: Filipe Manana Reviewed-by: Zorro Lang Signed-off-by: Zorro Lang --- diff --git a/tests/generic/757 b/tests/generic/757 new file mode 100755 index 00000000..0ff5a8ac --- /dev/null +++ b/tests/generic/757 @@ -0,0 +1,80 @@ +#! /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 aio + +_cleanup() +{ + cd / + _log_writes_cleanup &> /dev/null + rm -f $tmp.* +} + + +[ $FSTYP = "btrfs" ] && _fixed_by_kernel_commit e917ff56c8e7 \ + "btrfs: determine synchronous writers from bio or writeback control" + +fio_config=$tmp.fio + +. ./common/dmlogwrites + +_require_scratch +_require_aiodio +_require_log_writes + +cat >$fio_config <> $seqres.full + +_log_writes_init $SCRATCH_DEV +_log_writes_mkfs >> $seqres.full 2>&1 +_log_writes_mark mkfs + +_log_writes_mount + +$FIO_PROG $fio_config > $seqres.full 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