From: Zhang Boyang <zhangboyang.id@gmail.com>
To: linux-btrfs@vger.kernel.org
Cc: David Sterba <dsterba@suse.com>, Qu Wenruo <wqu@suse.com>,
Filipe Manana <fdmanana@kernel.org>,
Zhang Boyang <zhangboyang.id@gmail.com>
Subject: [PATCH 1/2] fstests: btrfs/348: test ambiguous generation handling on raid1 profile
Date: Wed, 15 Jul 2026 00:10:43 +0800 [thread overview]
Message-ID: <20260714161044.7330-2-zhangboyang.id@gmail.com> (raw)
In-Reply-To: <20260714161044.7330-1-zhangboyang.id@gmail.com>
This test simulates a ambiguous generation which can be caused by, for
example, two successive power failures.
Please note this is not related to degraded mounts or nodatacow.
Unfortunately, there is currently no fix for this problem.
Signed-off-by: Zhang Boyang <zhangboyang.id@gmail.com>
---
tests/btrfs/348 | 79 +++++++++++++++++++++++++
tests/btrfs/348.out | 141 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 220 insertions(+)
create mode 100755 tests/btrfs/348
create mode 100644 tests/btrfs/348.out
diff --git a/tests/btrfs/348 b/tests/btrfs/348
new file mode 100755
index 00000000..3fcaf744
--- /dev/null
+++ b/tests/btrfs/348
@@ -0,0 +1,79 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2026 Zhang Boyang. All Rights Reserved.
+#
+# FS QA Test 348
+#
+# Test btrfs ambiguous generation handling on raid1 profile.
+# This can be caused by, for example, two successive power failures.
+#
+. ./common/preamble
+_begin_fstest auto quick read_repair raid
+
+. ./common/filter
+. ./common/fail_make_request
+. ./common/dmdust
+
+_require_fail_make_request
+_require_scratch_dev_pool 2
+_require_dm_target dust
+
+_scratch_dev_pool_get 2
+_check_minimal_fs_size $(( 1024 * 1024 * 1024 ))
+# a strong checksum like sha256 can't protect you
+_scratch_pool_mkfs "-m raid1 -d raid1 -b 1G -n 4K --csum sha256" >> $seqres.full 2>&1
+dev2=`echo $SCRATCH_DEV_POOL | $AWK_PROG '{print $2}'`
+_allow_fail_make_request
+
+echo "Step 1: prepare filesystem"
+_scratch_mount -o notreelog
+# create a 2-level FS_TREE, this is not strictly necessary
+# however this helps improve test result reproducibility (see below)
+for ((i = 0; i < 1000; i++)); do
+ $XFS_IO_PROG -f -c "pwrite -S 0xff 0 2K" $SCRATCH_MNT/foobar$i >> $seqres.full 2>&1
+done
+# the test file should reside in a leaf which is not read at mount time
+# so we can control which mirror to use by using _btrfs_buffered_read_on_mirror
+testfile="$SCRATCH_MNT/foobar42"
+_scratch_unmount
+
+echo "Step 2: simulate failure #1"
+_init_dust
+_mount_dust -o notreelog
+# simulate dev1 disappears just before writing superblock
+for ((i = 0; i < 4096 / 512; i++)); do
+ $DMSETUP_PROG message $DUST_NAME 0 addbadblock $((0x10000 / 512 + $i)) 255
+done
+$DMSETUP_PROG message $DUST_NAME 0 enable
+# simulate dev2 disappears before writing anything
+_bdev_fail_make_request $dev2 1
+# this write should fail
+$XFS_IO_PROG -f -c "pwrite -W -S 0xaa 0 2K" "$testfile" | _filter_xfs_io
+_cleanup_dust
+_bdev_fail_make_request $dev2 0
+
+echo "Step 3: simulate failure #2"
+_scratch_mount -o notreelog
+# simulate dev1 disappears before writing anything
+_bdev_fail_make_request $SCRATCH_DEV 1
+# this write should success
+$XFS_IO_PROG -f -c "pwrite -W -S 0xbb 0 2K" "$testfile" | _filter_xfs_io
+# simulate dev2 disappears after writing superblock
+_bdev_fail_make_request $dev2 1
+_scratch_unmount
+_bdev_fail_make_request $SCRATCH_DEV 0
+_bdev_fail_make_request $dev2 0
+
+echo "Step 4: simulate recovery"
+_scratch_mount -o notreelog
+# this read should trigger resync
+_btrfs_buffered_read_on_mirror 0 2 "$testfile" 0 2K
+echo "Step 5: verify written data"
+# read data should be 0xbb
+$XFS_IO_PROG -c "pread -v 0 2K" "$testfile" | _filter_xfs_io_offset
+_scratch_unmount
+
+_disallow_fail_make_request
+_scratch_dev_pool_put
+# success, all done
+_exit 0
diff --git a/tests/btrfs/348.out b/tests/btrfs/348.out
new file mode 100644
index 00000000..645c8b36
--- /dev/null
+++ b/tests/btrfs/348.out
@@ -0,0 +1,141 @@
+QA output created by 348
+Allow global fail_make_request feature
+Step 1: prepare filesystem
+Step 2: simulate failure #1
+fsync: Input/output error
+Step 3: simulate failure #2
+wrote 2048/2048 bytes at offset 0
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+Step 4: simulate recovery
+Step 5: verify written data
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+XXXXXXXX: bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb bb ................
+read 2048/2048 bytes
+XXX Bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
+Disallow global fail_make_request feature
--
2.53.0
next prev parent reply other threads:[~2026-07-14 16:11 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-14 16:10 [BUG] two raid consistency bugs Zhang Boyang
2026-07-14 16:10 ` Zhang Boyang [this message]
2026-07-14 16:10 ` [PATCH 2/2] fstests: btrfs/349: test if latest tree-log is choosen at mount time on raid1 profile Zhang Boyang
2026-07-14 21:40 ` [BUG] two raid consistency bugs Qu Wenruo
2026-07-15 5:46 ` Zhang Boyang
2026-07-15 6:10 ` Qu Wenruo
2026-07-15 7:38 ` Zhang Boyang
2026-07-15 8:36 ` Qu Wenruo
2026-07-15 9:25 ` Zhang Boyang
2026-07-15 9:44 ` Qu Wenruo
2026-07-15 10:07 ` Zhang Boyang
2026-07-15 10:11 ` Qu Wenruo
2026-07-15 10:41 ` Zhang Boyang
2026-07-15 13:11 ` Alan Huang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260714161044.7330-2-zhangboyang.id@gmail.com \
--to=zhangboyang.id@gmail.com \
--cc=dsterba@suse.com \
--cc=fdmanana@kernel.org \
--cc=linux-btrfs@vger.kernel.org \
--cc=wqu@suse.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox