Add test case loop_08 to verify the ublk integrity data flow. It uses
the kublk loop target to create a ublk device with integrity on top of
backing data and integrity files. It then writes to the whole device
with fio configured to generate integrity data. Then it reads back the
whole device with fio configured to verify the integrity data.
It also verifies that injected guard, reftag, and apptag corruptions are
correctly detected.
Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
---
tools/testing/selftests/ublk/Makefile | 1 +
tools/testing/selftests/ublk/test_loop_08.sh | 111 +++++++++++++++++++
2 files changed, 112 insertions(+)
create mode 100755 tools/testing/selftests/ublk/test_loop_08.sh
diff --git a/tools/testing/selftests/ublk/Makefile b/tools/testing/selftests/ublk/Makefile
index bfd68ae64142..ab745443fd58 100644
--- a/tools/testing/selftests/ublk/Makefile
+++ b/tools/testing/selftests/ublk/Makefile
@@ -33,10 +33,11 @@ TEST_PROGS += test_loop_02.sh
TEST_PROGS += test_loop_03.sh
TEST_PROGS += test_loop_04.sh
TEST_PROGS += test_loop_05.sh
TEST_PROGS += test_loop_06.sh
TEST_PROGS += test_loop_07.sh
+TEST_PROGS += test_loop_08.sh
TEST_PROGS += test_stripe_01.sh
TEST_PROGS += test_stripe_02.sh
TEST_PROGS += test_stripe_03.sh
TEST_PROGS += test_stripe_04.sh
TEST_PROGS += test_stripe_05.sh
diff --git a/tools/testing/selftests/ublk/test_loop_08.sh b/tools/testing/selftests/ublk/test_loop_08.sh
new file mode 100755
index 000000000000..ca289cfb2ad4
--- /dev/null
+++ b/tools/testing/selftests/ublk/test_loop_08.sh
@@ -0,0 +1,111 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+
+. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh
+
+if ! _have_program fio; then
+ exit $UBLK_SKIP_CODE
+fi
+
+fio_version=$(fio --version)
+if [[ "$fio_version" =~ fio-[0-9]+\.[0-9]+$ ]]; then
+ echo "Requires development fio version with https://github.com/axboe/fio/pull/1992"
+ exit $UBLK_SKIP_CODE
+fi
+
+TID=loop_08
+
+_prep_test "loop" "end-to-end integrity"
+
+_create_backfile 0 256M
+_create_backfile 1 32M # 256M * (64 integrity bytes / 512 data bytes)
+integrity_params="--integrity_capable --integrity_reftag
+ --metadata_size 64 --pi_offset 56 --csum_type t10dif"
+dev_id=$(_add_ublk_dev -t loop -u $integrity_params "${UBLK_BACKFILES[@]}")
+_check_add_dev $TID $?
+
+# 1M * (64 integrity bytes / 512 data bytes) = 128K
+fio_args="--ioengine io_uring --direct 1 --bsrange 512-1M --iodepth 32
+ --md_per_io_size 128K --pi_act 0 --pi_chk GUARD,REFTAG,APPTAG
+ --filename /dev/ublkb$dev_id"
+fio --name fill --rw randwrite $fio_args > /dev/null
+err=$?
+if [ $err != 0 ]; then
+ echo "fio fill failed"
+ _show_result $TID $err
+fi
+
+fio --name verify --rw randread $fio_args > /dev/null
+err=$?
+if [ $err != 0 ]; then
+ echo "fio verify failed"
+ _show_result $TID $err
+fi
+
+fio_err=$(mktemp fio_err_XXXXX)
+
+# Overwrite 4-byte reftag at offset 56 + 4 = 60
+dd_reftag_args="bs=1 seek=60 count=4 oflag=dsync conv=notrunc status=none"
+dd if=/dev/urandom "of=${UBLK_BACKFILES[1]}" $dd_reftag_args
+err=$?
+if [ $err != 0 ]; then
+ echo "dd corrupted_reftag failed"
+ rm -f "$fio_err"
+ _show_result $TID $err
+fi
+if fio --name corrupted_reftag --rw randread $fio_args > /dev/null 2> "$fio_err"; then
+ echo "fio corrupted_reftag unexpectedly succeeded"
+ rm -f "$fio_err"
+ _show_result $TID 255
+fi
+expected_err="REFTAG compare error: LBA: 0 Expected=0, Actual="
+if ! grep -q "$expected_err" "$fio_err"; then
+ echo "fio corrupted_reftag message not found: $expected_err"
+ rm -f "$fio_err"
+ _show_result $TID 255
+fi
+# Reset to 0
+dd if=/dev/zero "of=${UBLK_BACKFILES[1]}" $dd_reftag_args
+err=$?
+if [ $err != 0 ]; then
+ echo "dd restore corrupted_reftag failed"
+ rm -f "$fio_err"
+ _show_result $TID $err
+fi
+
+dd_data_args="bs=512 count=1 oflag=direct,dsync conv=notrunc status=none"
+dd if=/dev/zero "of=${UBLK_BACKFILES[0]}" $dd_data_args
+err=$?
+if [ $err != 0 ]; then
+ echo "dd corrupted_data failed"
+ rm -f "$fio_err"
+ _show_result $TID $err
+fi
+if fio --name corrupted_data --rw randread $fio_args > /dev/null 2> "$fio_err"; then
+ echo "fio corrupted_data unexpectedly succeeded"
+ rm -f "$fio_err"
+ _show_result $TID 255
+fi
+expected_err="Guard compare error: LBA: 0 Expected=0, Actual="
+if ! grep -q "$expected_err" "$fio_err"; then
+ echo "fio corrupted_data message not found: $expected_err"
+ rm -f "$fio_err"
+ _show_result $TID 255
+fi
+
+if fio --name bad_apptag --rw randread $fio_args --apptag 0x4321 > /dev/null 2> "$fio_err"; then
+ echo "fio bad_apptag unexpectedly succeeded"
+ rm -f "$fio_err"
+ _show_result $TID 255
+fi
+expected_err="APPTAG compare error: LBA: [0-9]* Expected=4321, Actual=1234"
+if ! grep -q "$expected_err" "$fio_err"; then
+ echo "fio bad_apptag message not found: $expected_err"
+ rm -f "$fio_err"
+ _show_result $TID 255
+fi
+
+rm -f "$fio_err"
+
+_cleanup_test
+_show_result $TID 0
--
2.45.2
On Mon, Jan 05, 2026 at 05:57:51PM -0700, Caleb Sander Mateos wrote:
> Add test case loop_08 to verify the ublk integrity data flow. It uses
> the kublk loop target to create a ublk device with integrity on top of
> backing data and integrity files. It then writes to the whole device
> with fio configured to generate integrity data. Then it reads back the
> whole device with fio configured to verify the integrity data.
> It also verifies that injected guard, reftag, and apptag corruptions are
> correctly detected.
>
> Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
> ---
> tools/testing/selftests/ublk/Makefile | 1 +
> tools/testing/selftests/ublk/test_loop_08.sh | 111 +++++++++++++++++++
> 2 files changed, 112 insertions(+)
> create mode 100755 tools/testing/selftests/ublk/test_loop_08.sh
>
> diff --git a/tools/testing/selftests/ublk/Makefile b/tools/testing/selftests/ublk/Makefile
> index bfd68ae64142..ab745443fd58 100644
> --- a/tools/testing/selftests/ublk/Makefile
> +++ b/tools/testing/selftests/ublk/Makefile
> @@ -33,10 +33,11 @@ TEST_PROGS += test_loop_02.sh
> TEST_PROGS += test_loop_03.sh
> TEST_PROGS += test_loop_04.sh
> TEST_PROGS += test_loop_05.sh
> TEST_PROGS += test_loop_06.sh
> TEST_PROGS += test_loop_07.sh
> +TEST_PROGS += test_loop_08.sh
> TEST_PROGS += test_stripe_01.sh
> TEST_PROGS += test_stripe_02.sh
> TEST_PROGS += test_stripe_03.sh
> TEST_PROGS += test_stripe_04.sh
> TEST_PROGS += test_stripe_05.sh
> diff --git a/tools/testing/selftests/ublk/test_loop_08.sh b/tools/testing/selftests/ublk/test_loop_08.sh
> new file mode 100755
> index 000000000000..ca289cfb2ad4
> --- /dev/null
> +++ b/tools/testing/selftests/ublk/test_loop_08.sh
> @@ -0,0 +1,111 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0
> +
> +. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh
> +
> +if ! _have_program fio; then
> + exit $UBLK_SKIP_CODE
> +fi
> +
> +fio_version=$(fio --version)
> +if [[ "$fio_version" =~ fio-[0-9]+\.[0-9]+$ ]]; then
> + echo "Requires development fio version with https://github.com/axboe/fio/pull/1992"
> + exit $UBLK_SKIP_CODE
> +fi
> +
> +TID=loop_08
> +
> +_prep_test "loop" "end-to-end integrity"
> +
> +_create_backfile 0 256M
> +_create_backfile 1 32M # 256M * (64 integrity bytes / 512 data bytes)
> +integrity_params="--integrity_capable --integrity_reftag
> + --metadata_size 64 --pi_offset 56 --csum_type t10dif"
> +dev_id=$(_add_ublk_dev -t loop -u $integrity_params "${UBLK_BACKFILES[@]}")
I tried above setting:
./kublk add -t loop --integrity_capable --integrity_reftag --metadata_size 64 --pi_offset 56 --csum_type t10dif --foreground -u /dev/sdb /dev/sdc
dev id 1: nr_hw_queues 2 queue_depth 128 block size 512 dev_capacity 8388608
max rq size 1048576 daemon pid 38295 flags 0x160c2 state LIVE
queue 0: affinity(0 )
queue 1: affinity(8 )
However, IO error is always triggered:
[ 9202.316382] ublkb1: ref tag error at location 0 (rcvd 128)
[ 9202.317171] Buffer I/O error on dev ublkb1, logical block 0, async page read
[ 9202.319478] ublkb1: ref tag error at location 0 (rcvd 128)
[ 9202.319983] Buffer I/O error on dev ublkb1, logical block 0, async page read
[ 9202.326332] ublkb1: ref tag error at location 0 (rcvd 128)
[ 9202.326974] Buffer I/O error on dev ublkb1, logical block 0, async page read
[ 9202.327570] ldm_validate_partition_table(): Disk read failed.
[ 9202.336539] ublkb1: ref tag error at location 0 (rcvd 128)
[ 9202.337228] Buffer I/O error on dev ublkb1, logical block 0, async page read
[ 9202.339247] ublkb1: ref tag error at location 0 (rcvd 128)
[ 9202.339779] Buffer I/O error on dev ublkb1, logical block 0, async page read
[ 9202.344306] ublkb1: ref tag error at location 0 (rcvd 128)
[ 9202.344948] Buffer I/O error on dev ublkb1, logical block 0, async page read
[ 9202.347067] ublkb1: ref tag error at location 0 (rcvd 128)
[ 9202.347558] Buffer I/O error on dev ublkb1, logical block 0, async page read
[ 9202.348100] Dev ublkb1: unable to read RDB block 0
[ 9202.350159] ublkb1: ref tag error at location 0 (rcvd 128)
[ 9202.350642] Buffer I/O error on dev ublkb1, logical block 0, async page read
[ 9202.354977] ublkb1: ref tag error at location 0 (rcvd 128)
[ 9202.355539] Buffer I/O error on dev ublkb1, logical block 0, async page read
[ 9202.356280] ublkb1: unable to read partition table
Thanks,
Ming
On Tue, Jan 6, 2026 at 6:10 AM Ming Lei <ming.lei@redhat.com> wrote:
>
> On Mon, Jan 05, 2026 at 05:57:51PM -0700, Caleb Sander Mateos wrote:
> > Add test case loop_08 to verify the ublk integrity data flow. It uses
> > the kublk loop target to create a ublk device with integrity on top of
> > backing data and integrity files. It then writes to the whole device
> > with fio configured to generate integrity data. Then it reads back the
> > whole device with fio configured to verify the integrity data.
> > It also verifies that injected guard, reftag, and apptag corruptions are
> > correctly detected.
> >
> > Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
> > ---
> > tools/testing/selftests/ublk/Makefile | 1 +
> > tools/testing/selftests/ublk/test_loop_08.sh | 111 +++++++++++++++++++
> > 2 files changed, 112 insertions(+)
> > create mode 100755 tools/testing/selftests/ublk/test_loop_08.sh
> >
> > diff --git a/tools/testing/selftests/ublk/Makefile b/tools/testing/selftests/ublk/Makefile
> > index bfd68ae64142..ab745443fd58 100644
> > --- a/tools/testing/selftests/ublk/Makefile
> > +++ b/tools/testing/selftests/ublk/Makefile
> > @@ -33,10 +33,11 @@ TEST_PROGS += test_loop_02.sh
> > TEST_PROGS += test_loop_03.sh
> > TEST_PROGS += test_loop_04.sh
> > TEST_PROGS += test_loop_05.sh
> > TEST_PROGS += test_loop_06.sh
> > TEST_PROGS += test_loop_07.sh
> > +TEST_PROGS += test_loop_08.sh
> > TEST_PROGS += test_stripe_01.sh
> > TEST_PROGS += test_stripe_02.sh
> > TEST_PROGS += test_stripe_03.sh
> > TEST_PROGS += test_stripe_04.sh
> > TEST_PROGS += test_stripe_05.sh
> > diff --git a/tools/testing/selftests/ublk/test_loop_08.sh b/tools/testing/selftests/ublk/test_loop_08.sh
> > new file mode 100755
> > index 000000000000..ca289cfb2ad4
> > --- /dev/null
> > +++ b/tools/testing/selftests/ublk/test_loop_08.sh
> > @@ -0,0 +1,111 @@
> > +#!/bin/bash
> > +# SPDX-License-Identifier: GPL-2.0
> > +
> > +. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh
> > +
> > +if ! _have_program fio; then
> > + exit $UBLK_SKIP_CODE
> > +fi
> > +
> > +fio_version=$(fio --version)
> > +if [[ "$fio_version" =~ fio-[0-9]+\.[0-9]+$ ]]; then
> > + echo "Requires development fio version with https://github.com/axboe/fio/pull/1992"
> > + exit $UBLK_SKIP_CODE
> > +fi
> > +
> > +TID=loop_08
> > +
> > +_prep_test "loop" "end-to-end integrity"
> > +
> > +_create_backfile 0 256M
> > +_create_backfile 1 32M # 256M * (64 integrity bytes / 512 data bytes)
> > +integrity_params="--integrity_capable --integrity_reftag
> > + --metadata_size 64 --pi_offset 56 --csum_type t10dif"
> > +dev_id=$(_add_ublk_dev -t loop -u $integrity_params "${UBLK_BACKFILES[@]}")
>
> I tried above setting:
>
> ./kublk add -t loop --integrity_capable --integrity_reftag --metadata_size 64 --pi_offset 56 --csum_type t10dif --foreground -u /dev/sdb /dev/sdc
> dev id 1: nr_hw_queues 2 queue_depth 128 block size 512 dev_capacity 8388608
> max rq size 1048576 daemon pid 38295 flags 0x160c2 state LIVE
> queue 0: affinity(0 )
> queue 1: affinity(8 )
>
> However, IO error is always triggered:
>
> [ 9202.316382] ublkb1: ref tag error at location 0 (rcvd 128)
> [ 9202.317171] Buffer I/O error on dev ublkb1, logical block 0, async page read
Hmm, what are the initial contents of /dev/sdc? It looks like they are
nonzero, as the reftag being read for logical block 0 is 128 rather
than the expected 0 (the reftag would be read from bytes 60 to 63 of
/dev/sdc). In general, though, the partition scan may be expected to
fail the bio-integrity-auto checks if the integrity data hasn't been
initialized. I don't think this is an issue, since the partition scan
is looking for a partition table but there's no guarantee that one
exists.
You can disable the kernel integrity checks if you want by writing 0
to /sys/block/ublkb1/integrity/read_verify. However, I'm not sure it's
possible to do this soon enough to take effect before the partition
scan.
We could also use the UBLK_F_NO_AUTO_PART_SCAN feature, once it lands,
to suppress the partition scan and these error messages.
Best,
Caleb
> [ 9202.319478] ublkb1: ref tag error at location 0 (rcvd 128)
> [ 9202.319983] Buffer I/O error on dev ublkb1, logical block 0, async page read
> [ 9202.326332] ublkb1: ref tag error at location 0 (rcvd 128)
> [ 9202.326974] Buffer I/O error on dev ublkb1, logical block 0, async page read
> [ 9202.327570] ldm_validate_partition_table(): Disk read failed.
> [ 9202.336539] ublkb1: ref tag error at location 0 (rcvd 128)
> [ 9202.337228] Buffer I/O error on dev ublkb1, logical block 0, async page read
> [ 9202.339247] ublkb1: ref tag error at location 0 (rcvd 128)
> [ 9202.339779] Buffer I/O error on dev ublkb1, logical block 0, async page read
> [ 9202.344306] ublkb1: ref tag error at location 0 (rcvd 128)
> [ 9202.344948] Buffer I/O error on dev ublkb1, logical block 0, async page read
> [ 9202.347067] ublkb1: ref tag error at location 0 (rcvd 128)
> [ 9202.347558] Buffer I/O error on dev ublkb1, logical block 0, async page read
> [ 9202.348100] Dev ublkb1: unable to read RDB block 0
> [ 9202.350159] ublkb1: ref tag error at location 0 (rcvd 128)
> [ 9202.350642] Buffer I/O error on dev ublkb1, logical block 0, async page read
> [ 9202.354977] ublkb1: ref tag error at location 0 (rcvd 128)
> [ 9202.355539] Buffer I/O error on dev ublkb1, logical block 0, async page read
> [ 9202.356280] ublkb1: unable to read partition table
>
>
>
> Thanks,
> Ming
>
On Tue, Jan 06, 2026 at 09:15:44AM -0800, Caleb Sander Mateos wrote:
> On Tue, Jan 6, 2026 at 6:10 AM Ming Lei <ming.lei@redhat.com> wrote:
> >
> > On Mon, Jan 05, 2026 at 05:57:51PM -0700, Caleb Sander Mateos wrote:
> > > Add test case loop_08 to verify the ublk integrity data flow. It uses
> > > the kublk loop target to create a ublk device with integrity on top of
> > > backing data and integrity files. It then writes to the whole device
> > > with fio configured to generate integrity data. Then it reads back the
> > > whole device with fio configured to verify the integrity data.
> > > It also verifies that injected guard, reftag, and apptag corruptions are
> > > correctly detected.
> > >
> > > Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
> > > ---
> > > tools/testing/selftests/ublk/Makefile | 1 +
> > > tools/testing/selftests/ublk/test_loop_08.sh | 111 +++++++++++++++++++
> > > 2 files changed, 112 insertions(+)
> > > create mode 100755 tools/testing/selftests/ublk/test_loop_08.sh
> > >
> > > diff --git a/tools/testing/selftests/ublk/Makefile b/tools/testing/selftests/ublk/Makefile
> > > index bfd68ae64142..ab745443fd58 100644
> > > --- a/tools/testing/selftests/ublk/Makefile
> > > +++ b/tools/testing/selftests/ublk/Makefile
> > > @@ -33,10 +33,11 @@ TEST_PROGS += test_loop_02.sh
> > > TEST_PROGS += test_loop_03.sh
> > > TEST_PROGS += test_loop_04.sh
> > > TEST_PROGS += test_loop_05.sh
> > > TEST_PROGS += test_loop_06.sh
> > > TEST_PROGS += test_loop_07.sh
> > > +TEST_PROGS += test_loop_08.sh
> > > TEST_PROGS += test_stripe_01.sh
> > > TEST_PROGS += test_stripe_02.sh
> > > TEST_PROGS += test_stripe_03.sh
> > > TEST_PROGS += test_stripe_04.sh
> > > TEST_PROGS += test_stripe_05.sh
> > > diff --git a/tools/testing/selftests/ublk/test_loop_08.sh b/tools/testing/selftests/ublk/test_loop_08.sh
> > > new file mode 100755
> > > index 000000000000..ca289cfb2ad4
> > > --- /dev/null
> > > +++ b/tools/testing/selftests/ublk/test_loop_08.sh
> > > @@ -0,0 +1,111 @@
> > > +#!/bin/bash
> > > +# SPDX-License-Identifier: GPL-2.0
> > > +
> > > +. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh
> > > +
> > > +if ! _have_program fio; then
> > > + exit $UBLK_SKIP_CODE
> > > +fi
> > > +
> > > +fio_version=$(fio --version)
> > > +if [[ "$fio_version" =~ fio-[0-9]+\.[0-9]+$ ]]; then
> > > + echo "Requires development fio version with https://github.com/axboe/fio/pull/1992"
> > > + exit $UBLK_SKIP_CODE
> > > +fi
> > > +
> > > +TID=loop_08
> > > +
> > > +_prep_test "loop" "end-to-end integrity"
> > > +
> > > +_create_backfile 0 256M
> > > +_create_backfile 1 32M # 256M * (64 integrity bytes / 512 data bytes)
> > > +integrity_params="--integrity_capable --integrity_reftag
> > > + --metadata_size 64 --pi_offset 56 --csum_type t10dif"
> > > +dev_id=$(_add_ublk_dev -t loop -u $integrity_params "${UBLK_BACKFILES[@]}")
> >
> > I tried above setting:
> >
> > ./kublk add -t loop --integrity_capable --integrity_reftag --metadata_size 64 --pi_offset 56 --csum_type t10dif --foreground -u /dev/sdb /dev/sdc
> > dev id 1: nr_hw_queues 2 queue_depth 128 block size 512 dev_capacity 8388608
> > max rq size 1048576 daemon pid 38295 flags 0x160c2 state LIVE
> > queue 0: affinity(0 )
> > queue 1: affinity(8 )
> >
> > However, IO error is always triggered:
> >
> > [ 9202.316382] ublkb1: ref tag error at location 0 (rcvd 128)
> > [ 9202.317171] Buffer I/O error on dev ublkb1, logical block 0, async page read
>
> Hmm, what are the initial contents of /dev/sdc? It looks like they are
> nonzero, as the reftag being read for logical block 0 is 128 rather
> than the expected 0 (the reftag would be read from bytes 60 to 63 of
> /dev/sdc). In general, though, the partition scan may be expected to
> fail the bio-integrity-auto checks if the integrity data hasn't been
> initialized. I don't think this is an issue, since the partition scan
> is looking for a partition table but there's no guarantee that one
> exists.
> You can disable the kernel integrity checks if you want by writing 0
> to /sys/block/ublkb1/integrity/read_verify. However, I'm not sure it's
> possible to do this soon enough to take effect before the partition
> scan.
> We could also use the UBLK_F_NO_AUTO_PART_SCAN feature, once it lands,
> to suppress the partition scan and these error messages.
UBLK_F_NO_AUTO_PART_SCAN can't avoid the following read failure.
I guess the issue can be avoided by adding small superblock to the meta
data file, then format it in the 1st time when superblock doesn't exist.
This way will make it usable from test/verify purpose.
Thanks,
Ming
On Tue, Jan 6, 2026 at 4:21 PM Ming Lei <ming.lei@redhat.com> wrote:
>
> On Tue, Jan 06, 2026 at 09:15:44AM -0800, Caleb Sander Mateos wrote:
> > On Tue, Jan 6, 2026 at 6:10 AM Ming Lei <ming.lei@redhat.com> wrote:
> > >
> > > On Mon, Jan 05, 2026 at 05:57:51PM -0700, Caleb Sander Mateos wrote:
> > > > Add test case loop_08 to verify the ublk integrity data flow. It uses
> > > > the kublk loop target to create a ublk device with integrity on top of
> > > > backing data and integrity files. It then writes to the whole device
> > > > with fio configured to generate integrity data. Then it reads back the
> > > > whole device with fio configured to verify the integrity data.
> > > > It also verifies that injected guard, reftag, and apptag corruptions are
> > > > correctly detected.
> > > >
> > > > Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
> > > > ---
> > > > tools/testing/selftests/ublk/Makefile | 1 +
> > > > tools/testing/selftests/ublk/test_loop_08.sh | 111 +++++++++++++++++++
> > > > 2 files changed, 112 insertions(+)
> > > > create mode 100755 tools/testing/selftests/ublk/test_loop_08.sh
> > > >
> > > > diff --git a/tools/testing/selftests/ublk/Makefile b/tools/testing/selftests/ublk/Makefile
> > > > index bfd68ae64142..ab745443fd58 100644
> > > > --- a/tools/testing/selftests/ublk/Makefile
> > > > +++ b/tools/testing/selftests/ublk/Makefile
> > > > @@ -33,10 +33,11 @@ TEST_PROGS += test_loop_02.sh
> > > > TEST_PROGS += test_loop_03.sh
> > > > TEST_PROGS += test_loop_04.sh
> > > > TEST_PROGS += test_loop_05.sh
> > > > TEST_PROGS += test_loop_06.sh
> > > > TEST_PROGS += test_loop_07.sh
> > > > +TEST_PROGS += test_loop_08.sh
> > > > TEST_PROGS += test_stripe_01.sh
> > > > TEST_PROGS += test_stripe_02.sh
> > > > TEST_PROGS += test_stripe_03.sh
> > > > TEST_PROGS += test_stripe_04.sh
> > > > TEST_PROGS += test_stripe_05.sh
> > > > diff --git a/tools/testing/selftests/ublk/test_loop_08.sh b/tools/testing/selftests/ublk/test_loop_08.sh
> > > > new file mode 100755
> > > > index 000000000000..ca289cfb2ad4
> > > > --- /dev/null
> > > > +++ b/tools/testing/selftests/ublk/test_loop_08.sh
> > > > @@ -0,0 +1,111 @@
> > > > +#!/bin/bash
> > > > +# SPDX-License-Identifier: GPL-2.0
> > > > +
> > > > +. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh
> > > > +
> > > > +if ! _have_program fio; then
> > > > + exit $UBLK_SKIP_CODE
> > > > +fi
> > > > +
> > > > +fio_version=$(fio --version)
> > > > +if [[ "$fio_version" =~ fio-[0-9]+\.[0-9]+$ ]]; then
> > > > + echo "Requires development fio version with https://github.com/axboe/fio/pull/1992"
> > > > + exit $UBLK_SKIP_CODE
> > > > +fi
> > > > +
> > > > +TID=loop_08
> > > > +
> > > > +_prep_test "loop" "end-to-end integrity"
> > > > +
> > > > +_create_backfile 0 256M
> > > > +_create_backfile 1 32M # 256M * (64 integrity bytes / 512 data bytes)
> > > > +integrity_params="--integrity_capable --integrity_reftag
> > > > + --metadata_size 64 --pi_offset 56 --csum_type t10dif"
> > > > +dev_id=$(_add_ublk_dev -t loop -u $integrity_params "${UBLK_BACKFILES[@]}")
> > >
> > > I tried above setting:
> > >
> > > ./kublk add -t loop --integrity_capable --integrity_reftag --metadata_size 64 --pi_offset 56 --csum_type t10dif --foreground -u /dev/sdb /dev/sdc
> > > dev id 1: nr_hw_queues 2 queue_depth 128 block size 512 dev_capacity 8388608
> > > max rq size 1048576 daemon pid 38295 flags 0x160c2 state LIVE
> > > queue 0: affinity(0 )
> > > queue 1: affinity(8 )
> > >
> > > However, IO error is always triggered:
> > >
> > > [ 9202.316382] ublkb1: ref tag error at location 0 (rcvd 128)
> > > [ 9202.317171] Buffer I/O error on dev ublkb1, logical block 0, async page read
> >
> > Hmm, what are the initial contents of /dev/sdc? It looks like they are
> > nonzero, as the reftag being read for logical block 0 is 128 rather
> > than the expected 0 (the reftag would be read from bytes 60 to 63 of
> > /dev/sdc). In general, though, the partition scan may be expected to
> > fail the bio-integrity-auto checks if the integrity data hasn't been
> > initialized. I don't think this is an issue, since the partition scan
> > is looking for a partition table but there's no guarantee that one
> > exists.
> > You can disable the kernel integrity checks if you want by writing 0
> > to /sys/block/ublkb1/integrity/read_verify. However, I'm not sure it's
> > possible to do this soon enough to take effect before the partition
> > scan.
> > We could also use the UBLK_F_NO_AUTO_PART_SCAN feature, once it lands,
> > to suppress the partition scan and these error messages.
>
> UBLK_F_NO_AUTO_PART_SCAN can't avoid the following read failure.
Are you saying the reads aren't coming from the partition scan? What
else would be issuing reads to the ublk device before fio is run on
it?
>
> I guess the issue can be avoided by adding small superblock to the meta
> data file, then format it in the 1st time when superblock doesn't exist.
Not sure the complexity of a superblock is necessary. Could just
initialize all the protection information with valid reftags and guard
tags.
>
> This way will make it usable from test/verify purpose.
I'm still not following why it's not "usable" currently. Only blocks
that have been written to (with protection information generated by
fio or the kernel) can be read back, but that's how block devices are
expected to be used. It seems fine to me for test purposes.
test_loop_08.sh writes to the full ublk device before verifying it, so
it shouldn't encounter any invalid reftags.
Best,
Caleb
On Tue, Jan 06, 2026 at 05:32:29PM -0800, Caleb Sander Mateos wrote:
> On Tue, Jan 6, 2026 at 4:21 PM Ming Lei <ming.lei@redhat.com> wrote:
> >
> > On Tue, Jan 06, 2026 at 09:15:44AM -0800, Caleb Sander Mateos wrote:
> > > On Tue, Jan 6, 2026 at 6:10 AM Ming Lei <ming.lei@redhat.com> wrote:
> > > >
> > > > On Mon, Jan 05, 2026 at 05:57:51PM -0700, Caleb Sander Mateos wrote:
> > > > > Add test case loop_08 to verify the ublk integrity data flow. It uses
> > > > > the kublk loop target to create a ublk device with integrity on top of
> > > > > backing data and integrity files. It then writes to the whole device
> > > > > with fio configured to generate integrity data. Then it reads back the
> > > > > whole device with fio configured to verify the integrity data.
> > > > > It also verifies that injected guard, reftag, and apptag corruptions are
> > > > > correctly detected.
> > > > >
> > > > > Signed-off-by: Caleb Sander Mateos <csander@purestorage.com>
> > > > > ---
> > > > > tools/testing/selftests/ublk/Makefile | 1 +
> > > > > tools/testing/selftests/ublk/test_loop_08.sh | 111 +++++++++++++++++++
> > > > > 2 files changed, 112 insertions(+)
> > > > > create mode 100755 tools/testing/selftests/ublk/test_loop_08.sh
> > > > >
> > > > > diff --git a/tools/testing/selftests/ublk/Makefile b/tools/testing/selftests/ublk/Makefile
> > > > > index bfd68ae64142..ab745443fd58 100644
> > > > > --- a/tools/testing/selftests/ublk/Makefile
> > > > > +++ b/tools/testing/selftests/ublk/Makefile
> > > > > @@ -33,10 +33,11 @@ TEST_PROGS += test_loop_02.sh
> > > > > TEST_PROGS += test_loop_03.sh
> > > > > TEST_PROGS += test_loop_04.sh
> > > > > TEST_PROGS += test_loop_05.sh
> > > > > TEST_PROGS += test_loop_06.sh
> > > > > TEST_PROGS += test_loop_07.sh
> > > > > +TEST_PROGS += test_loop_08.sh
> > > > > TEST_PROGS += test_stripe_01.sh
> > > > > TEST_PROGS += test_stripe_02.sh
> > > > > TEST_PROGS += test_stripe_03.sh
> > > > > TEST_PROGS += test_stripe_04.sh
> > > > > TEST_PROGS += test_stripe_05.sh
> > > > > diff --git a/tools/testing/selftests/ublk/test_loop_08.sh b/tools/testing/selftests/ublk/test_loop_08.sh
> > > > > new file mode 100755
> > > > > index 000000000000..ca289cfb2ad4
> > > > > --- /dev/null
> > > > > +++ b/tools/testing/selftests/ublk/test_loop_08.sh
> > > > > @@ -0,0 +1,111 @@
> > > > > +#!/bin/bash
> > > > > +# SPDX-License-Identifier: GPL-2.0
> > > > > +
> > > > > +. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh
> > > > > +
> > > > > +if ! _have_program fio; then
> > > > > + exit $UBLK_SKIP_CODE
> > > > > +fi
> > > > > +
> > > > > +fio_version=$(fio --version)
> > > > > +if [[ "$fio_version" =~ fio-[0-9]+\.[0-9]+$ ]]; then
> > > > > + echo "Requires development fio version with https://github.com/axboe/fio/pull/1992"
> > > > > + exit $UBLK_SKIP_CODE
> > > > > +fi
> > > > > +
> > > > > +TID=loop_08
> > > > > +
> > > > > +_prep_test "loop" "end-to-end integrity"
> > > > > +
> > > > > +_create_backfile 0 256M
> > > > > +_create_backfile 1 32M # 256M * (64 integrity bytes / 512 data bytes)
> > > > > +integrity_params="--integrity_capable --integrity_reftag
> > > > > + --metadata_size 64 --pi_offset 56 --csum_type t10dif"
> > > > > +dev_id=$(_add_ublk_dev -t loop -u $integrity_params "${UBLK_BACKFILES[@]}")
> > > >
> > > > I tried above setting:
> > > >
> > > > ./kublk add -t loop --integrity_capable --integrity_reftag --metadata_size 64 --pi_offset 56 --csum_type t10dif --foreground -u /dev/sdb /dev/sdc
> > > > dev id 1: nr_hw_queues 2 queue_depth 128 block size 512 dev_capacity 8388608
> > > > max rq size 1048576 daemon pid 38295 flags 0x160c2 state LIVE
> > > > queue 0: affinity(0 )
> > > > queue 1: affinity(8 )
> > > >
> > > > However, IO error is always triggered:
> > > >
> > > > [ 9202.316382] ublkb1: ref tag error at location 0 (rcvd 128)
> > > > [ 9202.317171] Buffer I/O error on dev ublkb1, logical block 0, async page read
> > >
> > > Hmm, what are the initial contents of /dev/sdc? It looks like they are
> > > nonzero, as the reftag being read for logical block 0 is 128 rather
> > > than the expected 0 (the reftag would be read from bytes 60 to 63 of
> > > /dev/sdc). In general, though, the partition scan may be expected to
> > > fail the bio-integrity-auto checks if the integrity data hasn't been
> > > initialized. I don't think this is an issue, since the partition scan
> > > is looking for a partition table but there's no guarantee that one
> > > exists.
> > > You can disable the kernel integrity checks if you want by writing 0
> > > to /sys/block/ublkb1/integrity/read_verify. However, I'm not sure it's
> > > possible to do this soon enough to take effect before the partition
> > > scan.
> > > We could also use the UBLK_F_NO_AUTO_PART_SCAN feature, once it lands,
> > > to suppress the partition scan and these error messages.
> >
> > UBLK_F_NO_AUTO_PART_SCAN can't avoid the following read failure.
>
> Are you saying the reads aren't coming from the partition scan? What
> else would be issuing reads to the ublk device before fio is run on
> it?
I mean people can run fio read after disk is setup, or udev may read disk
in background.
>
> >
> > I guess the issue can be avoided by adding small superblock to the meta
> > data file, then format it in the 1st time when superblock doesn't exist.
>
> Not sure the complexity of a superblock is necessary. Could just
> initialize all the protection information with valid reftags and guard
> tags.
For verification purpose, the superblock can include only the info if PI meta
file is formatted or not. But it isn't a big deal if the meta backfile can
be formatted with tags in the specified setting.
>
> >
> > This way will make it usable from test/verify purpose.
>
> I'm still not following why it's not "usable" currently. Only blocks
> that have been written to (with protection information generated by
> fio or the kernel) can be read back, but that's how block devices are
> expected to be used. It seems fine to me for test purposes.
> test_loop_08.sh writes to the full ublk device before verifying it, so
> it shouldn't encounter any invalid reftags.
It triggers READ error easily, and will cause noisy report, just like
what I did...
Also you can't run FS test workload...
Thanks,
Ming
© 2016 - 2026 Red Hat, Inc.