Skip to content

Commit 842b652

Browse files
Ming Leiaxboe
authored andcommitted
selftests: ublk: refactor test_loop_08 into separate functions
Encapsulate each test case in its own function for better organization and maintainability: - _setup_device(): device and backfile initialization - _test_fill_and_verify(): initial data population - _test_corrupted_reftag(): reftag corruption detection test - _test_corrupted_data(): data corruption detection test - _test_bad_apptag(): apptag mismatch detection test Also fix temp file creation to use ${UBLK_TEST_DIR}/fio_err_XXXXX instead of creating in current directory. Signed-off-by: Ming Lei <ming.lei@redhat.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 5af302a commit 842b652

1 file changed

Lines changed: 115 additions & 84 deletions

File tree

tools/testing/selftests/ublk/test_loop_08.sh

Lines changed: 115 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -13,98 +13,129 @@ if [[ "$fio_version" =~ fio-[0-9]+\.[0-9]+$ ]]; then
1313
exit $UBLK_SKIP_CODE
1414
fi
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

107138
rm -f "$fio_err"
108139

109140
_cleanup_test
110-
_show_result $TID 0
141+
_show_result "$TID" $ERR_CODE

0 commit comments

Comments
 (0)