From: Christoph Hellwig <hch@lst.de>
To: Zorro Lang <zlang@kernel.org>
Cc: fstests@vger.kernel.org,
"Martin K. Petersen" <martin.petersen@oracle.com>,
Kanchan Joshi <joshi.k@samsung.com>,
Anuj Gupta <anuj20.g@samsung.com>,
John Garry <john.g.garry@oracle.com>,
"Darrick J. Wong" <djwong@kernel.org>,
linux-scsi@vger.kernel.org
Subject: [PATCH 6/6] generic: test corruption detection using T10 protection information
Date: Mon, 7 Sep 2026 10:58:16 +0300 [thread overview]
Message-ID: <20260907075822.749818-7-hch@lst.de> (raw)
In-Reply-To: <20260907075822.749818-1-hch@lst.de>
Add a test that simulates bit flips in data and misdirected writes and
checks that file systems detect it when run on devices using protection
information.
This requires the new scsi_debug corruption injection.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>
---
tests/generic/2302 | 133 +++++++++++++++++++++++++++++++++++++++++
tests/generic/2302.out | 21 +++++++
2 files changed, 154 insertions(+)
create mode 100755 tests/generic/2302
create mode 100644 tests/generic/2302.out
diff --git a/tests/generic/2302 b/tests/generic/2302
new file mode 100755
index 000000000000..44d779f1d4d9
--- /dev/null
+++ b/tests/generic/2302
@@ -0,0 +1,133 @@
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2026 Christoph Hellwig
+#
+# FS QA Test No. 2302
+#
+# Test that T10 DIF detects bitflips and misplaced writes.
+#
+. ./common/preamble
+_begin_fstest auto rw pi
+
+_cleanup()
+{
+ cd /
+ rm -r -f $tmp.*
+ [ -d "$SCSI_DEBUG_MNT" ] && _unmount $SCSI_DEBUG_MNT 2>/dev/null
+ _put_scsi_debug_dev
+}
+
+. ./common/scsi_debug
+. ./common/filter
+
+_require_debugfs
+_require_scsi_debug
+# If TEST_DEV is block device, make sure current fs is a localfs which can be
+# written on scsi_debug device
+_require_test
+_require_block_device $TEST_DEV
+_require_xfs_io_command fiemap
+_require_odirect
+
+# FIEMAP on Btrfs returns logical addresses within the filesystem's address
+# space, not physical device offsets. Writing to these offsets on $SCRATCH_DEV
+# would corrupt the filesystem in multi-device setups.
+_exclude_fs btrfs
+
+size=$(_small_fs_size_mb 256)
+
+test_dif()
+{
+ local pi_type=$1
+ local last=$2
+ local bit_errors=$3
+ local reftag_adjust=$4
+
+ echo -n "Testing DIF type $pi_type "
+ if [ "$bit_errors" -gt "0" ]; then
+ echo -n "bit errors ($bit_errors) in "
+ fi
+ if [ "$reftag_adjust" -ne "0" ]; then
+ echo -n "reftag adjustment by $reftag_adjust in "
+ fi
+ if [ "$last" -eq 1 ]; then
+ echo "last sector"
+ else
+ echo "first sector"
+ fi
+
+ scsi_debug_pi_opts="write_same_length=0 dif=${pi_type} dix=1"
+ SCSI_DEBUG_DEV=`_get_scsi_debug_dev 512 512 0 $size $scsi_debug_pi_opts`
+
+ local integrity_path="$(_sysfs_block_integrity_path $SCSI_DEBUG_DEV)"
+ if [ ! -d "$integrity_path" ]; then
+ _notrun "DIF not supported by running kernel"
+ fi
+
+ SCSI_DEBUG_MNT="$TEST_DIR/scsi_debug_$seq"
+ rm -rf $SCSI_DEBUG_MNT
+ mkdir $SCSI_DEBUG_MNT
+
+ _mkfs_dev $SCSI_DEBUG_DEV || \
+ _fail "Can't make $FSTYP on DIF-enabled scsi_debug device"
+ run_check _mount $SCSI_DEBUG_DEV $SCSI_DEBUG_MNT
+
+ local blksz=$(_get_block_size $SCSI_DEBUG_MNT)
+ local testfile="$SCSI_DEBUG_MNT/test"
+
+ $XFS_IO_PROG -d -f \
+ -c "pwrite -S 0x66 0 $((128 * blksz))" \
+ -c fsync \
+ $testfile >> $seqres.full 2>&1
+
+ local phys_sector=$(_get_file_extent_sector $testfile 0)
+ if [ -z "$phys_sector" ]; then
+ _fail "$test_name: failed to get physical block offset via fiemap"
+ fi
+
+ local dev=$(_short_dev $SCSI_DEBUG_DEV)
+ local debugfs_dir=$(ls /sys/block/$dev/device/scsi_device/)
+ local debugfs_file="/sys/kernel/debug/scsi_debug/$debugfs_dir/corrupt"
+
+ if [ ! -f "$debugfs_file" ]; then
+ _notrun "scsi_debug corruption injection not supported"
+ fi
+
+ if [ "$last" -eq 1 ]; then
+ echo "adding to $phys_sector" >> $seqres.full
+ phys_blk=$((phys_blk + (128 * blksz / 512) - 1))
+ fi
+
+ echo "lba=$phys_sector,num=1,bit_errors=$bit_errors,reftag_adjust=$reftag_adjust" \
+ > $debugfs_file
+
+ $XFS_IO_PROG -d -f \
+ -c "pread 0 $((128 * blksz))" \
+ $testfile
+
+ [ -d "$SCSI_DEBUG_MNT" ] && _unmount $SCSI_DEBUG_MNT 2>/dev/null
+ _put_scsi_debug_dev
+}
+
+# test data corruption in first block
+test_dif 1 0 2 0
+test_dif 2 0 2 0
+test_dif 3 0 2 0
+
+# test data corruption in last block
+test_dif 1 1 2 0
+test_dif 2 1 2 0
+test_dif 3 1 2 0
+
+
+# Note: Type 3 doesn't have a reftag, so don't test it
+
+# reftag mismatch in first block
+test_dif 1 0 0 8
+test_dif 2 0 0 8
+
+# reftag mismatch in last block
+test_dif 1 1 0 8
+test_dif 2 1 0 8
+
+_exit 0
diff --git a/tests/generic/2302.out b/tests/generic/2302.out
new file mode 100644
index 000000000000..03b68d904943
--- /dev/null
+++ b/tests/generic/2302.out
@@ -0,0 +1,21 @@
+QA output created by 2302
+Testing DIF type 1 bit errors (2) in first sector
+pread: Invalid or incomplete multibyte or wide character
+Testing DIF type 2 bit errors (2) in first sector
+pread: Invalid or incomplete multibyte or wide character
+Testing DIF type 3 bit errors (2) in first sector
+pread: Invalid or incomplete multibyte or wide character
+Testing DIF type 1 bit errors (2) in last sector
+pread: Invalid or incomplete multibyte or wide character
+Testing DIF type 2 bit errors (2) in last sector
+pread: Invalid or incomplete multibyte or wide character
+Testing DIF type 3 bit errors (2) in last sector
+pread: Invalid or incomplete multibyte or wide character
+Testing DIF type 1 reftag adjustment by 8 in first sector
+pread: Invalid or incomplete multibyte or wide character
+Testing DIF type 2 reftag adjustment by 8 in first sector
+pread: Invalid or incomplete multibyte or wide character
+Testing DIF type 1 reftag adjustment by 8 in last sector
+pread: Invalid or incomplete multibyte or wide character
+Testing DIF type 2 reftag adjustment by 8 in last sector
+pread: Invalid or incomplete multibyte or wide character
--
2.53.0
next prev parent reply other threads:[~2026-09-07 7:59 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-07 7:58 add tests for file system on devices using protection information v4 Christoph Hellwig
2026-09-07 7:58 ` [PATCH 1/6] common/scsi_debug: don't slow down I/O Christoph Hellwig
2026-09-07 7:58 ` [PATCH 2/6] common: factor out a _bdev_disk_name helper Christoph Hellwig
2026-09-07 7:58 ` [PATCH 3/6] common: add a _sysfs_block_integrity_path helper Christoph Hellwig
2026-09-08 14:32 ` Kanchan Joshi
2026-09-07 7:58 ` [PATCH 4/6] add a "pi" group Christoph Hellwig
2026-09-08 14:33 ` Kanchan Joshi
2026-09-07 7:58 ` [PATCH 5/6] generic: test I/O on devices with T10 protection information Christoph Hellwig
2026-09-08 14:33 ` Kanchan Joshi
2026-09-07 7:58 ` Christoph Hellwig [this message]
2026-09-08 14:36 ` [PATCH 6/6] generic: test corruption detection using " Kanchan Joshi
-- strict thread matches above, loose matches on Subject: below --
2026-09-11 7:08 add tests for file system on devices using protection information v5 Christoph Hellwig
2026-09-11 7:08 ` [PATCH 6/6] generic: test corruption detection using T10 protection information Christoph Hellwig
2026-08-31 6:45 add tests for file system on devices using protection information v3 Christoph Hellwig
2026-08-31 6:45 ` [PATCH 6/6] generic: test corruption detection using T10 protection information Christoph Hellwig
2026-09-03 6:00 ` Anuj Gupta/Anuj Gupta
2026-09-07 5:49 ` Christoph Hellwig
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=20260907075822.749818-7-hch@lst.de \
--to=hch@lst.de \
--cc=anuj20.g@samsung.com \
--cc=djwong@kernel.org \
--cc=fstests@vger.kernel.org \
--cc=john.g.garry@oracle.com \
--cc=joshi.k@samsung.com \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
--cc=zlang@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.