1#!/usr/bin/env bash 2# SPDX-License-Identifier: BSD-3-Clause 3# Copyright (C) 2018 Intel Corporation 4# All rights reserved. 5# 6set -xe 7 8testdir=$(readlink -f $(dirname $0)) 9rootdir=$(readlink -f $testdir/../../..) 10source $rootdir/test/common/autotest_common.sh 11source $rootdir/test/vhost/common.sh 12source $rootdir/test/bdev/nbd_common.sh 13 14rpc_py="$rootdir/scripts/rpc.py -s $(get_vhost_dir 0)/rpc.sock" 15vm_no="0" 16 17function err_clean() { 18 trap - ERR 19 print_backtrace 20 set +e 21 error "Error on $1 $2" 22 vm_kill_all 23 $rpc_py vhost_scsi_controller_remove_target naa.vhost_vm.$vm_no 0 24 $rpc_py vhost_delete_controller naa.vhost_vm.$vm_no 25 $rpc_py bdev_lvol_delete $lvb_u 26 $rpc_py bdev_lvol_delete_lvstore -u $lvs_u 27 vhost_kill 0 28 exit 1 29} 30 31function usage() { 32 [[ -n $2 ]] && ( 33 echo "$2" 34 echo "" 35 ) 36 echo "Usage: $(basename $1) vm_image=PATH [-h|--help]" 37 echo "-h, --help Print help and exit" 38 echo " --vm_image=PATH Path to VM image used in these tests" 39} 40 41while getopts 'h-:' optchar; do 42 case "$optchar" in 43 -) 44 case "$OPTARG" in 45 vm_image=*) os_image="${OPTARG#*=}" ;; 46 *) usage $0 echo "Invalid argument '$OPTARG'" && exit 1 ;; 47 esac 48 ;; 49 h) usage $0 && exit 0 ;; 50 *) usage $0 "Invalid argument '$optchar'" && exit 1 ;; 51 esac 52done 53 54if [[ $EUID -ne 0 ]]; then 55 echo "INFO: Go away user come back as root" 56 exit 1 57fi 58 59if [[ -z $os_image ]]; then 60 echo "No path to os image is given" 61 exit 1 62fi 63 64vhosttestinit 65 66trap 'err_clean "${FUNCNAME}" "${LINENO}"' ERR 67timing_enter start_vhost 68vhost_run -n 0 69timing_exit start_vhost 70 71timing_enter create_lvol 72 73nvme_bdev=$($rpc_py bdev_get_bdevs -b Nvme0n1) 74nvme_bdev_bs=$(jq ".[] .block_size" <<< "$nvme_bdev") 75nvme_bdev_name=$(jq ".[] .name" <<< "$nvme_bdev") 76if [[ $nvme_bdev_bs != 512 ]]; then 77 echo "ERROR: Your device $nvme_bdev_name block size is $nvme_bdev_bs, but should be 512 bytes." 78 false 79fi 80 81lvb_size=20000 # MB 82lvs_u=$($rpc_py bdev_lvol_create_lvstore Nvme0n1 lvs0) 83lvb_u=$($rpc_py bdev_lvol_create -u $lvs_u lvb0 "$lvb_size") 84timing_exit create_lvol 85 86timing_enter convert_vm_image 87modprobe nbd 88trap 'nbd_stop_disks $(get_vhost_dir 0)/rpc.sock /dev/nbd0; err_clean "${FUNCNAME}" "${LINENO}"' ERR 89nbd_start_disks "$(get_vhost_dir 0)/rpc.sock" $lvb_u /dev/nbd0 90qemu-img convert $os_image -O raw /dev/nbd0 91sync 92nbd_stop_disks $(get_vhost_dir 0)/rpc.sock /dev/nbd0 93sleep 1 94timing_exit convert_vm_image 95 96trap 'err_clean "${FUNCNAME}" "${LINENO}"' ERR 97timing_enter create_vhost_controller 98$rpc_py vhost_create_scsi_controller naa.vhost_vm.$vm_no 99$rpc_py vhost_scsi_controller_add_target naa.vhost_vm.$vm_no 0 $lvb_u 100timing_exit create_vhost_controller 101 102timing_enter setup_vm 103vm_setup --disk-type=spdk_vhost_scsi --force=$vm_no --disks="vhost_vm" --spdk-boot="vhost_vm" 104vm_run $vm_no 105vm_wait_for_boot 300 $vm_no 106timing_exit setup_vm 107 108start_part_sector=0 drive_size=0 part_id=0 pt_type="" 109while IFS=":" read -r id start end _ _ pt _; do 110 start=${start%s} end=${end%s} 111 [[ $id == /dev/sda ]] && drive_size=$start && pt_type=$pt 112 [[ $id =~ ^[0-9]+$ ]] && start_part_sector=$((end + 1)) && part_id=$id 113done < <(vm_exec "$vm_no" "parted /dev/sda -ms unit s print") 114# Use $id to determine next available part id. Fail if it was not set. 115((part_id++)) 116 117# If we didn't get a start sector for the partition then probably something is amiss. Also, 118# check if size of the drive matches size used for creating lvb and if not, fail. 119((start_part_sector > 0)) && (((drive_size * 512) >> 20 == lvb_size)) 120# Since we extend the disk image, we need to make sure that in case of GPT its data stays at 121# the end of the disk. Otherwise, the remaining space won't be available. 122[[ $pt_type == gpt ]] && vm_exec "$vm_no" "sgdisk -e /dev/sda" 123 124timing_enter run_vm_cmd 125vm_exec $vm_no "parted -s /dev/sda mkpart primary ${start_part_sector}s 100%; sleep 1; partprobe" 126vm_exec $vm_no "mkfs.ext4 -F /dev/sda${part_id}; mkdir -p /mnt/sda${part_id}test; mount /dev/sda${part_id} /mnt/sda${part_id}test;" 127vm_exec $vm_no "fio --name=integrity --bsrange=4k-512k --iodepth=128 --numjobs=1 --direct=1 \ 128 --thread=1 --group_reporting=1 --rw=randrw --rwmixread=70 --filename=/mnt/sda${part_id}test/test_file \ 129 --verify=md5 --do_verify=1 --verify_backlog=1024 --fsync_on_close=1 --runtime=20 \ 130 --time_based=1 --size=1024m --verify_state_save=0" 131vm_exec $vm_no "umount /mnt/sda${part_id}test; rm -rf /mnt/sda${part_id}test" 132alignment_offset=$(vm_exec $vm_no "cat /sys/block/sda/sda1/alignment_offset") 133echo "alignment_offset: $alignment_offset" 134timing_exit run_vm_cmd 135 136vm_shutdown_all 137 138timing_enter clean_vhost 139$rpc_py vhost_scsi_controller_remove_target naa.vhost_vm.$vm_no 0 140$rpc_py vhost_delete_controller naa.vhost_vm.$vm_no 141$rpc_py bdev_lvol_delete $lvb_u 142$rpc_py bdev_lvol_delete_lvstore -u $lvs_u 143timing_exit clean_vhost 144 145vhost_kill 0 146 147vhosttestfini 148