[PATCH blktests 09/15] nvme: check for controller device in _nvme_connect_subsys()
Shin'ichiro Kawasaki
shinichiro.kawasaki at wdc.com
Wed Oct 23 18:00:19 PDT 2024
From: Hannes Reinecke <hare at suse.de>
When calling 'nvme connect' we cannot assume that a namespace is
always present (eg if connecting to a discovery service), so better
check for the controller device to ensure that 'nvme connect' has
succeeded.
Signed-off-by: Hannes Reinecke <hare at suse.de>
[Shin'ichiro: fixed _nvme_connect_subsys() return for no_wait case]
Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki at wdc.com>
---
common/nvme | 37 ++++++++++++++++++-------------------
1 file changed, 18 insertions(+), 19 deletions(-)
diff --git a/common/nvme b/common/nvme
index 758df33..fa64ad4 100644
--- a/common/nvme
+++ b/common/nvme
@@ -373,17 +373,20 @@ _nvme_connect_subsys() {
if [[ -n "${ctrl_loss_tmo}" ]]; then
ARGS+=(--ctrl-loss-tmo="${ctrl_loss_tmo}")
fi
+ ARGS+=(-o json)
+ connect=$(nvme connect "${ARGS[@]}" 2> /dev/null)
- nvme connect "${ARGS[@]}" 2> /dev/null | grep -v "connecting to device:"
-
- # Wait until device file and uuid/wwid sysfs attributes get ready for
- # all namespaces.
+ # Wait until device file and sysfs attributes get ready
if [[ ${no_wait} = false ]]; then
+ local ctrldev
+
+ ctrldev=$(echo "${connect}" | sed -n 's/.*device.:.\(nvme[0-9]*\)./\1/p')
udevadm settle
for ((i = 0; i < 10; i++)); do
- _nvme_ns_ready "${subsysnqn}" && return
+ _nvme_ctrl_ready "${ctrldev}" "${subsysnqn}" && return 0
sleep .1
done
+ return 1
fi
}
@@ -408,21 +411,17 @@ _nvme_disconnect_subsys() {
}
-_nvme_ns_ready() {
- local subsysnqn="${1}"
- local ns_path ns_id dev
- local cfs_path="${NVMET_CFS}/subsystems/$subsysnqn"
+_nvme_ctrl_ready() {
+ local ctrldev="${1}"
+ local subsysnqn="${2:-$def_subsysnqn}"
+ local ctrlpath="/sys/class/nvme/${ctrldev}"
- dev=$(_find_nvme_dev "$subsysnqn")
- for ns_path in "${cfs_path}/namespaces/"*; do
- ns_id=${ns_path##*/}
- if [[ ! -b /dev/${dev}n${ns_id} ||
- ! -e /sys/block/${dev}n${ns_id}/uuid ||
- ! -e /sys/block/${dev}n${ns_id}/wwid ]]; then
- return 1
- fi
- done
- return 0
+ nqn=$(cat "${ctrlpath}/subsysnqn" 2> /dev/null)
+ if [[ "${nqn}" == "${subsysnqn}" &&
+ -c /dev/${ctrldev} ]]; then
+ return 0
+ fi
+ return 1
}
_local_wwnn() {
--
2.45.2
More information about the Linux-nvme
mailing list