linux-nvme.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
From: osandov@osandov.com (Omar Sandoval)
Subject: [PATCH 1/3] nvme: enable ANA support
Date: Mon, 15 Oct 2018 14:13:23 -0700	[thread overview]
Message-ID: <20181015211323.GB23044@vader> (raw)
In-Reply-To: <20181015070130.6695-2-hare@suse.de>

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

  reply	other threads:[~2018-10-15 21:13 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 [this message]
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

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20181015211323.GB23044@vader \
    --to=osandov@osandov.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).