From: Qu Wenruo <wqu@suse.com>
To: linux-btrfs@vger.kernel.org, fstests@vger.kernel.org
Subject: [PATCH v2] fstests: btrfs: add a regression test case to make sure scrub can detect errors
Date: Wed, 9 Nov 2022 13:47:23 +0800 [thread overview]
Message-ID: <20221109054723.38635-1-wqu@suse.com> (raw)
There is a regression in v6.1-rc kernel, which will prevent btrfs scrub
from detecting corruption (thus no repair either).
The regression is caused by commit 786672e9e1a3 ("btrfs: scrub: use
larger block size for data extent scrub").
The new test case will:
- Create a data extent with 2 sectors
- Corrupt the second sector of above data extent
- Scrub to make sure we detect the corruption
Signed-off-by: Qu Wenruo <wqu@suse.com>
---
Changelog:
v2:
- Remove include for common/btrfs
Which is included by default.
- Add comment for why including common/filter
Needed by _btrfs_get_*() helpers.
- Migrated to btrfs/278
Which is the latest result by "./new btrfs" on for-next branch.
- Add "-s 4k" for _scratch_mkfs
To support systems with larger page sizes.
- Remove comments from the template
---
tests/btrfs/281 | 62 +++++++++++++++++++++++++++++++++++++++++++++
tests/btrfs/281.out | 2 ++
2 files changed, 64 insertions(+)
create mode 100755 tests/btrfs/281
create mode 100644 tests/btrfs/281.out
diff --git a/tests/btrfs/281 b/tests/btrfs/281
new file mode 100755
index 00000000..69b5ac02
--- /dev/null
+++ b/tests/btrfs/281
@@ -0,0 +1,62 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (C) 2022 SUSE Linux Products GmbH. All Rights Reserved.
+#
+# A regression test for offending commit 786672e9e1a3 ("btrfs: scrub: use
+# larger block size for data extent scrub"), which makes btrfs scrub unable
+# to detect corruption if it's not the first sector of an data extent.
+#
+
+. ./common/preamble
+_begin_fstest auto quick scrub
+
+# For _btrfs_get_*() helpers which needs filtering.
+. ./common/filter
+
+_supported_fs btrfs
+_require_scratch
+
+# Need to use 4K as sector size
+_require_btrfs_support_sectorsize 4096
+_require_scratch
+
+_scratch_mkfs -s 4k >> $seqres.full
+_scratch_mount
+
+# Create a data extent with 2 sectors
+$XFS_IO_PROG -fc "pwrite -S 0xff 0 8k" $SCRATCH_MNT/foobar >> $seqres.full
+sync
+
+first_logical=$(_btrfs_get_first_logical $SCRATCH_MNT/foobar)
+echo "logical of the first sector: $first_logical" >> $seqres.full
+
+second_logical=$(( $first_logical + 4096 ))
+echo "logical of the second sector: $second_logical" >> $seqres.full
+
+second_physical=$(_btrfs_get_physical $second_logical 1)
+echo "physical of the second sector: $second_physical" >> $seqres.full
+
+second_dev=$(_btrfs_get_device_path $second_logical 1)
+echo "device of the second sector: $second_dev" >> $seqres.full
+
+_scratch_unmount
+
+# Corrupt the second sector of the data extent.
+$XFS_IO_PROG -c "pwrite -S 0x00 $second_physical 4k" $second_dev >> $seqres.full
+_scratch_mount
+
+# Redirect stderr and stdout, as if btrfs detected the unrepairable corruption,
+# it will output an error message.
+$BTRFS_UTIL_PROG scrub start -B $SCRATCH_MNT &> $tmp.output
+cat $tmp.output >> $seqres.full
+_scratch_unmount
+
+if ! grep -q "csum=1" $tmp.output; then
+ echo "Scrub failed to detect corruption"
+fi
+
+echo "Silence is golden"
+
+# success, all done
+status=0
+exit
diff --git a/tests/btrfs/281.out b/tests/btrfs/281.out
new file mode 100644
index 00000000..3678e27f
--- /dev/null
+++ b/tests/btrfs/281.out
@@ -0,0 +1,2 @@
+QA output created by 281
+Silence is golden
--
2.38.0
next reply other threads:[~2022-11-09 5:47 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-11-09 5:47 Qu Wenruo [this message]
2022-11-09 11:06 ` [PATCH v2] fstests: btrfs: add a regression test case to make sure scrub can detect errors Filipe Manana
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=20221109054723.38635-1-wqu@suse.com \
--to=wqu@suse.com \
--cc=fstests@vger.kernel.org \
--cc=linux-btrfs@vger.kernel.org \
/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