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