xref: /linux/tools/testing/selftests/ublk/test_integrity_02.sh (revision 0c00ed308d0559fc216be0442a3df124e9e13533)
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh
5
6if ! _have_program fio; then
7	exit $UBLK_SKIP_CODE
8fi
9
10fio_version=$(fio --version)
11if [[ "$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
14fi
15
16ERR_CODE=0
17
18# Global variables set during device setup
19dev_id=""
20fio_args=""
21fio_err=""
22
23_setup_device() {
24	_create_backfile 0 256M
25	_create_backfile 1 32M # 256M * (64 integrity bytes / 512 data bytes)
26
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" $?
31
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"
36
37	fio_err=$(mktemp "${UBLK_TEST_DIR}"/fio_err_XXXXX)
38}
39
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
47
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
137
138rm -f "$fio_err"
139
140_cleanup_test
141_show_result "$TID" $ERR_CODE
142