xref: /spdk/test/nvme/cuse/nvme_ns_manage_cuse.sh (revision b3bec07939ebe2ea2e0c43931705d32aa9e06719)
1#!/usr/bin/env bash
2#  SPDX-License-Identifier: BSD-3-Clause
3#  Copyright (C) 2020 Intel Corporation
4#  All rights reserved.
5#
6testdir=$(readlink -f $(dirname $0))
7rootdir=$(readlink -f $testdir/../../..)
8source "$testdir/common.sh"
9
10$rootdir/scripts/setup.sh reset
11scan_nvme_ctrls
12
13# Find bdf that supports Namespace Management
14if ! nvme_name=$(get_nvme_with_ns_management); then
15	echo "No NVMe device supporting Namespace management found"
16	$rootdir/scripts/setup.sh
17	exit 1
18fi
19
20nvme_dev=/dev/${nvme_name}
21bdf=${bdfs["$nvme_name"]}
22nsids=($(get_nvme_nss "$nvme_name"))
23
24# Detect supported features and configuration
25oaes=$(get_nvme_ctrl_feature "$nvme_name" oaes)
26aer_ns_change=$((oaes & 0x100))
27cntlid=$(get_nvme_ctrl_feature "$nvme_name")
28
29function reset_nvme_if_aer_unsupported() {
30	if [[ "$aer_ns_change" -eq "0" ]]; then
31		sleep 1
32		$NVME_CMD reset "$1" || true
33	fi
34}
35
36function remove_all_namespaces() {
37	info_print "delete all namespaces"
38	# Cant globally detach all namespaces ... must do so one by one
39	for nsid in "${nsids[@]}"; do
40		info_print "removing nsid=${nsid}"
41		$NVME_CMD detach-ns ${nvme_dev} -n ${nsid} -c ${cntlid} || true
42		$NVME_CMD delete-ns ${nvme_dev} -n ${nsid} || true
43	done
44}
45
46function clean_up() {
47	"$rootdir/scripts/setup.sh" reset
48	remove_all_namespaces
49
50	echo "Restoring $nvme_dev..."
51	for nsid in "${nsids[@]}"; do
52		ncap=$(get_nvme_ns_feature "$nvme_name" "$nsid" ncap)
53		nsze=$(get_nvme_ns_feature "$nvme_name" "$nsid" nsze)
54		lbaf=$(get_active_lbaf "$nvme_name" "$nsid")
55		$NVME_CMD create-ns ${nvme_dev} -s ${nsze} -c ${ncap} -f ${lbaf}
56		$NVME_CMD attach-ns ${nvme_dev} -n ${nsid} -c ${cntlid}
57		$NVME_CMD reset ${nvme_dev}
58	done
59
60	$rootdir/scripts/setup.sh
61}
62
63function info_print() {
64	echo "---"
65	echo "$@"
66	echo "---"
67}
68
69# Prepare controller
70remove_all_namespaces
71
72reset_nvme_if_aer_unsupported ${nvme_dev}
73sleep 1
74
75PCI_ALLOWED="${bdf}" $rootdir/scripts/setup.sh
76
77$SPDK_BIN_DIR/spdk_tgt -m 0x3 &
78spdk_tgt_pid=$!
79trap 'kill -9 ${spdk_tgt_pid}; clean_up; exit 1' SIGINT SIGTERM EXIT
80
81waitforlisten $spdk_tgt_pid
82
83$rpc_py bdev_nvme_attach_controller -b Nvme0 -t PCIe -a ${bdf}
84$rpc_py bdev_nvme_cuse_register -n Nvme0
85
86ctrlr="/dev/spdk/nvme0"
87
88sleep 1
89[[ -c $ctrlr ]]
90
91for dev in "${ctrlr}"n*; do
92	[[ ! -c ${dev} ]]
93done
94sleep 1
95
96for nsid in "${nsids[@]}"; do
97	info_print "create ns: nsze=10000 ncap=10000 flbias=0"
98	$NVME_CMD create-ns ${ctrlr} -s 10000 -c 10000 -f 0
99	info_print "attach ns: nsid=${nsid} controller=${cntlid}"
100	$NVME_CMD attach-ns ${ctrlr} -n ${nsid} -c ${cntlid}
101	reset_nvme_if_aer_unsupported ${ctrlr}
102	sleep 1
103	[[ -c "${ctrlr}n${nsid}" ]]
104	info_print "detach ns: nsid=${nsid} controller=${cntlid}"
105	$NVME_CMD detach-ns ${ctrlr} -n ${nsid} -c ${cntlid}
106	info_print "delete ns: nsid=${nsid}"
107	$NVME_CMD delete-ns ${ctrlr} -n ${nsid}
108	reset_nvme_if_aer_unsupported ${ctrlr}
109	sleep 1
110	[[ ! -c "${ctrlr}n${nsid}" ]]
111done
112
113# Here we should not have any cuse devices
114for dev in "${ctrlr}"n*; do
115	[[ ! -c ${dev} ]]
116done
117
118$rpc_py bdev_nvme_detach_controller Nvme0
119
120sleep 1
121[[ ! -c ${ctrlr} ]]
122
123trap - SIGINT SIGTERM EXIT
124killprocess $spdk_tgt_pid
125clean_up
126