xref: /spdk/test/bdev/nbd_common.sh (revision d987d777d6b8ce05f11cb1d90f1241bfecfc9af4)
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