@@ -13,98 +13,129 @@ if [[ "$fio_version" =~ fio-[0-9]+\.[0-9]+$ ]]; then
1313 exit $UBLK_SKIP_CODE
1414fi
1515
16+ ERR_CODE=0
1617
17- _prep_test " loop" " end-to-end integrity"
18+ # Global variables set during device setup
19+ dev_id=" "
20+ fio_args=" "
21+ fio_err=" "
1822
19- _create_backfile 0 256M
20- _create_backfile 1 32M # 256M * (64 integrity bytes / 512 data bytes)
21- integrity_params=" --integrity_capable --integrity_reftag
22- --metadata_size 64 --pi_offset 56 --csum_type t10dif"
23- dev_id=$( _add_ublk_dev -t loop -u $integrity_params " ${UBLK_BACKFILES[@]} " )
24- _check_add_dev $TID $?
25-
26- # 1M * (64 integrity bytes / 512 data bytes) = 128K
27- fio_args=" --ioengine io_uring --direct 1 --bsrange 512-1M --iodepth 32
28- --md_per_io_size 128K --pi_act 0 --pi_chk GUARD,REFTAG,APPTAG
29- --filename /dev/ublkb$dev_id "
30- fio --name fill --rw randwrite $fio_args > /dev/null
31- err=$?
32- if [ $err != 0 ]; then
33- echo " fio fill failed"
34- _show_result $TID $err
35- fi
23+ _setup_device () {
24+ _create_backfile 0 256M
25+ _create_backfile 1 32M # 256M * (64 integrity bytes / 512 data bytes)
3626
37- fio --name verify --rw randread $fio_args > /dev/null
38- err=$?
39- if [ $err != 0 ]; then
40- echo " fio verify failed"
41- _show_result $TID $err
42- fi
27+ local integrity_params=" --integrity_capable --integrity_reftag
28+ --metadata_size 64 --pi_offset 56 --csum_type t10dif"
29+ dev_id=$( _add_ublk_dev -t loop -u $integrity_params " ${UBLK_BACKFILES[@]} " )
30+ _check_add_dev " $TID " $?
4331
44- fio_err=$( mktemp fio_err_XXXXX)
32+ # 1M * (64 integrity bytes / 512 data bytes) = 128K
33+ fio_args=" --ioengine io_uring --direct 1 --bsrange 512-1M --iodepth 32
34+ --md_per_io_size 128K --pi_act 0 --pi_chk GUARD,REFTAG,APPTAG
35+ --filename /dev/ublkb$dev_id "
4536
46- # Overwrite 4-byte reftag at offset 56 + 4 = 60
47- dd_reftag_args=" bs=1 seek=60 count=4 oflag=dsync conv=notrunc status=none"
48- dd if=/dev/urandom " of=${UBLK_BACKFILES[1]} " $dd_reftag_args
49- err=$?
50- if [ $err != 0 ]; then
51- echo " dd corrupted_reftag failed"
52- rm -f " $fio_err "
53- _show_result $TID $err
54- fi
55- if fio --name corrupted_reftag --rw randread $fio_args > /dev/null 2> " $fio_err " ; then
56- echo " fio corrupted_reftag unexpectedly succeeded"
57- rm -f " $fio_err "
58- _show_result $TID 255
59- fi
60- expected_err=" REFTAG compare error: LBA: 0 Expected=0, Actual="
61- if ! grep -q " $expected_err " " $fio_err " ; then
62- echo " fio corrupted_reftag message not found: $expected_err "
63- rm -f " $fio_err "
64- _show_result $TID 255
65- fi
66- # Reset to 0
67- dd if=/dev/zero " of=${UBLK_BACKFILES[1]} " $dd_reftag_args
68- err=$?
69- if [ $err != 0 ]; then
70- echo " dd restore corrupted_reftag failed"
71- rm -f " $fio_err "
72- _show_result $TID $err
73- fi
37+ fio_err=$( mktemp " ${UBLK_TEST_DIR} " /fio_err_XXXXX)
38+ }
7439
75- dd_data_args=" bs=512 count=1 oflag=direct,dsync conv=notrunc status=none"
76- dd if=/dev/zero " of=${UBLK_BACKFILES[0]} " $dd_data_args
77- err=$?
78- if [ $err != 0 ]; then
79- echo " dd corrupted_data failed"
80- rm -f " $fio_err "
81- _show_result $TID $err
82- fi
83- if fio --name corrupted_data --rw randread $fio_args > /dev/null 2> " $fio_err " ; then
84- echo " fio corrupted_data unexpectedly succeeded"
85- rm -f " $fio_err "
86- _show_result $TID 255
87- fi
88- expected_err=" Guard compare error: LBA: 0 Expected=0, Actual="
89- if ! grep -q " $expected_err " " $fio_err " ; then
90- echo " fio corrupted_data message not found: $expected_err "
91- rm -f " $fio_err "
92- _show_result $TID 255
93- fi
40+ _test_fill_and_verify () {
41+ fio --name fill --rw randwrite $fio_args > /dev/null
42+ if [ $? != 0 ]; then
43+ echo " fio fill failed"
44+ ERR_CODE=255
45+ return 1
46+ fi
9447
95- if fio --name bad_apptag --rw randread $fio_args --apptag 0x4321 > /dev/null 2> " $fio_err " ; then
96- echo " fio bad_apptag unexpectedly succeeded"
97- rm -f " $fio_err "
98- _show_result $TID 255
99- fi
100- expected_err=" APPTAG compare error: LBA: [0-9]* Expected=4321, Actual=1234"
101- if ! grep -q " $expected_err " " $fio_err " ; then
102- echo " fio bad_apptag message not found: $expected_err "
103- rm -f " $fio_err "
104- _show_result $TID 255
105- fi
48+ fio --name verify --rw randread $fio_args > /dev/null
49+ if [ $? != 0 ]; then
50+ echo " fio verify failed"
51+ ERR_CODE=255
52+ return 1
53+ fi
54+ }
55+
56+ _test_corrupted_reftag () {
57+ local dd_reftag_args=" bs=1 seek=60 count=4 oflag=dsync conv=notrunc status=none"
58+ local expected_err=" REFTAG compare error: LBA: 0 Expected=0, Actual="
59+
60+ # Overwrite 4-byte reftag at offset 56 + 4 = 60
61+ dd if=/dev/urandom " of=${UBLK_BACKFILES[1]} " $dd_reftag_args
62+ if [ $? != 0 ]; then
63+ echo " dd corrupted_reftag failed"
64+ ERR_CODE=255
65+ return 1
66+ fi
67+
68+ if fio --name corrupted_reftag --rw randread $fio_args > /dev/null 2> " $fio_err " ; then
69+ echo " fio corrupted_reftag unexpectedly succeeded"
70+ ERR_CODE=255
71+ return 1
72+ fi
73+
74+ if ! grep -q " $expected_err " " $fio_err " ; then
75+ echo " fio corrupted_reftag message not found: $expected_err "
76+ ERR_CODE=255
77+ return 1
78+ fi
79+
80+ # Reset to 0
81+ dd if=/dev/zero " of=${UBLK_BACKFILES[1]} " $dd_reftag_args
82+ if [ $? != 0 ]; then
83+ echo " dd restore corrupted_reftag failed"
84+ ERR_CODE=255
85+ return 1
86+ fi
87+ }
88+
89+ _test_corrupted_data () {
90+ local dd_data_args=" bs=512 count=1 oflag=direct,dsync conv=notrunc status=none"
91+ local expected_err=" Guard compare error: LBA: 0 Expected=0, Actual="
92+
93+ dd if=/dev/zero " of=${UBLK_BACKFILES[0]} " $dd_data_args
94+ if [ $? != 0 ]; then
95+ echo " dd corrupted_data failed"
96+ ERR_CODE=255
97+ return 1
98+ fi
99+
100+ if fio --name corrupted_data --rw randread $fio_args > /dev/null 2> " $fio_err " ; then
101+ echo " fio corrupted_data unexpectedly succeeded"
102+ ERR_CODE=255
103+ return 1
104+ fi
105+
106+ if ! grep -q " $expected_err " " $fio_err " ; then
107+ echo " fio corrupted_data message not found: $expected_err "
108+ ERR_CODE=255
109+ return 1
110+ fi
111+ }
112+
113+ _test_bad_apptag () {
114+ local expected_err=" APPTAG compare error: LBA: [0-9]* Expected=4321, Actual=1234"
115+
116+ if fio --name bad_apptag --rw randread $fio_args --apptag 0x4321 > /dev/null 2> " $fio_err " ; then
117+ echo " fio bad_apptag unexpectedly succeeded"
118+ ERR_CODE=255
119+ return 1
120+ fi
121+
122+ if ! grep -q " $expected_err " " $fio_err " ; then
123+ echo " fio bad_apptag message not found: $expected_err "
124+ ERR_CODE=255
125+ return 1
126+ fi
127+ }
128+
129+ _prep_test " loop" " end-to-end integrity"
130+
131+ _setup_device
132+
133+ _test_fill_and_verify && \
134+ _test_corrupted_reftag && \
135+ _test_corrupted_data && \
136+ _test_bad_apptag
106137
107138rm -f " $fio_err "
108139
109140_cleanup_test
110- _show_result $TID 0
141+ _show_result " $TID " $ERR_CODE
0 commit comments