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