1# SPDX-License-Identifier: BSD-3-Clause 2# Copyright (C) 2017 Intel Corporation 3# All rights reserved. 4# 5 6set -e 7 8function nbd_start_disks() { 9 local rpc_server=$1 10 local bdev_list=($2) 11 local nbd_list=($3) 12 local i 13 14 for ((i = 0; i < ${#nbd_list[@]}; i++)); do 15 $rootdir/scripts/rpc.py -s $rpc_server nbd_start_disk ${bdev_list[$i]} ${nbd_list[$i]} 16 # Wait for nbd device ready 17 waitfornbd $(basename ${nbd_list[$i]}) 18 done 19} 20 21function nbd_start_disks_without_nbd_idx() { 22 local rpc_server=$1 23 local bdev_list=($2) 24 local i 25 local nbd_device 26 27 for ((i = 0; i < ${#bdev_list[@]}; i++)); do 28 nbd_device=$($rootdir/scripts/rpc.py -s $rpc_server nbd_start_disk ${bdev_list[$i]}) 29 # Wait for nbd device ready 30 waitfornbd $(basename ${nbd_device}) 31 done 32} 33 34function waitfornbd_exit() { 35 local nbd_name=$1 36 37 for ((i = 1; i <= 20; i++)); do 38 if grep -q -w $nbd_name /proc/partitions; then 39 sleep 0.1 40 else 41 break 42 fi 43 done 44 45 return 0 46} 47 48function nbd_stop_disks() { 49 local rpc_server=$1 50 local nbd_list=($2) 51 local i 52 53 for i in "${nbd_list[@]}"; do 54 $rootdir/scripts/rpc.py -s $rpc_server nbd_stop_disk $i 55 waitfornbd_exit $(basename $i) 56 done 57} 58 59function nbd_get_count() { 60 # return = count of spdk nbd devices 61 local rpc_server=$1 62 63 nbd_disks_json=$($rootdir/scripts/rpc.py -s $rpc_server nbd_get_disks) 64 nbd_disks_name=$(echo "${nbd_disks_json}" | jq -r '.[] | .nbd_device') 65 count=$(echo "${nbd_disks_name}" | grep -c /dev/nbd || true) 66 echo $count 67} 68 69function nbd_dd_data_verify() { 70 local nbd_list=($1) 71 local operation=$2 72 local tmp_file=$SPDK_TEST_STORAGE/nbdrandtest 73 74 if [ "$operation" = "write" ]; then 75 # data write 76 dd if=/dev/urandom of=$tmp_file bs=4096 count=256 77 for i in "${nbd_list[@]}"; do 78 dd if=$tmp_file of=$i bs=4096 count=256 oflag=direct 79 done 80 elif [ "$operation" = "verify" ]; then 81 # data read and verify 82 for i in "${nbd_list[@]}"; do 83 cmp -b -n 1M $tmp_file $i 84 done 85 rm $tmp_file 86 fi 87} 88 89function nbd_rpc_data_verify() { 90 local rpc_server=$1 91 local bdev_list=($2) 92 local nbd_list=($3) 93 94 nbd_start_disks $rpc_server "${bdev_list[*]}" "${nbd_list[*]}" 95 count=$(nbd_get_count $rpc_server) 96 if [ $count -ne ${#nbd_list[@]} ]; then 97 return 1 98 fi 99 100 nbd_dd_data_verify "${nbd_list[*]}" "write" 101 nbd_dd_data_verify "${nbd_list[*]}" "verify" 102 103 nbd_stop_disks $rpc_server "${nbd_list[*]}" 104 count=$(nbd_get_count $rpc_server) 105 if [ $count -ne 0 ]; then 106 return 1 107 fi 108 109 return 0 110} 111 112function nbd_rpc_start_stop_verify() { 113 local rpc_server=$1 114 local bdev_list=($2) 115 116 nbd_start_disks_without_nbd_idx $rpc_server "${bdev_list[*]}" 117 118 nbd_disks_json=$($rootdir/scripts/rpc.py -s $rpc_server nbd_get_disks) 119 nbd_disks_name=($(echo "${nbd_disks_json}" | jq -r '.[] | .nbd_device')) 120 nbd_stop_disks $rpc_server "${nbd_disks_name[*]}" 121 122 count=$(nbd_get_count $rpc_server) 123 if [ $count -ne 0 ]; then 124 return 1 125 fi 126 127 return 0 128} 129 130function nbd_with_lvol_verify() { 131 local rpc_server=$1 132 local nbd=$2 133 134 $rootdir/scripts/rpc.py -s $rpc_server bdev_malloc_create -b malloc_lvol_verify 16 512 135 $rootdir/scripts/rpc.py -s $rpc_server bdev_lvol_create_lvstore malloc_lvol_verify lvs 136 $rootdir/scripts/rpc.py -s $rpc_server bdev_lvol_create lvol 4 -l lvs 137 $rootdir/scripts/rpc.py -s $rpc_server nbd_start_disk lvs/lvol "$nbd" 138 139 wait_for_nbd_set_capacity "$nbd" 140 141 mkfs.ext4 "$nbd" 142 nbd_stop_disks $rpc_server "$nbd" 143} 144 145function wait_for_nbd_set_capacity() { 146 local nbd=${1##*/} 147 148 [[ -e /sys/block/$nbd/size ]] || return 1 149 150 while (($(< "/sys/block/$nbd/size") == 0)); do 151 sleep 0.1 152 done 153} 154