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