1#!/usr/bin/env bash 2 3set -e 4 5testdir=$(readlink -f $(dirname $0)) 6rootdir=$(readlink -f $testdir/../..) 7rpc_py="$rootdir/scripts/rpc.py" 8tmp_file=/tmp/raidrandtest 9 10source $rootdir/test/common/autotest_common.sh 11source $testdir/nbd_common.sh 12 13function raid_unmap_data_verify() { 14 if hash blkdiscard; then 15 local nbd=$1 16 local rpc_server=$2 17 local 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 [ ! -z $raid_pid ]; then 54 killprocess $raid_pid 55 fi 56 57 rm -f $testdir/bdev.conf 58 rm -f $tmp_file 59 print_backtrace 60 exit 1 61} 62 63function raid_function_test() { 64 if [ $(uname -s) = Linux ] && modprobe -n nbd; then 65 local rpc_server=/var/tmp/spdk-raid.sock 66 local conf=$1 67 local nbd=/dev/nbd0 68 local raid_bdev 69 70 if [ ! -e $conf ]; then 71 return 1 72 fi 73 74 modprobe nbd 75 $rootdir/test/app/bdev_svc/bdev_svc -r $rpc_server -i 0 -c ${conf} -L bdev_raid & 76 raid_pid=$! 77 echo "Process raid pid: $raid_pid" 78 waitforlisten $raid_pid $rpc_server 79 80 raid_bdev=$($rootdir/scripts/rpc.py -s $rpc_server get_raid_bdevs online | cut -d ' ' -f 1) 81 if [ $raid_bdev = "" ]; then 82 echo "No raid0 device in SPDK app" 83 return 1 84 fi 85 86 nbd_start_disks $rpc_server $raid_bdev $nbd 87 count=$(nbd_get_count $rpc_server) 88 if [ $count -ne 1 ]; then 89 return -1 90 fi 91 92 raid_unmap_data_verify $nbd $rpc_server 93 94 nbd_stop_disks $rpc_server $nbd 95 count=$(nbd_get_count $rpc_server) 96 if [ $count -ne 0 ]; then 97 return -1 98 fi 99 100 killprocess $raid_pid 101 fi 102 103 return 0 104} 105 106timing_enter bdev_raid 107trap 'on_error_exit;' ERR 108 109cp $testdir/bdev.conf.in $testdir/bdev.conf 110raid_function_test $testdir/bdev.conf 111 112rm -f $testdir/bdev.conf 113rm -f $tmp_file 114report_test_completion "bdev_raid" 115timing_exit bdev_raid 116