Skip to content

Commit 476e7f0

Browse files
calebsanderkawasaki
authored andcommitted
selftests: ublk: add end-to-end integrity test
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 <[email protected]>
1 parent 7e2f2c7 commit 476e7f0

File tree

2 files changed

+112
-0
lines changed

2 files changed

+112
-0
lines changed

tools/testing/selftests/ublk/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ TEST_PROGS += test_loop_04.sh
3535
TEST_PROGS += test_loop_05.sh
3636
TEST_PROGS += test_loop_06.sh
3737
TEST_PROGS += test_loop_07.sh
38+
TEST_PROGS += test_loop_08.sh
3839
TEST_PROGS += test_stripe_01.sh
3940
TEST_PROGS += test_stripe_02.sh
4041
TEST_PROGS += test_stripe_03.sh
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
#!/bin/bash
2+
# SPDX-License-Identifier: GPL-2.0
3+
4+
. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh
5+
6+
if ! _have_program fio; then
7+
exit $UBLK_SKIP_CODE
8+
fi
9+
10+
fio_version=$(fio --version)
11+
if [[ "$fio_version" =~ fio-[0-9]+\.[0-9]+$ ]]; then
12+
echo "Requires development fio version with https://github.com/axboe/fio/pull/1992"
13+
exit $UBLK_SKIP_CODE
14+
fi
15+
16+
TID=loop_08
17+
18+
_prep_test "loop" "end-to-end integrity"
19+
20+
_create_backfile 0 256M
21+
_create_backfile 1 32M # 256M * (64 integrity bytes / 512 data bytes)
22+
integrity_params="--integrity_capable --integrity_reftag
23+
--metadata_size 64 --pi_offset 56 --csum_type t10dif"
24+
dev_id=$(_add_ublk_dev -t loop -u $integrity_params "${UBLK_BACKFILES[@]}")
25+
_check_add_dev $TID $?
26+
27+
# 1M * (64 integrity bytes / 512 data bytes) = 128K
28+
fio_args="--ioengine io_uring --direct 1 --bsrange 512-1M --iodepth 32
29+
--md_per_io_size 128K --pi_act 0 --pi_chk GUARD,REFTAG,APPTAG
30+
--filename /dev/ublkb$dev_id"
31+
fio --name fill --rw randwrite $fio_args > /dev/null
32+
err=$?
33+
if [ $err != 0 ]; then
34+
echo "fio fill failed"
35+
_show_result $TID $err
36+
fi
37+
38+
fio --name verify --rw randread $fio_args > /dev/null
39+
err=$?
40+
if [ $err != 0 ]; then
41+
echo "fio verify failed"
42+
_show_result $TID $err
43+
fi
44+
45+
fio_err=$(mktemp fio_err_XXXXX)
46+
47+
# Overwrite 4-byte reftag at offset 56 + 4 = 60
48+
dd_reftag_args="bs=1 seek=60 count=4 oflag=dsync conv=notrunc status=none"
49+
dd if=/dev/urandom "of=${UBLK_BACKFILES[1]}" $dd_reftag_args
50+
err=$?
51+
if [ $err != 0 ]; then
52+
echo "dd corrupted_reftag failed"
53+
rm -f "$fio_err"
54+
_show_result $TID $err
55+
fi
56+
if fio --name corrupted_reftag --rw randread $fio_args > /dev/null 2> "$fio_err"; then
57+
echo "fio corrupted_reftag unexpectedly succeeded"
58+
rm -f "$fio_err"
59+
_show_result $TID 255
60+
fi
61+
expected_err="REFTAG compare error: LBA: 0 Expected=0, Actual="
62+
if ! grep -q "$expected_err" "$fio_err"; then
63+
echo "fio corrupted_reftag message not found: $expected_err"
64+
rm -f "$fio_err"
65+
_show_result $TID 255
66+
fi
67+
# Reset to 0
68+
dd if=/dev/zero "of=${UBLK_BACKFILES[1]}" $dd_reftag_args
69+
err=$?
70+
if [ $err != 0 ]; then
71+
echo "dd restore corrupted_reftag failed"
72+
rm -f "$fio_err"
73+
_show_result $TID $err
74+
fi
75+
76+
dd_data_args="bs=512 count=1 oflag=direct,dsync conv=notrunc status=none"
77+
dd if=/dev/zero "of=${UBLK_BACKFILES[0]}" $dd_data_args
78+
err=$?
79+
if [ $err != 0 ]; then
80+
echo "dd corrupted_data failed"
81+
rm -f "$fio_err"
82+
_show_result $TID $err
83+
fi
84+
if fio --name corrupted_data --rw randread $fio_args > /dev/null 2> "$fio_err"; then
85+
echo "fio corrupted_data unexpectedly succeeded"
86+
rm -f "$fio_err"
87+
_show_result $TID 255
88+
fi
89+
expected_err="Guard compare error: LBA: 0 Expected=0, Actual="
90+
if ! grep -q "$expected_err" "$fio_err"; then
91+
echo "fio corrupted_data message not found: $expected_err"
92+
rm -f "$fio_err"
93+
_show_result $TID 255
94+
fi
95+
96+
if fio --name bad_apptag --rw randread $fio_args --apptag 0x4321 > /dev/null 2> "$fio_err"; then
97+
echo "fio bad_apptag unexpectedly succeeded"
98+
rm -f "$fio_err"
99+
_show_result $TID 255
100+
fi
101+
expected_err="APPTAG compare error: LBA: [0-9]* Expected=4321, Actual=1234"
102+
if ! grep -q "$expected_err" "$fio_err"; then
103+
echo "fio bad_apptag message not found: $expected_err"
104+
rm -f "$fio_err"
105+
_show_result $TID 255
106+
fi
107+
108+
rm -f "$fio_err"
109+
110+
_cleanup_test
111+
_show_result $TID 0

0 commit comments

Comments
 (0)