1#!/usr/bin/env bash 2 3testdir=$(readlink -f $(dirname $0)) 4rootdir=$(readlink -f $testdir/../..) 5rpc_server=/var/tmp/spdk-raid.sock 6rpc_py="$rootdir/scripts/rpc.py -s $rpc_server" 7tmp_file=$SPDK_TEST_STORAGE/raidrandtest 8 9source $rootdir/test/common/autotest_common.sh 10source $testdir/nbd_common.sh 11 12function raid_unmap_data_verify() { 13 if hash blkdiscard; then 14 local nbd=$1 15 local rpc_server=$2 16 local blksize 17 blksize=$(lsblk -o LOG-SEC $nbd | grep -v LOG-SEC | cut -d ' ' -f 5) 18 local rw_blk_num=4096 19 local rw_len=$((blksize * rw_blk_num)) 20 local unmap_blk_offs=(0 1028 321) 21 local unmap_blk_nums=(128 2035 456) 22 local unmap_off 23 local unmap_len 24 25 # data write 26 dd if=/dev/urandom of=$tmp_file bs=$blksize count=$rw_blk_num 27 dd if=$tmp_file of=$nbd bs=$blksize count=$rw_blk_num oflag=direct 28 blockdev --flushbufs $nbd 29 30 # confirm random data is written correctly in raid0 device 31 cmp -b -n $rw_len $tmp_file $nbd 32 33 for ((i = 0; i < ${#unmap_blk_offs[@]}; i++)); do 34 unmap_off=$((blksize * ${unmap_blk_offs[$i]})) 35 unmap_len=$((blksize * ${unmap_blk_nums[$i]})) 36 37 # data unmap on tmp_file 38 dd if=/dev/zero of=$tmp_file bs=$blksize seek=${unmap_blk_offs[$i]} count=${unmap_blk_nums[$i]} conv=notrunc 39 40 # data unmap on raid bdev 41 blkdiscard -o $unmap_off -l $unmap_len $nbd 42 blockdev --flushbufs $nbd 43 44 # data verify after unmap 45 cmp -b -n $rw_len $tmp_file $nbd 46 done 47 fi 48 49 return 0 50} 51 52function on_error_exit() { 53 if [ -n "$raid_pid" ]; then 54 killprocess $raid_pid 55 fi 56 57 rm -f $tmp_file 58 print_backtrace 59 exit 1 60} 61 62function configure_raid_bdev() { 63 rm -rf $testdir/rpcs.txt 64 65 cat <<- EOL >> $testdir/rpcs.txt 66 bdev_malloc_create 32 512 -b Base_1 67 bdev_malloc_create 32 512 -b Base_2 68 bdev_raid_create -z 64 -r 0 -b "Base_1 Base_2" -n raid0 69 EOL 70 $rpc_py < $testdir/rpcs.txt 71 72 rm -rf $testdir/rpcs.txt 73} 74 75function raid_function_test() { 76 if [ $(uname -s) = Linux ] && modprobe -n nbd; then 77 local nbd=/dev/nbd0 78 local raid_bdev 79 80 modprobe nbd 81 $rootdir/test/app/bdev_svc/bdev_svc -r $rpc_server -i 0 -L bdev_raid & 82 raid_pid=$! 83 echo "Process raid pid: $raid_pid" 84 waitforlisten $raid_pid $rpc_server 85 86 configure_raid_bdev 87 raid_bdev=$($rpc_py bdev_raid_get_bdevs online | cut -d ' ' -f 1) 88 if [ $raid_bdev = "" ]; then 89 echo "No raid0 device in SPDK app" 90 return 1 91 fi 92 93 nbd_start_disks $rpc_server $raid_bdev $nbd 94 count=$(nbd_get_count $rpc_server) 95 if [ $count -ne 1 ]; then 96 return 1 97 fi 98 99 raid_unmap_data_verify $nbd $rpc_server 100 101 nbd_stop_disks $rpc_server $nbd 102 count=$(nbd_get_count $rpc_server) 103 if [ $count -ne 0 ]; then 104 return 1 105 fi 106 107 killprocess $raid_pid 108 else 109 echo "skipping bdev raid tests." 110 fi 111 112 return 0 113} 114 115trap 'on_error_exit;' ERR 116 117raid_function_test 118 119rm -f $tmp_file 120