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 10_test_fill_and_verify() { 11 fio --name fill --rw randwrite $fio_args > /dev/null 12 if [ $? != 0 ]; then 13 echo "fio fill failed" 14 ERR_CODE=255 15 return 1 16 fi 17 18 fio --name verify --rw randread $fio_args > /dev/null 19 if [ $? != 0 ]; then 20 echo "fio verify failed" 21 ERR_CODE=255 22 return 1 23 fi 24} 25 26_test_corrupted_reftag() { 27 local dd_reftag_args="bs=1 seek=58 count=6 oflag=dsync conv=notrunc status=none" 28 29 # Overwrite 6-byte reftag at offset 48 + 10 = 58 30 dd if=/dev/urandom "of=${UBLK_BACKFILES[1]}" $dd_reftag_args 31 if [ $? != 0 ]; then 32 echo "dd corrupted_reftag failed" 33 ERR_CODE=255 34 return 1 35 fi 36 37 if fio --name corrupted_reftag --rw randread $fio_args > /dev/null 2> "$fio_err"; then 38 echo "fio corrupted_reftag unexpectedly succeeded" 39 ERR_CODE=255 40 return 1 41 fi 42 43 if ! grep -q "$expected_err" "$fio_err"; then 44 echo "fio corrupted_reftag message not found: $expected_err" 45 ERR_CODE=255 46 return 1 47 fi 48 49 # Reset to 0 50 dd if=/dev/zero "of=${UBLK_BACKFILES[1]}" $dd_reftag_args 51 if [ $? != 0 ]; then 52 echo "dd restore corrupted_reftag failed" 53 ERR_CODE=255 54 return 1 55 fi 56} 57 58_test_corrupted_data() { 59 local dd_data_args="bs=512 count=1 oflag=direct,dsync conv=notrunc status=none" 60 61 dd if=/dev/zero "of=${UBLK_BACKFILES[0]}" $dd_data_args 62 if [ $? != 0 ]; then 63 echo "dd corrupted_data failed" 64 ERR_CODE=255 65 return 1 66 fi 67 68 if fio --name corrupted_data --rw randread $fio_args > /dev/null 2> "$fio_err"; then 69 echo "fio corrupted_data 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_data message not found: $expected_err" 76 ERR_CODE=255 77 return 1 78 fi 79} 80 81_prep_test "loop" "end-to-end auto integrity" 82 83_create_backfile 0 256M 84_create_backfile 1 32M # 256M * (64 integrity bytes / 512 data bytes) 85integrity_params="--integrity_capable --integrity_reftag 86 --metadata_size 64 --pi_offset 48 --csum_type nvme" 87dev_id=$(_add_ublk_dev -t loop -u $integrity_params "${UBLK_BACKFILES[@]}") 88_check_add_dev "$TID" $? 89 90fio_args="--ioengine libaio --direct 1 --bsrange 512-1M --iodepth 32 91 --filename /dev/ublkb$dev_id" 92fio_err=$(mktemp "${UBLK_TEST_DIR}"/fio_err_XXXXX) 93ERR_CODE=0 94 95expected_err="Invalid or incomplete multibyte or wide character: read offset=0" 96_test_fill_and_verify && \ 97_test_corrupted_reftag && \ 98_test_corrupted_data 99 100rm -f "$fio_err" 101 102_cleanup_test 103_show_result "$TID" $ERR_CODE 104