* [PATCH 0/3] blktests: ANA and FC-Loop support
@ 2018-10-15 7:01 Hannes Reinecke
2018-10-15 7:01 ` [PATCH 1/3] nvme: enable ANA support Hannes Reinecke
` (2 more replies)
0 siblings, 3 replies; 13+ messages in thread
From: Hannes Reinecke @ 2018-10-15 7:01 UTC (permalink / raw)
Hi all,
here are two new tests for ANA support and FC-Loop; the latter more
as a showcase how fcloop is supposed to be setup.
But also serves as a nice reproducer for fcloop failing to be removed
properly.
As usual, comments and reviews are welcome.
Hannes Reinecke (3):
nvme: enable ANA support
nvme: add test for ANA state transition
nvme: Add test for fcloop
tests/nvme/018 | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/nvme/018.out | 18 +++++++
tests/nvme/029 | 123 ++++++++++++++++++++++++++++++++++++++++++++++
tests/nvme/029.out | 2 +
tests/nvme/rc | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++--
5 files changed, 422 insertions(+), 3 deletions(-)
create mode 100755 tests/nvme/018
create mode 100644 tests/nvme/018.out
create mode 100755 tests/nvme/029
create mode 100644 tests/nvme/029.out
--
2.13.7
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/3] nvme: enable ANA support
2018-10-15 7:01 [PATCH 0/3] blktests: ANA and FC-Loop support Hannes Reinecke
@ 2018-10-15 7:01 ` Hannes Reinecke
2018-10-15 21:13 ` Omar Sandoval
2018-10-15 7:01 ` [PATCH 2/3] nvme: add test for ANA state transition Hannes Reinecke
2018-10-15 7:01 ` [PATCH 3/3] nvme: Add test for fcloop Hannes Reinecke
2 siblings, 1 reply; 13+ messages in thread
From: Hannes Reinecke @ 2018-10-15 7:01 UTC (permalink / raw)
Update functions to support ANA.
Signed-off-by: Hannes Reinecke <hare at suse.com>
---
tests/nvme/rc | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 86 insertions(+), 3 deletions(-)
diff --git a/tests/nvme/rc b/tests/nvme/rc
index eff1dd9..aaf438b 100644
--- a/tests/nvme/rc
+++ b/tests/nvme/rc
@@ -14,7 +14,7 @@ group_device_requires() {
_test_dev_is_nvme
}
-NVMET_CFS="/sys/kernel/config/nvmet/"
+NVMET_CFS="/sys/kernel/config/nvmet"
_test_dev_is_nvme() {
if ! readlink -f "$TEST_DEV_SYSFS/device" | grep -q nvme; then
@@ -36,6 +36,7 @@ _create_nvmet_port() {
mkdir "${NVMET_CFS}/ports/${port}"
echo "${trtype}" > "${NVMET_CFS}/ports/${port}/addr_trtype"
+ echo "${port}" > "${NVMET_CFS}/ports/${port}/addr_traddr"
echo "${port}"
}
@@ -45,6 +46,62 @@ _remove_nvmet_port() {
rmdir "${NVMET_CFS}/ports/${port}"
}
+_create_nvmet_anagroup() {
+ local port="$1"
+ local port_cfs="${NVMET_CFS}/ports/${port}"
+ local grpid
+
+ for ((grpid = 1; ; grpid++)); do
+ if [[ ! -e "${port_cfs}/ana_groups/${grpid}" ]]; then
+ break
+ fi
+ done
+
+ mkdir "${port_cfs}/ana_groups/${grpid}"
+
+ echo "${grpid}"
+}
+
+_remove_nvmet_anagroup() {
+ local port="$1"
+ local grpid="$2"
+ local ana_cfs="${NVMET_CFS}/ports/${port}/ana_groups/${grpid}"
+
+ rmdir "${ana_cfs}"
+}
+
+_set_nvmet_anagroup_state() {
+ local port="$1"
+ local grpid="$2"
+ local state="$3"
+ local ana_cfs="${NVMET_CFS}/ports/${port}/ana_groups/${grpid}"
+
+ echo "${state}" > "${ana_cfs}/ana_state"
+}
+
+_display_ana_state() {
+ local nvmet_subsystem="$1"
+ local grpid state cntlid
+
+ for nvme in /sys/class/nvme/* ; do
+ [ -f ${nvme}/subsysnqn ] || continue
+ subsys="$(cat "${nvme}/subsysnqn")"
+ if [ "${subsys}" != "${nvmet_subsystem}" ] ; then
+ continue
+ fi
+ cntlid="$(cat "${nvme}/cntlid")"
+ for c in ${nvme}/nvme* ; do
+ if [ ! -d ${c} ] ; then
+ echo "${cntlid}: ANA disabled"
+ continue
+ fi
+ grpid="$(cat "${c}/ana_grpid")"
+ state="$(cat "${c}/ana_state")"
+ echo "${cntlid}: grpid ${grpid} state ${state}"
+ done
+ done
+}
+
_create_nvmet_ns() {
local nvmet_subsystem="$1"
local nsid="$2"
@@ -52,14 +109,22 @@ _create_nvmet_ns() {
local uuid="00000000-0000-0000-0000-000000000000"
local subsys_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
local ns_path="${subsys_path}/namespaces/${nsid}"
+ local ana_grpid
- if [[ $# -eq 4 ]]; then
+ if [[ $# -ge 4 ]]; then
uuid="$4"
fi
+ if [[ $# -eq 5 ]]; then
+ ana_grpid="$5"
+ fi
+
mkdir "${ns_path}"
printf "%s" "${blkdev}" > "${ns_path}/device_path"
printf "%s" "${uuid}" > "${ns_path}/device_uuid"
+ if [ -n "${ana_grpid}" ] ; then
+ printf "%s" "${ana_grpid}" > "${ns_path}/ana_grpid"
+ fi
printf 1 > "${ns_path}/enable"
}
@@ -67,11 +132,12 @@ _create_nvmet_subsystem() {
local nvmet_subsystem="$1"
local blkdev="$2"
local uuid=$3
+ local ana_grpid=$4
local cfs_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
mkdir -p "${cfs_path}"
echo 1 > "${cfs_path}/attr_allow_any_host"
- _create_nvmet_ns "${nvmet_subsystem}" "1" "${blkdev}" "${uuid}"
+ _create_nvmet_ns "${nvmet_subsystem}" "1" "${blkdev}" "${uuid}" "${ana_grpid}"
}
_remove_nvmet_ns() {
@@ -115,6 +181,23 @@ _find_nvme_loop_dev() {
transport="$(cat "/sys/class/nvme/${dev}/transport")"
if [[ "$transport" == "loop" ]]; then
echo "$dev"
+ break
+ fi
+ done
+}
+
+_find_nvme_ns() {
+ local uuid=$1
+ local dev
+ local hidden
+
+ for dev in /sys/block/nvme*; do
+ hidden="$(cat "${dev}/hidden")"
+ [[ "$hidden" -eq 1 ]] && continue
+ u="$(cat "${dev}/uuid")"
+ if [[ "$uuid" = "$u" ]] ; then
+ echo "$(basename "${dev}")"
+ break
fi
done
}
--
2.13.7
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 2/3] nvme: add test for ANA state transition
2018-10-15 7:01 [PATCH 0/3] blktests: ANA and FC-Loop support Hannes Reinecke
2018-10-15 7:01 ` [PATCH 1/3] nvme: enable ANA support Hannes Reinecke
@ 2018-10-15 7:01 ` Hannes Reinecke
2018-10-15 21:26 ` Omar Sandoval
2018-10-15 7:01 ` [PATCH 3/3] nvme: Add test for fcloop Hannes Reinecke
2 siblings, 1 reply; 13+ messages in thread
From: Hannes Reinecke @ 2018-10-15 7:01 UTC (permalink / raw)
Signed-off-by: Hannes Reinecke <hare at suse.com>
---
tests/nvme/018 | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/nvme/018.out | 18 +++++++
2 files changed, 159 insertions(+)
create mode 100755 tests/nvme/018
create mode 100644 tests/nvme/018.out
diff --git a/tests/nvme/018 b/tests/nvme/018
new file mode 100755
index 0000000..4d9b6c7
--- /dev/null
+++ b/tests/nvme/018
@@ -0,0 +1,141 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0+
+# Regression test for ANA base support
+#
+# Copyright (C) 2018 Hannes Reinecke, SUSE Linux GmbH
+#
+
+. tests/nvme/rc
+
+DESCRIPTION="test ANA optimized/transitioning/inaccessible support"
+QUICK=1
+
+switch_nvmet_anagroup() {
+ local port1="$1"
+ local port2="$2"
+ local mode="$3"
+
+ echo "ANA state ${mode}"
+
+ if [ "${mode}" = "change" ] ; then
+ _set_nvmet_anagroup_state "${port1}" "1" "change"
+ _set_nvmet_anagroup_state "${port1}" "2" "change"
+ _set_nvmet_anagroup_state "${port2}" "1" "change"
+ _set_nvmet_anagroup_state "${port2}" "2" "change"
+ elif [ "${mode}" = "failover" ] ; then
+ _set_nvmet_anagroup_state "${port1}" "1" "inaccessible"
+ _set_nvmet_anagroup_state "${port1}" "2" "optimized"
+ _set_nvmet_anagroup_state "${port2}" "1" "optimized"
+ _set_nvmet_anagroup_state "${port2}" "2" "inaccessible"
+ else
+ _set_nvmet_anagroup_state "${port1}" "1" "optimized"
+ _set_nvmet_anagroup_state "${port1}" "2" "inaccessible"
+ _set_nvmet_anagroup_state "${port2}" "1" "inaccessible"
+ _set_nvmet_anagroup_state "${port2}" "2" "optimized"
+ fi
+}
+
+requires() {
+ _have_program nvme && _have_module nvme-loop && _have_module loop && \
+ _have_configfs && _have_fio
+}
+
+test() {
+ local mount_dir="/mnt/blktests"
+ local subsys="blktests-subsystem-1"
+ local port1
+ local port2
+ local loop_dev1
+ local loop_dev2
+ local nvmedev
+
+ echo "Running ${TEST_NAME}"
+
+ modprobe nvmet
+ modprobe nvme-loop
+
+ mkdir -p "${mount_dir}" > /dev/null 2>&1
+
+ port1="$(_create_nvmet_port "loop")"
+ ag1="$(_create_nvmet_anagroup "${port1}")"
+
+ port2="$(_create_nvmet_port "loop")"
+ ag2="$(_create_nvmet_anagroup "${port2}")"
+
+ truncate -s 1G "$TMPDIR/img1"
+
+ loop_dev1="$(losetup -f --show "$TMPDIR/img1")"
+
+ _create_nvmet_subsystem "${subsys}" "${loop_dev1}" \
+ "91fdba0d-f87b-4c25-b80f-db7be1418b9e" "1"
+
+ truncate -s 1G "$TMPDIR/img2"
+
+ loop_dev2="$(losetup -f --show "$TMPDIR/img2")"
+
+ _create_nvmet_ns "${subsys}" "2" "${loop_dev2}" \
+ "9aed0138-bfd9-46f5-92ac-24c70377fd49" "2"
+
+ _add_nvmet_subsys_to_port "${port1}" "${subsys}"
+ _add_nvmet_subsys_to_port "${port2}" "${subsys}"
+
+ switch_nvmet_anagroup "${port1}" "${port2}" failback
+
+ nvme connect -t loop -a "${port1}" -n "${subsys}"
+ nvme connect -t loop -a "${port2}" -n "${subsys}"
+
+ sleep 1
+
+ _display_ana_state "${subsys}"
+
+ nvmedev="$(_find_nvme_ns 91fdba0d-f87b-4c25-b80f-db7be1418b9e)"
+
+ mkfs.xfs -f /dev/"${nvmedev}" > /dev/null 2>&1
+
+ mount /dev/"${nvmedev}" "${mount_dir}"
+
+ _run_fio_rand_io --size=63m --directory="${mount_dir}" --runtime=20s --time_based &
+ trap "kill $!" EXIT
+
+ sleep 10
+
+ switch_nvmet_anagroup "${port1}" "${port2}" "change"
+
+ # Insert a delay to allow the AEN to be processed
+ sleep 1
+
+ _display_ana_state "${subsys}"
+
+ sleep 6
+
+ switch_nvmet_anagroup "${port1}" "${port2}" "failover"
+
+ # Insert a delay to allow the AEN to be processed
+ sleep 1
+
+ _display_ana_state "${subsys}"
+
+ wait
+ trap - EXIT
+
+ umount "${mount_dir}" > /dev/null 2>&1
+
+ nvme disconnect -n "${subsys}"
+
+ _remove_nvmet_subsystem_from_port "${port1}" "${subsys}"
+ _remove_nvmet_subsystem_from_port "${port2}" "${subsys}"
+ _remove_nvmet_ns "${subsys}" "2"
+ _remove_nvmet_subsystem "${subsys}"
+ _remove_nvmet_anagroup "${port1}" "${ag1}"
+ _remove_nvmet_port "${port1}"
+ _remove_nvmet_anagroup "${port2}" "${ag2}"
+ _remove_nvmet_port "${port2}"
+ losetup -d "${loop_dev2}"
+ rm "$TMPDIR/img2"
+ losetup -d "${loop_dev1}"
+ rm "$TMPDIR/img1"
+
+ modprobe -r nvme-loop
+ modprobe -r nvmet
+ echo "Test complete"
+}
diff --git a/tests/nvme/018.out b/tests/nvme/018.out
new file mode 100644
index 0000000..77d52d2
--- /dev/null
+++ b/tests/nvme/018.out
@@ -0,0 +1,18 @@
+Running nvme/018
+ANA state failback
+1: grpid 1 state optimized
+1: grpid 2 state inaccessible
+2: grpid 1 state inaccessible
+2: grpid 2 state optimized
+ANA state change
+1: grpid 1 state change
+1: grpid 2 state change
+2: grpid 1 state change
+2: grpid 2 state change
+ANA state failover
+1: grpid 1 state inaccessible
+1: grpid 2 state optimized
+2: grpid 1 state optimized
+2: grpid 2 state inaccessible
+NQN:blktests-subsystem-1 disconnected 2 controller(s)
+Test complete
--
2.13.7
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 3/3] nvme: Add test for fcloop
2018-10-15 7:01 [PATCH 0/3] blktests: ANA and FC-Loop support Hannes Reinecke
2018-10-15 7:01 ` [PATCH 1/3] nvme: enable ANA support Hannes Reinecke
2018-10-15 7:01 ` [PATCH 2/3] nvme: add test for ANA state transition Hannes Reinecke
@ 2018-10-15 7:01 ` Hannes Reinecke
2018-10-15 21:17 ` Omar Sandoval
2 siblings, 1 reply; 13+ messages in thread
From: Hannes Reinecke @ 2018-10-15 7:01 UTC (permalink / raw)
Signed-off-by: Hannes Reinecke <hare at suse.com>
---
tests/nvme/029 | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++
tests/nvme/029.out | 2 +
tests/nvme/rc | 52 ++++++++++++++++++++++
3 files changed, 177 insertions(+)
create mode 100755 tests/nvme/029
create mode 100644 tests/nvme/029.out
diff --git a/tests/nvme/029 b/tests/nvme/029
new file mode 100755
index 0000000..f8ed9b5
--- /dev/null
+++ b/tests/nvme/029
@@ -0,0 +1,123 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0+
+# Copyright (C) 2018 Johannes Thumshirn, Hannes Reinecke, SUSE Linux GmbH
+#
+# Reproducer for nvme-fcloop
+#
+
+. tests/nvme/rc
+
+DESCRIPTION="create nvme-fcloop with two ports and connect/disconnect"
+
+requires() {
+ _have_module nvme-fcloop && _have_module nvmet && _have_module loop && \
+ _have_configfs && _have_module nvme-core && \
+ _have_module nvmet-fc
+}
+
+test() {
+ local subsys="blktests-subsystem-1"
+ local remote_wwnn1="0x100140111111dbcc"
+ local remote_wwpn1="0x200140111111dbcc"
+ local remote_wwnn2="0x100140111111dbcd"
+ local remote_wwpn2="0x200140111111dbcd"
+ local host_wwnn1="0x100140111111dac8"
+ local host_wwpn1="0x200140111111dac8"
+ local host_wwnn2="0x100140111111dac9"
+ local host_wwpn2="0x200140111111dac9"
+
+ echo "Running ${TEST_NAME}"
+
+ modprobe nvmet-fc
+ modprobe nvme-fcloop
+
+ _nvme_fcloop_add_tport ${remote_wwnn1} ${remote_wwpn1}
+ _nvme_fcloop_add_tport ${remote_wwnn2} ${remote_wwpn2}
+
+ _nvme_fcloop_add_lport ${host_wwnn1} ${host_wwpn1}
+ _nvme_fcloop_add_lport ${host_wwnn2} ${host_wwpn2}
+
+ _nvme_fcloop_add_rport ${host_wwnn1} ${host_wwpn1} \
+ ${remote_wwnn1} ${remote_wwpn1}
+ _nvme_fcloop_add_rport ${host_wwnn2} ${host_wwpn2} \
+ ${remote_wwnn2} ${remote_wwpn2}
+
+ local port1
+ port1=$(_create_nvmet_port "fc")
+ ag1="$(_create_nvmet_anagroup "${port1}")"
+
+ local port2
+ port2=$(_create_nvmet_port "fc")
+ ag2="$(_create_nvmet_anagroup "${port2}")"
+
+ local remote_traddr1
+ remote_traddr1=$(printf "nn-%s:pn-%s" "${remote_wwnn1}" "${remote_wwpn1}")
+ echo fc > /sys/kernel/config/nvmet/ports/${port1}/addr_adrfam
+ echo "${remote_traddr1}" > /sys/kernel/config/nvmet/ports/${port1}/addr_traddr
+
+ local remote_traddr2
+ remote_traddr2=$(printf "nn-%s:pn-%s" "${remote_wwnn2}" "${remote_wwpn2}")
+ echo fc > /sys/kernel/config/nvmet/ports/${port2}/addr_adrfam
+ echo "${remote_traddr2}" > /sys/kernel/config/nvmet/ports/${port2}/addr_traddr
+
+ truncate -s 1G "$TMPDIR/img"
+
+ local loop_dev
+ loop_dev="$(losetup -f --show "$TMPDIR/img")"
+
+ _create_nvmet_subsystem "${subsys}" "${loop_dev}" \
+ "91fdba0d-f87b-4c25-b80f-db7be1418b9e" "1"
+ _add_nvmet_subsys_to_port "${port1}" "${subsys}"
+ _add_nvmet_subsys_to_port "${port2}" "${subsys}"
+
+ _set_nvmet_anagroup_state "${port2}" "1" "inaccessible"
+ _set_nvmet_anagroup_state "${port2}" "2" "optimized"
+
+ local host_traddr1
+ host_traddr1=$(printf "nn-%s:pn-%s" "${host_wwnn1}" "${host_wwpn1}")
+
+ nvme connect -t fc -a "${remote_traddr1}" -w "${host_traddr1}" \
+ -n "${subsys}"
+
+ local host_traddr2
+ host_traddr2=$(printf "nn-%s:pn-%s" "${host_wwnn2}" "${host_wwpn2}")
+
+ nvme connect -t fc -a "${remote_traddr2}" -w "${host_traddr2}" \
+ -n "${subsys}"
+
+ nvmedev="$(_find_nvme_ns 91fdba0d-f87b-4c25-b80f-db7be1418b9e)"
+
+ # Allow I/O to settle
+ udevadm settle
+
+ nvme disconnect -n "${subsys}"
+
+ _remove_nvmet_subsystem_from_port "${port1}" "${subsys}"
+ _remove_nvmet_subsystem_from_port "${port2}" "${subsys}"
+ _remove_nvmet_subsystem "${subsys}"
+ _remove_nvmet_anagroup "${port1}" "${ag1}"
+ _remove_nvmet_port "${port1}"
+ _remove_nvmet_anagroup "${port2}" "${ag2}"
+ _remove_nvmet_port "${port2}"
+
+ losetup -d "$loop_dev"
+ rm "$TMPDIR/img"
+
+ _nvme_fcloop_del_rport "${host_wwnn1}" "${host_wwpn1}" \
+ "${remote_wwnn1}" "${remote_wwpn1}"
+ _nvme_fcloop_del_rport "${host_wwnn2}" "${host_wwpn2}" \
+ "${remote_wwnn2}" "${remote_wwpn2}"
+
+ _nvme_fcloop_del_tport "${remote_wwnn1}" "${remote_wwpn1}"
+ _nvme_fcloop_del_tport "${remote_wwnn2}" "${remote_wwpn2}"
+
+ _nvme_fcloop_del_lport "${host_wwnn1}" "${host_wwpn1}"
+ _nvme_fcloop_del_lport "${host_wwnn2}" "${host_wwpn2}"
+
+ modprobe -r nvme-fcloop
+ modprobe -r nvmet-fc
+ modprobe -r nvmet
+ modprobe -r loop
+
+ echo "Test complete"
+}
diff --git a/tests/nvme/029.out b/tests/nvme/029.out
new file mode 100644
index 0000000..745f142
--- /dev/null
+++ b/tests/nvme/029.out
@@ -0,0 +1,2 @@
+Running nvme/029
+Test complete
diff --git a/tests/nvme/rc b/tests/nvme/rc
index aaf438b..3b3d852 100644
--- a/tests/nvme/rc
+++ b/tests/nvme/rc
@@ -201,3 +201,55 @@ _find_nvme_ns() {
fi
done
}
+
+_nvme_fcloop_add_rport() {
+ local local_wwnn="$1"
+ local local_wwpn="$2"
+ local remote_wwnn="$3"
+ local remote_wwpn="$4"
+ local loopctl=/sys/class/fcloop/ctl
+
+ echo "wwnn=${remote_wwnn},wwpn=${remote_wwpn},lpwwnn=${local_wwnn},lpwwpn=${local_wwpn},roles=0x60" > ${loopctl}/add_remote_port
+}
+
+_nvme_fcloop_del_rport() {
+ local local_wwnn="$1"
+ local local_wwpn="$2"
+ local remote_wwnn="$3"
+ local remote_wwpn="$4"
+ local loopctl=/sys/class/fcloop/ctl
+
+ echo "wwnn=${remote_wwnn},wwpn=${remote_wwpn}" > ${loopctl}/del_remote_port
+}
+
+_nvme_fcloop_add_lport() {
+ local wwnn="$1"
+ local wwpn="$2"
+ local loopctl=/sys/class/fcloop/ctl
+
+ echo "wwnn=${wwnn},wwpn=${wwpn}" > ${loopctl}/add_local_port
+}
+
+_nvme_fcloop_del_lport() {
+ local wwnn="$1"
+ local wwpn="$2"
+ local loopctl=/sys/class/fcloop/ctl
+
+ echo "wwnn=${wwnn},wwpn=${wwpn}" > ${loopctl}/del_local_port
+}
+
+_nvme_fcloop_add_tport() {
+ local wwnn="$1"
+ local wwpn="$2"
+ local loopctl=/sys/class/fcloop/ctl
+
+ echo "wwnn=${wwnn},wwpn=${wwpn}" > ${loopctl}/add_target_port
+}
+
+_nvme_fcloop_del_tport() {
+ local wwnn="$1"
+ local wwpn="$2"
+ local loopctl=/sys/class/fcloop/ctl
+
+ echo "wwnn=${wwnn},wwpn=${wwpn}" > ${loopctl}/del_target_port
+}
--
2.13.7
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 1/3] nvme: enable ANA support
2018-10-15 7:01 ` [PATCH 1/3] nvme: enable ANA support Hannes Reinecke
@ 2018-10-15 21:13 ` Omar Sandoval
2018-10-16 5:49 ` Hannes Reinecke
0 siblings, 1 reply; 13+ messages in thread
From: Omar Sandoval @ 2018-10-15 21:13 UTC (permalink / raw)
On Mon, Oct 15, 2018@09:01:28AM +0200, Hannes Reinecke wrote:
> Update functions to support ANA.
>
> Signed-off-by: Hannes Reinecke <hare at suse.com>
> ---
> tests/nvme/rc | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
> 1 file changed, 86 insertions(+), 3 deletions(-)
>
> diff --git a/tests/nvme/rc b/tests/nvme/rc
> index eff1dd9..aaf438b 100644
> --- a/tests/nvme/rc
> +++ b/tests/nvme/rc
> @@ -14,7 +14,7 @@ group_device_requires() {
> _test_dev_is_nvme
> }
>
> -NVMET_CFS="/sys/kernel/config/nvmet/"
> +NVMET_CFS="/sys/kernel/config/nvmet"
>
> _test_dev_is_nvme() {
> if ! readlink -f "$TEST_DEV_SYSFS/device" | grep -q nvme; then
> @@ -36,6 +36,7 @@ _create_nvmet_port() {
>
> mkdir "${NVMET_CFS}/ports/${port}"
> echo "${trtype}" > "${NVMET_CFS}/ports/${port}/addr_trtype"
> + echo "${port}" > "${NVMET_CFS}/ports/${port}/addr_traddr"
>
> echo "${port}"
> }
> @@ -45,6 +46,62 @@ _remove_nvmet_port() {
> rmdir "${NVMET_CFS}/ports/${port}"
> }
>
> +_create_nvmet_anagroup() {
> + local port="$1"
> + local port_cfs="${NVMET_CFS}/ports/${port}"
> + local grpid
> +
> + for ((grpid = 1; ; grpid++)); do
> + if [[ ! -e "${port_cfs}/ana_groups/${grpid}" ]]; then
> + break
> + fi
> + done
> +
> + mkdir "${port_cfs}/ana_groups/${grpid}"
> +
> + echo "${grpid}"
> +}
> +
> +_remove_nvmet_anagroup() {
> + local port="$1"
> + local grpid="$2"
> + local ana_cfs="${NVMET_CFS}/ports/${port}/ana_groups/${grpid}"
> +
> + rmdir "${ana_cfs}"
> +}
> +
> +_set_nvmet_anagroup_state() {
> + local port="$1"
> + local grpid="$2"
> + local state="$3"
> + local ana_cfs="${NVMET_CFS}/ports/${port}/ana_groups/${grpid}"
> +
> + echo "${state}" > "${ana_cfs}/ana_state"
> +}
> +
> +_display_ana_state() {
> + local nvmet_subsystem="$1"
> + local grpid state cntlid
> +
> + for nvme in /sys/class/nvme/* ; do
> + [ -f ${nvme}/subsysnqn ] || continue
> + subsys="$(cat "${nvme}/subsysnqn")"
> + if [ "${subsys}" != "${nvmet_subsystem}" ] ; then
> + continue
> + fi
> + cntlid="$(cat "${nvme}/cntlid")"
> + for c in ${nvme}/nvme* ; do
> + if [ ! -d ${c} ] ; then
> + echo "${cntlid}: ANA disabled"
> + continue
> + fi
> + grpid="$(cat "${c}/ana_grpid")"
> + state="$(cat "${c}/ana_state")"
> + echo "${cntlid}: grpid ${grpid} state ${state}"
> + done
> + done
> +}
> +
> _create_nvmet_ns() {
> local nvmet_subsystem="$1"
> local nsid="$2"
> @@ -52,14 +109,22 @@ _create_nvmet_ns() {
> local uuid="00000000-0000-0000-0000-000000000000"
> local subsys_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
> local ns_path="${subsys_path}/namespaces/${nsid}"
> + local ana_grpid
>
> - if [[ $# -eq 4 ]]; then
> + if [[ $# -ge 4 ]]; then
> uuid="$4"
> fi
>
> + if [[ $# -eq 5 ]]; then
> + ana_grpid="$5"
> + fi
> +
> mkdir "${ns_path}"
> printf "%s" "${blkdev}" > "${ns_path}/device_path"
> printf "%s" "${uuid}" > "${ns_path}/device_uuid"
> + if [ -n "${ana_grpid}" ] ; then
> + printf "%s" "${ana_grpid}" > "${ns_path}/ana_grpid"
> + fi
> printf 1 > "${ns_path}/enable"
> }
>
> @@ -67,11 +132,12 @@ _create_nvmet_subsystem() {
> local nvmet_subsystem="$1"
> local blkdev="$2"
> local uuid=$3
> + local ana_grpid=$4
> local cfs_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
>
> mkdir -p "${cfs_path}"
> echo 1 > "${cfs_path}/attr_allow_any_host"
> - _create_nvmet_ns "${nvmet_subsystem}" "1" "${blkdev}" "${uuid}"
> + _create_nvmet_ns "${nvmet_subsystem}" "1" "${blkdev}" "${uuid}" "${ana_grpid}"
> }
>
> _remove_nvmet_ns() {
> @@ -115,6 +181,23 @@ _find_nvme_loop_dev() {
> transport="$(cat "/sys/class/nvme/${dev}/transport")"
> if [[ "$transport" == "loop" ]]; then
> echo "$dev"
> + break
> + fi
> + done
> +}
> +
> +_find_nvme_ns() {
> + local uuid=$1
> + local dev
> + local hidden
> +
> + for dev in /sys/block/nvme*; do
> + hidden="$(cat "${dev}/hidden")"
> + [[ "$hidden" -eq 1 ]] && continue
> + u="$(cat "${dev}/uuid")"
> + if [[ "$uuid" = "$u" ]] ; then
> + echo "$(basename "${dev}")"
> + break
This fails if I have another NVMe device:
cat: /sys/block/nvme0n1/uuid: No such file or directory
And there are a bunch of shellcheck errors. The following fixes all of
that:
diff --git a/tests/nvme/rc b/tests/nvme/rc
index 3b3d852..0c8fc62 100644
--- a/tests/nvme/rc
+++ b/tests/nvme/rc
@@ -84,14 +84,14 @@ _display_ana_state() {
local grpid state cntlid
for nvme in /sys/class/nvme/* ; do
- [ -f ${nvme}/subsysnqn ] || continue
+ [[ -f ${nvme}/subsysnqn ]] || continue
subsys="$(cat "${nvme}/subsysnqn")"
- if [ "${subsys}" != "${nvmet_subsystem}" ] ; then
+ if [[ "${subsys}" != "${nvmet_subsystem}" ]] ; then
continue
fi
cntlid="$(cat "${nvme}/cntlid")"
- for c in ${nvme}/nvme* ; do
- if [ ! -d ${c} ] ; then
+ for c in "${nvme}/nvme"* ; do
+ if [[ ! -d ${c} ]] ; then
echo "${cntlid}: ANA disabled"
continue
fi
@@ -122,7 +122,7 @@ _create_nvmet_ns() {
mkdir "${ns_path}"
printf "%s" "${blkdev}" > "${ns_path}/device_path"
printf "%s" "${uuid}" > "${ns_path}/device_uuid"
- if [ -n "${ana_grpid}" ] ; then
+ if [[ -n ${ana_grpid} ]] ; then
printf "%s" "${ana_grpid}" > "${ns_path}/ana_grpid"
fi
printf 1 > "${ns_path}/enable"
@@ -194,9 +194,8 @@ _find_nvme_ns() {
for dev in /sys/block/nvme*; do
hidden="$(cat "${dev}/hidden")"
[[ "$hidden" -eq 1 ]] && continue
- u="$(cat "${dev}/uuid")"
- if [[ "$uuid" = "$u" ]] ; then
- echo "$(basename "${dev}")"
+ if [[ -e "${dev}/uuid" && "$(cat "${dev}/uuid")" = "$uuid" ]] ; then
+ basename "${dev}"
break
fi
done
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH 3/3] nvme: Add test for fcloop
2018-10-15 7:01 ` [PATCH 3/3] nvme: Add test for fcloop Hannes Reinecke
@ 2018-10-15 21:17 ` Omar Sandoval
2018-10-16 5:50 ` Hannes Reinecke
0 siblings, 1 reply; 13+ messages in thread
From: Omar Sandoval @ 2018-10-15 21:17 UTC (permalink / raw)
On Mon, Oct 15, 2018@09:01:30AM +0200, Hannes Reinecke wrote:
> Signed-off-by: Hannes Reinecke <hare at suse.com>
> ---
> tests/nvme/029 | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> tests/nvme/029.out | 2 +
> tests/nvme/rc | 52 ++++++++++++++++++++++
> 3 files changed, 177 insertions(+)
> create mode 100755 tests/nvme/029
> create mode 100644 tests/nvme/029.out
>
> diff --git a/tests/nvme/029 b/tests/nvme/029
> new file mode 100755
> index 0000000..f8ed9b5
> --- /dev/null
> +++ b/tests/nvme/029
> @@ -0,0 +1,123 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0+
> +# Copyright (C) 2018 Johannes Thumshirn, Hannes Reinecke, SUSE Linux GmbH
> +#
> +# Reproducer for nvme-fcloop
> +#
> +
> +. tests/nvme/rc
> +
> +DESCRIPTION="create nvme-fcloop with two ports and connect/disconnect"
> +
> +requires() {
> + _have_module nvme-fcloop && _have_module nvmet && _have_module loop && \
> + _have_configfs && _have_module nvme-core && \
> + _have_module nvmet-fc
> +}
> +
> +test() {
> + local subsys="blktests-subsystem-1"
> + local remote_wwnn1="0x100140111111dbcc"
> + local remote_wwpn1="0x200140111111dbcc"
> + local remote_wwnn2="0x100140111111dbcd"
> + local remote_wwpn2="0x200140111111dbcd"
> + local host_wwnn1="0x100140111111dac8"
> + local host_wwpn1="0x200140111111dac8"
> + local host_wwnn2="0x100140111111dac9"
> + local host_wwpn2="0x200140111111dac9"
> +
> + echo "Running ${TEST_NAME}"
> +
> + modprobe nvmet-fc
> + modprobe nvme-fcloop
> +
> + _nvme_fcloop_add_tport ${remote_wwnn1} ${remote_wwpn1}
> + _nvme_fcloop_add_tport ${remote_wwnn2} ${remote_wwpn2}
> +
> + _nvme_fcloop_add_lport ${host_wwnn1} ${host_wwpn1}
> + _nvme_fcloop_add_lport ${host_wwnn2} ${host_wwpn2}
> +
> + _nvme_fcloop_add_rport ${host_wwnn1} ${host_wwpn1} \
> + ${remote_wwnn1} ${remote_wwpn1}
> + _nvme_fcloop_add_rport ${host_wwnn2} ${host_wwpn2} \
> + ${remote_wwnn2} ${remote_wwpn2}
> +
> + local port1
> + port1=$(_create_nvmet_port "fc")
> + ag1="$(_create_nvmet_anagroup "${port1}")"
> +
> + local port2
> + port2=$(_create_nvmet_port "fc")
> + ag2="$(_create_nvmet_anagroup "${port2}")"
> +
> + local remote_traddr1
> + remote_traddr1=$(printf "nn-%s:pn-%s" "${remote_wwnn1}" "${remote_wwpn1}")
> + echo fc > /sys/kernel/config/nvmet/ports/${port1}/addr_adrfam
> + echo "${remote_traddr1}" > /sys/kernel/config/nvmet/ports/${port1}/addr_traddr
> +
> + local remote_traddr2
> + remote_traddr2=$(printf "nn-%s:pn-%s" "${remote_wwnn2}" "${remote_wwpn2}")
> + echo fc > /sys/kernel/config/nvmet/ports/${port2}/addr_adrfam
> + echo "${remote_traddr2}" > /sys/kernel/config/nvmet/ports/${port2}/addr_traddr
> +
> + truncate -s 1G "$TMPDIR/img"
> +
> + local loop_dev
> + loop_dev="$(losetup -f --show "$TMPDIR/img")"
> +
> + _create_nvmet_subsystem "${subsys}" "${loop_dev}" \
> + "91fdba0d-f87b-4c25-b80f-db7be1418b9e" "1"
> + _add_nvmet_subsys_to_port "${port1}" "${subsys}"
> + _add_nvmet_subsys_to_port "${port2}" "${subsys}"
> +
> + _set_nvmet_anagroup_state "${port2}" "1" "inaccessible"
> + _set_nvmet_anagroup_state "${port2}" "2" "optimized"
> +
> + local host_traddr1
> + host_traddr1=$(printf "nn-%s:pn-%s" "${host_wwnn1}" "${host_wwpn1}")
> +
> + nvme connect -t fc -a "${remote_traddr1}" -w "${host_traddr1}" \
> + -n "${subsys}"
> +
> + local host_traddr2
> + host_traddr2=$(printf "nn-%s:pn-%s" "${host_wwnn2}" "${host_wwpn2}")
> +
> + nvme connect -t fc -a "${remote_traddr2}" -w "${host_traddr2}" \
> + -n "${subsys}"
> +
> + nvmedev="$(_find_nvme_ns 91fdba0d-f87b-4c25-b80f-db7be1418b9e)"
nvmedev doesn't seem to be used anywhere (shellcheck warns about this).
> + # Allow I/O to settle
> + udevadm settle
> +
> + nvme disconnect -n "${subsys}"
This outputs the following with my version (1.6) of nvme:
NQN:blktests-subsystem-1 disconnected 2 controller(s)
> + _remove_nvmet_subsystem_from_port "${port1}" "${subsys}"
> + _remove_nvmet_subsystem_from_port "${port2}" "${subsys}"
> + _remove_nvmet_subsystem "${subsys}"
> + _remove_nvmet_anagroup "${port1}" "${ag1}"
> + _remove_nvmet_port "${port1}"
> + _remove_nvmet_anagroup "${port2}" "${ag2}"
> + _remove_nvmet_port "${port2}"
> +
> + losetup -d "$loop_dev"
> + rm "$TMPDIR/img"
> +
> + _nvme_fcloop_del_rport "${host_wwnn1}" "${host_wwpn1}" \
> + "${remote_wwnn1}" "${remote_wwpn1}"
> + _nvme_fcloop_del_rport "${host_wwnn2}" "${host_wwpn2}" \
> + "${remote_wwnn2}" "${remote_wwpn2}"
> +
> + _nvme_fcloop_del_tport "${remote_wwnn1}" "${remote_wwpn1}"
> + _nvme_fcloop_del_tport "${remote_wwnn2}" "${remote_wwpn2}"
> +
> + _nvme_fcloop_del_lport "${host_wwnn1}" "${host_wwpn1}"
> + _nvme_fcloop_del_lport "${host_wwnn2}" "${host_wwpn2}"
> +
> + modprobe -r nvme-fcloop
> + modprobe -r nvmet-fc
> + modprobe -r nvmet
> + modprobe -r loop
We don't want to try to remove loop, that's a generic enough module that
it might be in use elsewhere on the system.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 2/3] nvme: add test for ANA state transition
2018-10-15 7:01 ` [PATCH 2/3] nvme: add test for ANA state transition Hannes Reinecke
@ 2018-10-15 21:26 ` Omar Sandoval
2018-10-16 5:52 ` Hannes Reinecke
0 siblings, 1 reply; 13+ messages in thread
From: Omar Sandoval @ 2018-10-15 21:26 UTC (permalink / raw)
On Mon, Oct 15, 2018@09:01:29AM +0200, Hannes Reinecke wrote:
> Signed-off-by: Hannes Reinecke <hare at suse.com>
> ---
> tests/nvme/018 | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> tests/nvme/018.out | 18 +++++++
> 2 files changed, 159 insertions(+)
> create mode 100755 tests/nvme/018
> create mode 100644 tests/nvme/018.out
>
> diff --git a/tests/nvme/018 b/tests/nvme/018
> new file mode 100755
> index 0000000..4d9b6c7
> --- /dev/null
> +++ b/tests/nvme/018
> @@ -0,0 +1,141 @@
> +#!/bin/bash
> +# SPDX-License-Identifier: GPL-2.0+
> +# Regression test for ANA base support
> +#
> +# Copyright (C) 2018 Hannes Reinecke, SUSE Linux GmbH
> +#
> +
> +. tests/nvme/rc
> +
> +DESCRIPTION="test ANA optimized/transitioning/inaccessible support"
> +QUICK=1
> +
> +switch_nvmet_anagroup() {
> + local port1="$1"
> + local port2="$2"
> + local mode="$3"
> +
> + echo "ANA state ${mode}"
> +
> + if [ "${mode}" = "change" ] ; then
> + _set_nvmet_anagroup_state "${port1}" "1" "change"
> + _set_nvmet_anagroup_state "${port1}" "2" "change"
> + _set_nvmet_anagroup_state "${port2}" "1" "change"
> + _set_nvmet_anagroup_state "${port2}" "2" "change"
> + elif [ "${mode}" = "failover" ] ; then
> + _set_nvmet_anagroup_state "${port1}" "1" "inaccessible"
> + _set_nvmet_anagroup_state "${port1}" "2" "optimized"
> + _set_nvmet_anagroup_state "${port2}" "1" "optimized"
> + _set_nvmet_anagroup_state "${port2}" "2" "inaccessible"
> + else
> + _set_nvmet_anagroup_state "${port1}" "1" "optimized"
> + _set_nvmet_anagroup_state "${port1}" "2" "inaccessible"
> + _set_nvmet_anagroup_state "${port2}" "1" "inaccessible"
> + _set_nvmet_anagroup_state "${port2}" "2" "optimized"
> + fi
> +}
> +
> +requires() {
> + _have_program nvme && _have_module nvme-loop && _have_module loop && \
> + _have_configfs && _have_fio
You didn't address the comments from last time (this needs _have_program
mkfs.xfs and _have_module nvmet, IIRC). You also didn't respond to my
rqeuest that this detects if ANA support is available in the kernel. I
had to figure out that I needed CONFIG_NVME_MULTIPATH=y.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/3] nvme: enable ANA support
2018-10-15 21:13 ` Omar Sandoval
@ 2018-10-16 5:49 ` Hannes Reinecke
2018-10-16 19:31 ` Omar Sandoval
0 siblings, 1 reply; 13+ messages in thread
From: Hannes Reinecke @ 2018-10-16 5:49 UTC (permalink / raw)
On 10/15/18 11:13 PM, Omar Sandoval wrote:
> On Mon, Oct 15, 2018@09:01:28AM +0200, Hannes Reinecke wrote:
>> Update functions to support ANA.
>>
>> Signed-off-by: Hannes Reinecke <hare at suse.com>
>> ---
>> tests/nvme/rc | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
>> 1 file changed, 86 insertions(+), 3 deletions(-)
>>
>> diff --git a/tests/nvme/rc b/tests/nvme/rc
>> index eff1dd9..aaf438b 100644
>> --- a/tests/nvme/rc
>> +++ b/tests/nvme/rc
>> @@ -14,7 +14,7 @@ group_device_requires() {
>> _test_dev_is_nvme
>> }
>>
>> -NVMET_CFS="/sys/kernel/config/nvmet/"
>> +NVMET_CFS="/sys/kernel/config/nvmet"
>>
>> _test_dev_is_nvme() {
>> if ! readlink -f "$TEST_DEV_SYSFS/device" | grep -q nvme; then
>> @@ -36,6 +36,7 @@ _create_nvmet_port() {
>>
>> mkdir "${NVMET_CFS}/ports/${port}"
>> echo "${trtype}" > "${NVMET_CFS}/ports/${port}/addr_trtype"
>> + echo "${port}" > "${NVMET_CFS}/ports/${port}/addr_traddr"
>>
>> echo "${port}"
>> }
>> @@ -45,6 +46,62 @@ _remove_nvmet_port() {
>> rmdir "${NVMET_CFS}/ports/${port}"
>> }
>>
>> +_create_nvmet_anagroup() {
>> + local port="$1"
>> + local port_cfs="${NVMET_CFS}/ports/${port}"
>> + local grpid
>> +
>> + for ((grpid = 1; ; grpid++)); do
>> + if [[ ! -e "${port_cfs}/ana_groups/${grpid}" ]]; then
>> + break
>> + fi
>> + done
>> +
>> + mkdir "${port_cfs}/ana_groups/${grpid}"
>> +
>> + echo "${grpid}"
>> +}
>> +
>> +_remove_nvmet_anagroup() {
>> + local port="$1"
>> + local grpid="$2"
>> + local ana_cfs="${NVMET_CFS}/ports/${port}/ana_groups/${grpid}"
>> +
>> + rmdir "${ana_cfs}"
>> +}
>> +
>> +_set_nvmet_anagroup_state() {
>> + local port="$1"
>> + local grpid="$2"
>> + local state="$3"
>> + local ana_cfs="${NVMET_CFS}/ports/${port}/ana_groups/${grpid}"
>> +
>> + echo "${state}" > "${ana_cfs}/ana_state"
>> +}
>> +
>> +_display_ana_state() {
>> + local nvmet_subsystem="$1"
>> + local grpid state cntlid
>> +
>> + for nvme in /sys/class/nvme/* ; do
>> + [ -f ${nvme}/subsysnqn ] || continue
>> + subsys="$(cat "${nvme}/subsysnqn")"
>> + if [ "${subsys}" != "${nvmet_subsystem}" ] ; then
>> + continue
>> + fi
>> + cntlid="$(cat "${nvme}/cntlid")"
>> + for c in ${nvme}/nvme* ; do
>> + if [ ! -d ${c} ] ; then
>> + echo "${cntlid}: ANA disabled"
>> + continue
>> + fi
>> + grpid="$(cat "${c}/ana_grpid")"
>> + state="$(cat "${c}/ana_state")"
>> + echo "${cntlid}: grpid ${grpid} state ${state}"
>> + done
>> + done
>> +}
>> +
>> _create_nvmet_ns() {
>> local nvmet_subsystem="$1"
>> local nsid="$2"
>> @@ -52,14 +109,22 @@ _create_nvmet_ns() {
>> local uuid="00000000-0000-0000-0000-000000000000"
>> local subsys_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
>> local ns_path="${subsys_path}/namespaces/${nsid}"
>> + local ana_grpid
>>
>> - if [[ $# -eq 4 ]]; then
>> + if [[ $# -ge 4 ]]; then
>> uuid="$4"
>> fi
>>
>> + if [[ $# -eq 5 ]]; then
>> + ana_grpid="$5"
>> + fi
>> +
>> mkdir "${ns_path}"
>> printf "%s" "${blkdev}" > "${ns_path}/device_path"
>> printf "%s" "${uuid}" > "${ns_path}/device_uuid"
>> + if [ -n "${ana_grpid}" ] ; then
>> + printf "%s" "${ana_grpid}" > "${ns_path}/ana_grpid"
>> + fi
>> printf 1 > "${ns_path}/enable"
>> }
>>
>> @@ -67,11 +132,12 @@ _create_nvmet_subsystem() {
>> local nvmet_subsystem="$1"
>> local blkdev="$2"
>> local uuid=$3
>> + local ana_grpid=$4
>> local cfs_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
>>
>> mkdir -p "${cfs_path}"
>> echo 1 > "${cfs_path}/attr_allow_any_host"
>> - _create_nvmet_ns "${nvmet_subsystem}" "1" "${blkdev}" "${uuid}"
>> + _create_nvmet_ns "${nvmet_subsystem}" "1" "${blkdev}" "${uuid}" "${ana_grpid}"
>> }
>>
>> _remove_nvmet_ns() {
>> @@ -115,6 +181,23 @@ _find_nvme_loop_dev() {
>> transport="$(cat "/sys/class/nvme/${dev}/transport")"
>> if [[ "$transport" == "loop" ]]; then
>> echo "$dev"
>> + break
>> + fi
>> + done
>> +}
>> +
>> +_find_nvme_ns() {
>> + local uuid=$1
>> + local dev
>> + local hidden
>> +
>> + for dev in /sys/block/nvme*; do
>> + hidden="$(cat "${dev}/hidden")"
>> + [[ "$hidden" -eq 1 ]] && continue
>> + u="$(cat "${dev}/uuid")"
>> + if [[ "$uuid" = "$u" ]] ; then
>> + echo "$(basename "${dev}")"
>> + break
>
> This fails if I have another NVMe device:
>
> cat: /sys/block/nvme0n1/uuid: No such file or directory
>
> And there are a bunch of shellcheck errors. The following fixes all of
> that:
>
> diff --git a/tests/nvme/rc b/tests/nvme/rc
> index 3b3d852..0c8fc62 100644
> --- a/tests/nvme/rc
> +++ b/tests/nvme/rc
> @@ -84,14 +84,14 @@ _display_ana_state() {
> local grpid state cntlid
>
> for nvme in /sys/class/nvme/* ; do
> - [ -f ${nvme}/subsysnqn ] || continue
> + [[ -f ${nvme}/subsysnqn ]] || continue
> subsys="$(cat "${nvme}/subsysnqn")"
> - if [ "${subsys}" != "${nvmet_subsystem}" ] ; then
> + if [[ "${subsys}" != "${nvmet_subsystem}" ]] ; then
> continue
> fi
> cntlid="$(cat "${nvme}/cntlid")"
> - for c in ${nvme}/nvme* ; do
> - if [ ! -d ${c} ] ; then
> + for c in "${nvme}/nvme"* ; do
> + if [[ ! -d ${c} ]] ; then
> echo "${cntlid}: ANA disabled"
> continue
> fi
> @@ -122,7 +122,7 @@ _create_nvmet_ns() {
> mkdir "${ns_path}"
> printf "%s" "${blkdev}" > "${ns_path}/device_path"
> printf "%s" "${uuid}" > "${ns_path}/device_uuid"
> - if [ -n "${ana_grpid}" ] ; then
> + if [[ -n ${ana_grpid} ]] ; then
> printf "%s" "${ana_grpid}" > "${ns_path}/ana_grpid"
> fi
> printf 1 > "${ns_path}/enable"
> @@ -194,9 +194,8 @@ _find_nvme_ns() {
> for dev in /sys/block/nvme*; do
> hidden="$(cat "${dev}/hidden")"
> [[ "$hidden" -eq 1 ]] && continue
> - u="$(cat "${dev}/uuid")"
> - if [[ "$uuid" = "$u" ]] ; then
> - echo "$(basename "${dev}")"
> + if [[ -e "${dev}/uuid" && "$(cat "${dev}/uuid")" = "$uuid" ]] ; then
> + basename "${dev}"
> break
> fi
> done
>
Thanks.
Should I resend my patchset?
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare at suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N?rnberg
GF: F. Imend?rffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG N?rnberg)
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 3/3] nvme: Add test for fcloop
2018-10-15 21:17 ` Omar Sandoval
@ 2018-10-16 5:50 ` Hannes Reinecke
2018-10-16 19:31 ` Omar Sandoval
0 siblings, 1 reply; 13+ messages in thread
From: Hannes Reinecke @ 2018-10-16 5:50 UTC (permalink / raw)
On 10/15/18 11:17 PM, Omar Sandoval wrote:
> On Mon, Oct 15, 2018@09:01:30AM +0200, Hannes Reinecke wrote:
>> Signed-off-by: Hannes Reinecke <hare at suse.com>
>> ---
>> tests/nvme/029 | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>> tests/nvme/029.out | 2 +
>> tests/nvme/rc | 52 ++++++++++++++++++++++
>> 3 files changed, 177 insertions(+)
>> create mode 100755 tests/nvme/029
>> create mode 100644 tests/nvme/029.out
>>
>> diff --git a/tests/nvme/029 b/tests/nvme/029
>> new file mode 100755
>> index 0000000..f8ed9b5
>> --- /dev/null
>> +++ b/tests/nvme/029
>> @@ -0,0 +1,123 @@
>> +#!/bin/bash
>> +# SPDX-License-Identifier: GPL-2.0+
>> +# Copyright (C) 2018 Johannes Thumshirn, Hannes Reinecke, SUSE Linux GmbH
>> +#
>> +# Reproducer for nvme-fcloop
>> +#
>> +
>> +. tests/nvme/rc
>> +
>> +DESCRIPTION="create nvme-fcloop with two ports and connect/disconnect"
>> +
>> +requires() {
>> + _have_module nvme-fcloop && _have_module nvmet && _have_module loop && \
>> + _have_configfs && _have_module nvme-core && \
>> + _have_module nvmet-fc
>> +}
>> +
>> +test() {
>> + local subsys="blktests-subsystem-1"
>> + local remote_wwnn1="0x100140111111dbcc"
>> + local remote_wwpn1="0x200140111111dbcc"
>> + local remote_wwnn2="0x100140111111dbcd"
>> + local remote_wwpn2="0x200140111111dbcd"
>> + local host_wwnn1="0x100140111111dac8"
>> + local host_wwpn1="0x200140111111dac8"
>> + local host_wwnn2="0x100140111111dac9"
>> + local host_wwpn2="0x200140111111dac9"
>> +
>> + echo "Running ${TEST_NAME}"
>> +
>> + modprobe nvmet-fc
>> + modprobe nvme-fcloop
>> +
>> + _nvme_fcloop_add_tport ${remote_wwnn1} ${remote_wwpn1}
>> + _nvme_fcloop_add_tport ${remote_wwnn2} ${remote_wwpn2}
>> +
>> + _nvme_fcloop_add_lport ${host_wwnn1} ${host_wwpn1}
>> + _nvme_fcloop_add_lport ${host_wwnn2} ${host_wwpn2}
>> +
>> + _nvme_fcloop_add_rport ${host_wwnn1} ${host_wwpn1} \
>> + ${remote_wwnn1} ${remote_wwpn1}
>> + _nvme_fcloop_add_rport ${host_wwnn2} ${host_wwpn2} \
>> + ${remote_wwnn2} ${remote_wwpn2}
>> +
>> + local port1
>> + port1=$(_create_nvmet_port "fc")
>> + ag1="$(_create_nvmet_anagroup "${port1}")"
>> +
>> + local port2
>> + port2=$(_create_nvmet_port "fc")
>> + ag2="$(_create_nvmet_anagroup "${port2}")"
>> +
>> + local remote_traddr1
>> + remote_traddr1=$(printf "nn-%s:pn-%s" "${remote_wwnn1}" "${remote_wwpn1}")
>> + echo fc > /sys/kernel/config/nvmet/ports/${port1}/addr_adrfam
>> + echo "${remote_traddr1}" > /sys/kernel/config/nvmet/ports/${port1}/addr_traddr
>> +
>> + local remote_traddr2
>> + remote_traddr2=$(printf "nn-%s:pn-%s" "${remote_wwnn2}" "${remote_wwpn2}")
>> + echo fc > /sys/kernel/config/nvmet/ports/${port2}/addr_adrfam
>> + echo "${remote_traddr2}" > /sys/kernel/config/nvmet/ports/${port2}/addr_traddr
>> +
>> + truncate -s 1G "$TMPDIR/img"
>> +
>> + local loop_dev
>> + loop_dev="$(losetup -f --show "$TMPDIR/img")"
>> +
>> + _create_nvmet_subsystem "${subsys}" "${loop_dev}" \
>> + "91fdba0d-f87b-4c25-b80f-db7be1418b9e" "1"
>> + _add_nvmet_subsys_to_port "${port1}" "${subsys}"
>> + _add_nvmet_subsys_to_port "${port2}" "${subsys}"
>> +
>> + _set_nvmet_anagroup_state "${port2}" "1" "inaccessible"
>> + _set_nvmet_anagroup_state "${port2}" "2" "optimized"
>> +
>> + local host_traddr1
>> + host_traddr1=$(printf "nn-%s:pn-%s" "${host_wwnn1}" "${host_wwpn1}")
>> +
>> + nvme connect -t fc -a "${remote_traddr1}" -w "${host_traddr1}" \
>> + -n "${subsys}"
>> +
>> + local host_traddr2
>> + host_traddr2=$(printf "nn-%s:pn-%s" "${host_wwnn2}" "${host_wwpn2}")
>> +
>> + nvme connect -t fc -a "${remote_traddr2}" -w "${host_traddr2}" \
>> + -n "${subsys}"
>> +
>> + nvmedev="$(_find_nvme_ns 91fdba0d-f87b-4c25-b80f-db7be1418b9e)"
>
> nvmedev doesn't seem to be used anywhere (shellcheck warns about this).
>
Okay, will be removing the variable
>> + # Allow I/O to settle
>> + udevadm settle
>> +
>> + nvme disconnect -n "${subsys}"
>
> This outputs the following with my version (1.6) of nvme:
>
> NQN:blktests-subsystem-1 disconnected 2 controller(s)
>
And? That's what I expected, so where's the rub?
>> + _remove_nvmet_subsystem_from_port "${port1}" "${subsys}"
>> + _remove_nvmet_subsystem_from_port "${port2}" "${subsys}"
>> + _remove_nvmet_subsystem "${subsys}"
>> + _remove_nvmet_anagroup "${port1}" "${ag1}"
>> + _remove_nvmet_port "${port1}"
>> + _remove_nvmet_anagroup "${port2}" "${ag2}"
>> + _remove_nvmet_port "${port2}"
>> +
>> + losetup -d "$loop_dev"
>> + rm "$TMPDIR/img"
>> +
>> + _nvme_fcloop_del_rport "${host_wwnn1}" "${host_wwpn1}" \
>> + "${remote_wwnn1}" "${remote_wwpn1}"
>> + _nvme_fcloop_del_rport "${host_wwnn2}" "${host_wwpn2}" \
>> + "${remote_wwnn2}" "${remote_wwpn2}"
>> +
>> + _nvme_fcloop_del_tport "${remote_wwnn1}" "${remote_wwpn1}"
>> + _nvme_fcloop_del_tport "${remote_wwnn2}" "${remote_wwpn2}"
>> +
>> + _nvme_fcloop_del_lport "${host_wwnn1}" "${host_wwpn1}"
>> + _nvme_fcloop_del_lport "${host_wwnn2}" "${host_wwpn2}"
>> +
>> + modprobe -r nvme-fcloop
>> + modprobe -r nvmet-fc
>> + modprobe -r nvmet
>> + modprobe -r loop
>
> We don't want to try to remove loop, that's a generic enough module that
> it might be in use elsewhere on the system.
>
Good point.
Will be fixing it up.
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare at suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N?rnberg
GF: F. Imend?rffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG N?rnberg)
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 2/3] nvme: add test for ANA state transition
2018-10-15 21:26 ` Omar Sandoval
@ 2018-10-16 5:52 ` Hannes Reinecke
0 siblings, 0 replies; 13+ messages in thread
From: Hannes Reinecke @ 2018-10-16 5:52 UTC (permalink / raw)
On 10/15/18 11:26 PM, Omar Sandoval wrote:
> On Mon, Oct 15, 2018@09:01:29AM +0200, Hannes Reinecke wrote:
>> Signed-off-by: Hannes Reinecke <hare at suse.com>
>> ---
>> tests/nvme/018 | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++
>> tests/nvme/018.out | 18 +++++++
>> 2 files changed, 159 insertions(+)
>> create mode 100755 tests/nvme/018
>> create mode 100644 tests/nvme/018.out
>>
>> diff --git a/tests/nvme/018 b/tests/nvme/018
>> new file mode 100755
>> index 0000000..4d9b6c7
>> --- /dev/null
>> +++ b/tests/nvme/018
>> @@ -0,0 +1,141 @@
>> +#!/bin/bash
>> +# SPDX-License-Identifier: GPL-2.0+
>> +# Regression test for ANA base support
>> +#
>> +# Copyright (C) 2018 Hannes Reinecke, SUSE Linux GmbH
>> +#
>> +
>> +. tests/nvme/rc
>> +
>> +DESCRIPTION="test ANA optimized/transitioning/inaccessible support"
>> +QUICK=1
>> +
>> +switch_nvmet_anagroup() {
>> + local port1="$1"
>> + local port2="$2"
>> + local mode="$3"
>> +
>> + echo "ANA state ${mode}"
>> +
>> + if [ "${mode}" = "change" ] ; then
>> + _set_nvmet_anagroup_state "${port1}" "1" "change"
>> + _set_nvmet_anagroup_state "${port1}" "2" "change"
>> + _set_nvmet_anagroup_state "${port2}" "1" "change"
>> + _set_nvmet_anagroup_state "${port2}" "2" "change"
>> + elif [ "${mode}" = "failover" ] ; then
>> + _set_nvmet_anagroup_state "${port1}" "1" "inaccessible"
>> + _set_nvmet_anagroup_state "${port1}" "2" "optimized"
>> + _set_nvmet_anagroup_state "${port2}" "1" "optimized"
>> + _set_nvmet_anagroup_state "${port2}" "2" "inaccessible"
>> + else
>> + _set_nvmet_anagroup_state "${port1}" "1" "optimized"
>> + _set_nvmet_anagroup_state "${port1}" "2" "inaccessible"
>> + _set_nvmet_anagroup_state "${port2}" "1" "inaccessible"
>> + _set_nvmet_anagroup_state "${port2}" "2" "optimized"
>> + fi
>> +}
>> +
>> +requires() {
>> + _have_program nvme && _have_module nvme-loop && _have_module loop && \
>> + _have_configfs && _have_fio
>
> You didn't address the comments from last time (this needs _have_program
> mkfs.xfs and _have_module nvmet, IIRC). You also didn't respond to my
> rqeuest that this detects if ANA support is available in the kernel. I
> had to figure out that I needed CONFIG_NVME_MULTIPATH=y.
>
And even that is not sufficient; the user might have disabled the use of
native nvme multipathing on the kernel commandline.
I see what I can do to fix it up.
Cheers,
Hannes
--
Dr. Hannes Reinecke Teamlead Storage & Networking
hare at suse.de +49 911 74053 688
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 N?rnberg
GF: F. Imend?rffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton
HRB 21284 (AG N?rnberg)
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 3/3] nvme: Add test for fcloop
2018-10-16 5:50 ` Hannes Reinecke
@ 2018-10-16 19:31 ` Omar Sandoval
0 siblings, 0 replies; 13+ messages in thread
From: Omar Sandoval @ 2018-10-16 19:31 UTC (permalink / raw)
On Tue, Oct 16, 2018@07:50:37AM +0200, Hannes Reinecke wrote:
> On 10/15/18 11:17 PM, Omar Sandoval wrote:
> > On Mon, Oct 15, 2018@09:01:30AM +0200, Hannes Reinecke wrote:
> > > Signed-off-by: Hannes Reinecke <hare at suse.com>
> > > ---
> > > tests/nvme/029 | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++++
> > > tests/nvme/029.out | 2 +
> > > tests/nvme/rc | 52 ++++++++++++++++++++++
> > > 3 files changed, 177 insertions(+)
> > > create mode 100755 tests/nvme/029
> > > create mode 100644 tests/nvme/029.out
> > >
> > > diff --git a/tests/nvme/029 b/tests/nvme/029
> > > new file mode 100755
> > > index 0000000..f8ed9b5
> > > --- /dev/null
> > > +++ b/tests/nvme/029
> > > @@ -0,0 +1,123 @@
> > > +#!/bin/bash
> > > +# SPDX-License-Identifier: GPL-2.0+
> > > +# Copyright (C) 2018 Johannes Thumshirn, Hannes Reinecke, SUSE Linux GmbH
> > > +#
> > > +# Reproducer for nvme-fcloop
> > > +#
> > > +
> > > +. tests/nvme/rc
> > > +
> > > +DESCRIPTION="create nvme-fcloop with two ports and connect/disconnect"
> > > +
> > > +requires() {
> > > + _have_module nvme-fcloop && _have_module nvmet && _have_module loop && \
> > > + _have_configfs && _have_module nvme-core && \
> > > + _have_module nvmet-fc
> > > +}
> > > +
> > > +test() {
> > > + local subsys="blktests-subsystem-1"
> > > + local remote_wwnn1="0x100140111111dbcc"
> > > + local remote_wwpn1="0x200140111111dbcc"
> > > + local remote_wwnn2="0x100140111111dbcd"
> > > + local remote_wwpn2="0x200140111111dbcd"
> > > + local host_wwnn1="0x100140111111dac8"
> > > + local host_wwpn1="0x200140111111dac8"
> > > + local host_wwnn2="0x100140111111dac9"
> > > + local host_wwpn2="0x200140111111dac9"
> > > +
> > > + echo "Running ${TEST_NAME}"
> > > +
> > > + modprobe nvmet-fc
> > > + modprobe nvme-fcloop
> > > +
> > > + _nvme_fcloop_add_tport ${remote_wwnn1} ${remote_wwpn1}
> > > + _nvme_fcloop_add_tport ${remote_wwnn2} ${remote_wwpn2}
> > > +
> > > + _nvme_fcloop_add_lport ${host_wwnn1} ${host_wwpn1}
> > > + _nvme_fcloop_add_lport ${host_wwnn2} ${host_wwpn2}
> > > +
> > > + _nvme_fcloop_add_rport ${host_wwnn1} ${host_wwpn1} \
> > > + ${remote_wwnn1} ${remote_wwpn1}
> > > + _nvme_fcloop_add_rport ${host_wwnn2} ${host_wwpn2} \
> > > + ${remote_wwnn2} ${remote_wwpn2}
> > > +
> > > + local port1
> > > + port1=$(_create_nvmet_port "fc")
> > > + ag1="$(_create_nvmet_anagroup "${port1}")"
> > > +
> > > + local port2
> > > + port2=$(_create_nvmet_port "fc")
> > > + ag2="$(_create_nvmet_anagroup "${port2}")"
> > > +
> > > + local remote_traddr1
> > > + remote_traddr1=$(printf "nn-%s:pn-%s" "${remote_wwnn1}" "${remote_wwpn1}")
> > > + echo fc > /sys/kernel/config/nvmet/ports/${port1}/addr_adrfam
> > > + echo "${remote_traddr1}" > /sys/kernel/config/nvmet/ports/${port1}/addr_traddr
> > > +
> > > + local remote_traddr2
> > > + remote_traddr2=$(printf "nn-%s:pn-%s" "${remote_wwnn2}" "${remote_wwpn2}")
> > > + echo fc > /sys/kernel/config/nvmet/ports/${port2}/addr_adrfam
> > > + echo "${remote_traddr2}" > /sys/kernel/config/nvmet/ports/${port2}/addr_traddr
> > > +
> > > + truncate -s 1G "$TMPDIR/img"
> > > +
> > > + local loop_dev
> > > + loop_dev="$(losetup -f --show "$TMPDIR/img")"
> > > +
> > > + _create_nvmet_subsystem "${subsys}" "${loop_dev}" \
> > > + "91fdba0d-f87b-4c25-b80f-db7be1418b9e" "1"
> > > + _add_nvmet_subsys_to_port "${port1}" "${subsys}"
> > > + _add_nvmet_subsys_to_port "${port2}" "${subsys}"
> > > +
> > > + _set_nvmet_anagroup_state "${port2}" "1" "inaccessible"
> > > + _set_nvmet_anagroup_state "${port2}" "2" "optimized"
> > > +
> > > + local host_traddr1
> > > + host_traddr1=$(printf "nn-%s:pn-%s" "${host_wwnn1}" "${host_wwpn1}")
> > > +
> > > + nvme connect -t fc -a "${remote_traddr1}" -w "${host_traddr1}" \
> > > + -n "${subsys}"
> > > +
> > > + local host_traddr2
> > > + host_traddr2=$(printf "nn-%s:pn-%s" "${host_wwnn2}" "${host_wwpn2}")
> > > +
> > > + nvme connect -t fc -a "${remote_traddr2}" -w "${host_traddr2}" \
> > > + -n "${subsys}"
> > > +
> > > + nvmedev="$(_find_nvme_ns 91fdba0d-f87b-4c25-b80f-db7be1418b9e)"
> >
> > nvmedev doesn't seem to be used anywhere (shellcheck warns about this).
> >
> Okay, will be removing the variable
>
> > > + # Allow I/O to settle
> > > + udevadm settle
> > > +
> > > + nvme disconnect -n "${subsys}"
> >
> > This outputs the following with my version (1.6) of nvme:
> >
> > NQN:blktests-subsystem-1 disconnected 2 controller(s)
> >
> And? That's what I expected, so where's the rub?
The expected test output does not include it.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/3] nvme: enable ANA support
2018-10-16 5:49 ` Hannes Reinecke
@ 2018-10-16 19:31 ` Omar Sandoval
0 siblings, 0 replies; 13+ messages in thread
From: Omar Sandoval @ 2018-10-16 19:31 UTC (permalink / raw)
On Tue, Oct 16, 2018@07:49:20AM +0200, Hannes Reinecke wrote:
> On 10/15/18 11:13 PM, Omar Sandoval wrote:
> > On Mon, Oct 15, 2018@09:01:28AM +0200, Hannes Reinecke wrote:
> > > Update functions to support ANA.
> > >
> > > Signed-off-by: Hannes Reinecke <hare at suse.com>
> > > ---
> > > tests/nvme/rc | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
> > > 1 file changed, 86 insertions(+), 3 deletions(-)
> > >
> > > diff --git a/tests/nvme/rc b/tests/nvme/rc
> > > index eff1dd9..aaf438b 100644
> > > --- a/tests/nvme/rc
> > > +++ b/tests/nvme/rc
> > > @@ -14,7 +14,7 @@ group_device_requires() {
> > > _test_dev_is_nvme
> > > }
> > > -NVMET_CFS="/sys/kernel/config/nvmet/"
> > > +NVMET_CFS="/sys/kernel/config/nvmet"
> > > _test_dev_is_nvme() {
> > > if ! readlink -f "$TEST_DEV_SYSFS/device" | grep -q nvme; then
> > > @@ -36,6 +36,7 @@ _create_nvmet_port() {
> > > mkdir "${NVMET_CFS}/ports/${port}"
> > > echo "${trtype}" > "${NVMET_CFS}/ports/${port}/addr_trtype"
> > > + echo "${port}" > "${NVMET_CFS}/ports/${port}/addr_traddr"
> > > echo "${port}"
> > > }
> > > @@ -45,6 +46,62 @@ _remove_nvmet_port() {
> > > rmdir "${NVMET_CFS}/ports/${port}"
> > > }
> > > +_create_nvmet_anagroup() {
> > > + local port="$1"
> > > + local port_cfs="${NVMET_CFS}/ports/${port}"
> > > + local grpid
> > > +
> > > + for ((grpid = 1; ; grpid++)); do
> > > + if [[ ! -e "${port_cfs}/ana_groups/${grpid}" ]]; then
> > > + break
> > > + fi
> > > + done
> > > +
> > > + mkdir "${port_cfs}/ana_groups/${grpid}"
> > > +
> > > + echo "${grpid}"
> > > +}
> > > +
> > > +_remove_nvmet_anagroup() {
> > > + local port="$1"
> > > + local grpid="$2"
> > > + local ana_cfs="${NVMET_CFS}/ports/${port}/ana_groups/${grpid}"
> > > +
> > > + rmdir "${ana_cfs}"
> > > +}
> > > +
> > > +_set_nvmet_anagroup_state() {
> > > + local port="$1"
> > > + local grpid="$2"
> > > + local state="$3"
> > > + local ana_cfs="${NVMET_CFS}/ports/${port}/ana_groups/${grpid}"
> > > +
> > > + echo "${state}" > "${ana_cfs}/ana_state"
> > > +}
> > > +
> > > +_display_ana_state() {
> > > + local nvmet_subsystem="$1"
> > > + local grpid state cntlid
> > > +
> > > + for nvme in /sys/class/nvme/* ; do
> > > + [ -f ${nvme}/subsysnqn ] || continue
> > > + subsys="$(cat "${nvme}/subsysnqn")"
> > > + if [ "${subsys}" != "${nvmet_subsystem}" ] ; then
> > > + continue
> > > + fi
> > > + cntlid="$(cat "${nvme}/cntlid")"
> > > + for c in ${nvme}/nvme* ; do
> > > + if [ ! -d ${c} ] ; then
> > > + echo "${cntlid}: ANA disabled"
> > > + continue
> > > + fi
> > > + grpid="$(cat "${c}/ana_grpid")"
> > > + state="$(cat "${c}/ana_state")"
> > > + echo "${cntlid}: grpid ${grpid} state ${state}"
> > > + done
> > > + done
> > > +}
> > > +
> > > _create_nvmet_ns() {
> > > local nvmet_subsystem="$1"
> > > local nsid="$2"
> > > @@ -52,14 +109,22 @@ _create_nvmet_ns() {
> > > local uuid="00000000-0000-0000-0000-000000000000"
> > > local subsys_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
> > > local ns_path="${subsys_path}/namespaces/${nsid}"
> > > + local ana_grpid
> > > - if [[ $# -eq 4 ]]; then
> > > + if [[ $# -ge 4 ]]; then
> > > uuid="$4"
> > > fi
> > > + if [[ $# -eq 5 ]]; then
> > > + ana_grpid="$5"
> > > + fi
> > > +
> > > mkdir "${ns_path}"
> > > printf "%s" "${blkdev}" > "${ns_path}/device_path"
> > > printf "%s" "${uuid}" > "${ns_path}/device_uuid"
> > > + if [ -n "${ana_grpid}" ] ; then
> > > + printf "%s" "${ana_grpid}" > "${ns_path}/ana_grpid"
> > > + fi
> > > printf 1 > "${ns_path}/enable"
> > > }
> > > @@ -67,11 +132,12 @@ _create_nvmet_subsystem() {
> > > local nvmet_subsystem="$1"
> > > local blkdev="$2"
> > > local uuid=$3
> > > + local ana_grpid=$4
> > > local cfs_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
> > > mkdir -p "${cfs_path}"
> > > echo 1 > "${cfs_path}/attr_allow_any_host"
> > > - _create_nvmet_ns "${nvmet_subsystem}" "1" "${blkdev}" "${uuid}"
> > > + _create_nvmet_ns "${nvmet_subsystem}" "1" "${blkdev}" "${uuid}" "${ana_grpid}"
> > > }
> > > _remove_nvmet_ns() {
> > > @@ -115,6 +181,23 @@ _find_nvme_loop_dev() {
> > > transport="$(cat "/sys/class/nvme/${dev}/transport")"
> > > if [[ "$transport" == "loop" ]]; then
> > > echo "$dev"
> > > + break
> > > + fi
> > > + done
> > > +}
> > > +
> > > +_find_nvme_ns() {
> > > + local uuid=$1
> > > + local dev
> > > + local hidden
> > > +
> > > + for dev in /sys/block/nvme*; do
> > > + hidden="$(cat "${dev}/hidden")"
> > > + [[ "$hidden" -eq 1 ]] && continue
> > > + u="$(cat "${dev}/uuid")"
> > > + if [[ "$uuid" = "$u" ]] ; then
> > > + echo "$(basename "${dev}")"
> > > + break
> >
> > This fails if I have another NVMe device:
> >
> > cat: /sys/block/nvme0n1/uuid: No such file or directory
> >
> > And there are a bunch of shellcheck errors. The following fixes all of
> > that:
> >
> > diff --git a/tests/nvme/rc b/tests/nvme/rc
> > index 3b3d852..0c8fc62 100644
> > --- a/tests/nvme/rc
> > +++ b/tests/nvme/rc
> > @@ -84,14 +84,14 @@ _display_ana_state() {
> > local grpid state cntlid
> > for nvme in /sys/class/nvme/* ; do
> > - [ -f ${nvme}/subsysnqn ] || continue
> > + [[ -f ${nvme}/subsysnqn ]] || continue
> > subsys="$(cat "${nvme}/subsysnqn")"
> > - if [ "${subsys}" != "${nvmet_subsystem}" ] ; then
> > + if [[ "${subsys}" != "${nvmet_subsystem}" ]] ; then
> > continue
> > fi
> > cntlid="$(cat "${nvme}/cntlid")"
> > - for c in ${nvme}/nvme* ; do
> > - if [ ! -d ${c} ] ; then
> > + for c in "${nvme}/nvme"* ; do
> > + if [[ ! -d ${c} ]] ; then
> > echo "${cntlid}: ANA disabled"
> > continue
> > fi
> > @@ -122,7 +122,7 @@ _create_nvmet_ns() {
> > mkdir "${ns_path}"
> > printf "%s" "${blkdev}" > "${ns_path}/device_path"
> > printf "%s" "${uuid}" > "${ns_path}/device_uuid"
> > - if [ -n "${ana_grpid}" ] ; then
> > + if [[ -n ${ana_grpid} ]] ; then
> > printf "%s" "${ana_grpid}" > "${ns_path}/ana_grpid"
> > fi
> > printf 1 > "${ns_path}/enable"
> > @@ -194,9 +194,8 @@ _find_nvme_ns() {
> > for dev in /sys/block/nvme*; do
> > hidden="$(cat "${dev}/hidden")"
> > [[ "$hidden" -eq 1 ]] && continue
> > - u="$(cat "${dev}/uuid")"
> > - if [[ "$uuid" = "$u" ]] ; then
> > - echo "$(basename "${dev}")"
> > + if [[ -e "${dev}/uuid" && "$(cat "${dev}/uuid")" = "$uuid" ]] ; then
> > + basename "${dev}"
> > break
> > fi
> > done
> >
> Thanks.
>
> Should I resend my patchset?
Yes, please, with the other mentioned issues addressed.
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH 1/3] nvme: enable ANA support
2020-03-05 11:52 [PATCH blktests 0/3] ANA and fcloop tests Hannes Reinecke
@ 2020-03-05 11:52 ` Hannes Reinecke
0 siblings, 0 replies; 13+ messages in thread
From: Hannes Reinecke @ 2020-03-05 11:52 UTC (permalink / raw)
To: Omar Sandoval
Cc: Hannes Reinecke, Chaitanya Kulkarni, James Smart, linux-nvme,
linux-block, Hannes Reinecke
Add ANA support functions and update _create_nvmet_ns() to
accept an additional ANA grpid parameter.
Signed-off-by: Hannes Reinecke <hare@suse.com>
---
tests/nvme/rc | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 file changed, 69 insertions(+), 3 deletions(-)
diff --git a/tests/nvme/rc b/tests/nvme/rc
index 40f0413..72e33c1 100644
--- a/tests/nvme/rc
+++ b/tests/nvme/rc
@@ -14,7 +14,7 @@ group_device_requires() {
_test_dev_is_nvme
}
-NVMET_CFS="/sys/kernel/config/nvmet/"
+NVMET_CFS="/sys/kernel/config/nvmet"
_test_dev_is_nvme() {
if ! readlink -f "$TEST_DEV_SYSFS/device" | grep -q nvme; then
@@ -90,6 +90,7 @@ _create_nvmet_port() {
mkdir "${NVMET_CFS}/ports/${port}"
echo "${trtype}" > "${NVMET_CFS}/ports/${port}/addr_trtype"
+ echo "${port}" > "${NVMET_CFS}/ports/${port}/addr_traddr"
echo "${port}"
}
@@ -99,6 +100,62 @@ _remove_nvmet_port() {
rmdir "${NVMET_CFS}/ports/${port}"
}
+_create_nvmet_anagroup() {
+ local port="$1"
+ local port_cfs="${NVMET_CFS}/ports/${port}"
+ local grpid
+
+ for ((grpid = 1; ; grpid++)); do
+ if [[ ! -e "${port_cfs}/ana_groups/${grpid}" ]]; then
+ break
+ fi
+ done
+
+ mkdir "${port_cfs}/ana_groups/${grpid}"
+
+ echo "${grpid}"
+}
+
+_remove_nvmet_anagroup() {
+ local port="$1"
+ local grpid="$2"
+ local ana_cfs="${NVMET_CFS}/ports/${port}/ana_groups/${grpid}"
+
+ rmdir "${ana_cfs}"
+}
+
+_set_nvmet_anagroup_state() {
+ local port="$1"
+ local grpid="$2"
+ local state="$3"
+ local ana_cfs="${NVMET_CFS}/ports/${port}/ana_groups/${grpid}"
+
+ echo "${state}" > "${ana_cfs}/ana_state"
+}
+
+_display_ana_state() {
+ local nvmet_subsystem="$1"
+ local grpid state cntlid
+
+ for nvme in /sys/class/nvme/* ; do
+ [ -f ${nvme}/subsysnqn ] || continue
+ subsys="$(cat "${nvme}/subsysnqn")"
+ if [ "${subsys}" != "${nvmet_subsystem}" ] ; then
+ continue
+ fi
+ cntlid="$(cat "${nvme}/cntlid")"
+ for c in ${nvme}/nvme* ; do
+ if [ ! -d ${c} ] ; then
+ echo "${cntlid}: ANA disabled"
+ continue
+ fi
+ grpid="$(cat "${c}/ana_grpid")"
+ state="$(cat "${c}/ana_state")"
+ echo "${cntlid}: grpid ${grpid} state ${state}"
+ done
+ done
+}
+
_create_nvmet_ns() {
local nvmet_subsystem="$1"
local nsid="$2"
@@ -106,14 +163,22 @@ _create_nvmet_ns() {
local uuid="00000000-0000-0000-0000-000000000000"
local subsys_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
local ns_path="${subsys_path}/namespaces/${nsid}"
+ local ana_grpid
- if [[ $# -eq 4 ]]; then
+ if [[ $# -ge 4 ]]; then
uuid="$4"
fi
+ if [[ $# -eq 5 ]]; then
+ ana_grpid="$5"
+ fi
+
mkdir "${ns_path}"
printf "%s" "${blkdev}" > "${ns_path}/device_path"
printf "%s" "${uuid}" > "${ns_path}/device_uuid"
+ if [ -n "${ana_grpid}" ] ; then
+ printf "%s" "${ana_grpid}" > "${ns_path}/ana_grpid"
+ fi
printf 1 > "${ns_path}/enable"
}
@@ -121,11 +186,12 @@ _create_nvmet_subsystem() {
local nvmet_subsystem="$1"
local blkdev="$2"
local uuid=$3
+ local ana_grpid=$4
local cfs_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
mkdir -p "${cfs_path}"
echo 1 > "${cfs_path}/attr_allow_any_host"
- _create_nvmet_ns "${nvmet_subsystem}" "1" "${blkdev}" "${uuid}"
+ _create_nvmet_ns "${nvmet_subsystem}" "1" "${blkdev}" "${uuid}" "${ana_grpid}"
}
_remove_nvmet_ns() {
--
2.13.7
_______________________________________________
linux-nvme mailing list
linux-nvme@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-nvme
^ permalink raw reply related [flat|nested] 13+ messages in thread
end of thread, other threads:[~2020-03-05 11:53 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-10-15 7:01 [PATCH 0/3] blktests: ANA and FC-Loop support Hannes Reinecke
2018-10-15 7:01 ` [PATCH 1/3] nvme: enable ANA support Hannes Reinecke
2018-10-15 21:13 ` Omar Sandoval
2018-10-16 5:49 ` Hannes Reinecke
2018-10-16 19:31 ` Omar Sandoval
2018-10-15 7:01 ` [PATCH 2/3] nvme: add test for ANA state transition Hannes Reinecke
2018-10-15 21:26 ` Omar Sandoval
2018-10-16 5:52 ` Hannes Reinecke
2018-10-15 7:01 ` [PATCH 3/3] nvme: Add test for fcloop Hannes Reinecke
2018-10-15 21:17 ` Omar Sandoval
2018-10-16 5:50 ` Hannes Reinecke
2018-10-16 19:31 ` Omar Sandoval
-- strict thread matches above, loose matches on Subject: below --
2020-03-05 11:52 [PATCH blktests 0/3] ANA and fcloop tests Hannes Reinecke
2020-03-05 11:52 ` [PATCH 1/3] nvme: enable ANA support Hannes Reinecke
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).