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