1*1cdf3b28SCaleb Sander Mateos#!/bin/bash 2*1cdf3b28SCaleb Sander Mateos# SPDX-License-Identifier: GPL-2.0 3*1cdf3b28SCaleb Sander Mateos 4*1cdf3b28SCaleb Sander Mateos. "$(cd "$(dirname "$0")" && pwd)"/test_common.sh 5*1cdf3b28SCaleb Sander Mateos 6*1cdf3b28SCaleb Sander Mateosif ! _have_program fio; then 7*1cdf3b28SCaleb Sander Mateos exit $UBLK_SKIP_CODE 8*1cdf3b28SCaleb Sander Mateosfi 9*1cdf3b28SCaleb Sander Mateos 10*1cdf3b28SCaleb Sander Mateos_test_fill_and_verify() { 11*1cdf3b28SCaleb Sander Mateos fio --name fill --rw randwrite $fio_args > /dev/null 12*1cdf3b28SCaleb Sander Mateos if [ $? != 0 ]; then 13*1cdf3b28SCaleb Sander Mateos echo "fio fill failed" 14*1cdf3b28SCaleb Sander Mateos ERR_CODE=255 15*1cdf3b28SCaleb Sander Mateos return 1 16*1cdf3b28SCaleb Sander Mateos fi 17*1cdf3b28SCaleb Sander Mateos 18*1cdf3b28SCaleb Sander Mateos fio --name verify --rw randread $fio_args > /dev/null 19*1cdf3b28SCaleb Sander Mateos if [ $? != 0 ]; then 20*1cdf3b28SCaleb Sander Mateos echo "fio verify failed" 21*1cdf3b28SCaleb Sander Mateos ERR_CODE=255 22*1cdf3b28SCaleb Sander Mateos return 1 23*1cdf3b28SCaleb Sander Mateos fi 24*1cdf3b28SCaleb Sander Mateos} 25*1cdf3b28SCaleb Sander Mateos 26*1cdf3b28SCaleb Sander Mateos_test_corrupted_reftag() { 27*1cdf3b28SCaleb Sander Mateos local dd_reftag_args="bs=1 seek=58 count=6 oflag=dsync conv=notrunc status=none" 28*1cdf3b28SCaleb Sander Mateos 29*1cdf3b28SCaleb Sander Mateos # Overwrite 6-byte reftag at offset 48 + 10 = 58 30*1cdf3b28SCaleb Sander Mateos dd if=/dev/urandom "of=${UBLK_BACKFILES[1]}" $dd_reftag_args 31*1cdf3b28SCaleb Sander Mateos if [ $? != 0 ]; then 32*1cdf3b28SCaleb Sander Mateos echo "dd corrupted_reftag failed" 33*1cdf3b28SCaleb Sander Mateos ERR_CODE=255 34*1cdf3b28SCaleb Sander Mateos return 1 35*1cdf3b28SCaleb Sander Mateos fi 36*1cdf3b28SCaleb Sander Mateos 37*1cdf3b28SCaleb Sander Mateos if fio --name corrupted_reftag --rw randread $fio_args > /dev/null 2> "$fio_err"; then 38*1cdf3b28SCaleb Sander Mateos echo "fio corrupted_reftag unexpectedly succeeded" 39*1cdf3b28SCaleb Sander Mateos ERR_CODE=255 40*1cdf3b28SCaleb Sander Mateos return 1 41*1cdf3b28SCaleb Sander Mateos fi 42*1cdf3b28SCaleb Sander Mateos 43*1cdf3b28SCaleb Sander Mateos if ! grep -q "$expected_err" "$fio_err"; then 44*1cdf3b28SCaleb Sander Mateos echo "fio corrupted_reftag message not found: $expected_err" 45*1cdf3b28SCaleb Sander Mateos ERR_CODE=255 46*1cdf3b28SCaleb Sander Mateos return 1 47*1cdf3b28SCaleb Sander Mateos fi 48*1cdf3b28SCaleb Sander Mateos 49*1cdf3b28SCaleb Sander Mateos # Reset to 0 50*1cdf3b28SCaleb Sander Mateos dd if=/dev/zero "of=${UBLK_BACKFILES[1]}" $dd_reftag_args 51*1cdf3b28SCaleb Sander Mateos if [ $? != 0 ]; then 52*1cdf3b28SCaleb Sander Mateos echo "dd restore corrupted_reftag failed" 53*1cdf3b28SCaleb Sander Mateos ERR_CODE=255 54*1cdf3b28SCaleb Sander Mateos return 1 55*1cdf3b28SCaleb Sander Mateos fi 56*1cdf3b28SCaleb Sander Mateos} 57*1cdf3b28SCaleb Sander Mateos 58*1cdf3b28SCaleb Sander Mateos_test_corrupted_data() { 59*1cdf3b28SCaleb Sander Mateos local dd_data_args="bs=512 count=1 oflag=direct,dsync conv=notrunc status=none" 60*1cdf3b28SCaleb Sander Mateos 61*1cdf3b28SCaleb Sander Mateos dd if=/dev/zero "of=${UBLK_BACKFILES[0]}" $dd_data_args 62*1cdf3b28SCaleb Sander Mateos if [ $? != 0 ]; then 63*1cdf3b28SCaleb Sander Mateos echo "dd corrupted_data failed" 64*1cdf3b28SCaleb Sander Mateos ERR_CODE=255 65*1cdf3b28SCaleb Sander Mateos return 1 66*1cdf3b28SCaleb Sander Mateos fi 67*1cdf3b28SCaleb Sander Mateos 68*1cdf3b28SCaleb Sander Mateos if fio --name corrupted_data --rw randread $fio_args > /dev/null 2> "$fio_err"; then 69*1cdf3b28SCaleb Sander Mateos echo "fio corrupted_data unexpectedly succeeded" 70*1cdf3b28SCaleb Sander Mateos ERR_CODE=255 71*1cdf3b28SCaleb Sander Mateos return 1 72*1cdf3b28SCaleb Sander Mateos fi 73*1cdf3b28SCaleb Sander Mateos 74*1cdf3b28SCaleb Sander Mateos if ! grep -q "$expected_err" "$fio_err"; then 75*1cdf3b28SCaleb Sander Mateos echo "fio corrupted_data message not found: $expected_err" 76*1cdf3b28SCaleb Sander Mateos ERR_CODE=255 77*1cdf3b28SCaleb Sander Mateos return 1 78*1cdf3b28SCaleb Sander Mateos fi 79*1cdf3b28SCaleb Sander Mateos} 80*1cdf3b28SCaleb Sander Mateos 81*1cdf3b28SCaleb Sander Mateos_prep_test "loop" "end-to-end auto integrity" 82*1cdf3b28SCaleb Sander Mateos 83*1cdf3b28SCaleb Sander Mateos_create_backfile 0 256M 84*1cdf3b28SCaleb Sander Mateos_create_backfile 1 32M # 256M * (64 integrity bytes / 512 data bytes) 85*1cdf3b28SCaleb Sander Mateosintegrity_params="--integrity_capable --integrity_reftag 86*1cdf3b28SCaleb Sander Mateos --metadata_size 64 --pi_offset 48 --csum_type nvme" 87*1cdf3b28SCaleb Sander Mateosdev_id=$(_add_ublk_dev -t loop -u $integrity_params "${UBLK_BACKFILES[@]}") 88*1cdf3b28SCaleb Sander Mateos_check_add_dev "$TID" $? 89*1cdf3b28SCaleb Sander Mateos 90*1cdf3b28SCaleb Sander Mateosfio_args="--ioengine libaio --direct 1 --bsrange 512-1M --iodepth 32 91*1cdf3b28SCaleb Sander Mateos --filename /dev/ublkb$dev_id" 92*1cdf3b28SCaleb Sander Mateosfio_err=$(mktemp "${UBLK_TEST_DIR}"/fio_err_XXXXX) 93*1cdf3b28SCaleb Sander MateosERR_CODE=0 94*1cdf3b28SCaleb Sander Mateos 95*1cdf3b28SCaleb Sander Mateosexpected_err="Invalid or incomplete multibyte or wide character: read offset=0" 96*1cdf3b28SCaleb Sander Mateos_test_fill_and_verify && \ 97*1cdf3b28SCaleb Sander Mateos_test_corrupted_reftag && \ 98*1cdf3b28SCaleb Sander Mateos_test_corrupted_data 99*1cdf3b28SCaleb Sander Mateos 100*1cdf3b28SCaleb Sander Mateosrm -f "$fio_err" 101*1cdf3b28SCaleb Sander Mateos 102*1cdf3b28SCaleb Sander Mateos_cleanup_test 103*1cdf3b28SCaleb Sander Mateos_show_result "$TID" $ERR_CODE 104