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