[PATCH blktests v2 1/2] nvme: move helper functions to common/nvme
Ofir Gal
ofir.gal at volumez.com
Tue Jul 16 02:23:16 PDT 2024
On 6/26/24 14:18, Shinichiro Kawasaki wrote:
> On Jun 24, 2024 / 13:46, Ofir Gal wrote:
>> Move functions from tests/nvme/rc to common/nvme to be able to reuse
>> them in other tests groups.
>>
>> Signed-off-by: Ofir Gal <ofir.gal at volumez.com>
>> ---
>> I have moved the function that are nessecary for the regression test I
>> add. Let me know if we want to move more or all the functions to
>> common/nvme.
>>
>> shellcheck detects 2 new warnings:
>> common/nvme:35:10: warning: nvme_trtype is referenced but not assigned. [SC2154]
>> common/nvme:234:11: warning: nvme_adrfam is referenced but not assigned. [SC2154]
>>
>> I have tried to figure out why but I couldn't figure out what is
>> different than the upstream version. How can I fix them?
>
> Hi Ofir, thanks for this work. Please find two comments in line below. One of
> them suggests a fix for the shellcheck warnings.
>
Applied to v3
>>
>>
>> common/nvme | 595 ++++++++++++++++++++++++++++++++++++++++++++++++++
>> tests/nvme/rc | 591 +------------------------------------------------
>> 2 files changed, 596 insertions(+), 590 deletions(-)
>> create mode 100644 common/nvme
>>
>> diff --git a/common/nvme b/common/nvme
>> new file mode 100644
>> index 0000000..1800263
>> --- /dev/null
>> +++ b/common/nvme
>> @@ -0,0 +1,595 @@
>> +#!/bin/bash
>> +# SPDX-License-Identifier: GPL-3.0+
>> +#
>> +# nvme helper functions.
>> +
>> +. common/shellcheck
>> +
>> +def_traddr="127.0.0.1"
>> +def_adrfam="ipv4"
>> +def_trsvcid="4420"
>> +def_remote_wwnn="0x10001100aa000001"
>> +def_remote_wwpn="0x20001100aa000001"
>> +def_local_wwnn="0x10001100aa000002"
>> +def_local_wwpn="0x20001100aa000002"
>> +def_hostid="0f01fb42-9f7f-4856-b0b3-51e60b8de349"
>> +def_hostnqn="nqn.2014-08.org.nvmexpress:uuid:${def_hostid}"
>> +export def_subsysnqn="blktests-subsystem-1"
>> +export def_subsys_uuid="91fdba0d-f87b-4c25-b80f-db7be1418b9e"
>> +_check_conflict_and_set_default NVMET_TRTYPES nvme_trtype "loop"
>> +_check_conflict_and_set_default NVME_IMG_SIZE nvme_img_size 1G
>> +_check_conflict_and_set_default NVME_NUM_ITER nvme_num_iter 1000
>> +nvmet_blkdev_type=${nvmet_blkdev_type:-"device"}
>> +NVMET_BLKDEV_TYPES=${NVMET_BLKDEV_TYPES:-"device file"}
>> +NVMET_CFS="/sys/kernel/config/nvmet/"
>
> As for the shellcheck warnings, I suggestto add two lines below here to suppress
> them.
>
> nvme_trtype=${nvme_trtype:-}
> nvme_adrfam=${nvme_adrfam:-}
>
Thanks, applied to v3
>> +
>> +# TMPDIR can not be referred out of test() or test_device() context. Instead of
>> +# global variable def_flie_path, use this getter function.
>> +_nvme_def_file_path() {
>> + echo "${TMPDIR}/img"
>> +}
>> +
>> +_require_nvme_trtype() {
>> + local trtype
>> + for trtype in "$@"; do
>> + if [[ "${nvme_trtype}" == "$trtype" ]]; then
>> + return 0
>> + fi
>> + done
>> + SKIP_REASONS+=("nvme_trtype=${nvme_trtype} is not supported in this test")
>> + return 1
>> +}
>> +
>> +_require_nvme_trtype_is_loop() {
>> + if ! _require_nvme_trtype loop; then
>> + return 1
>> + fi
>> + return 0
>> +}
>> +
>> +_require_nvme_trtype_is_fabrics() {
>> + if ! _require_nvme_trtype loop fc rdma tcp; then
>> + return 1
>> + fi
>> + return 0
>> +}
>> +
>> +_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_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_add_tport() {
>> + local wwnn="$1"
>> + local wwpn="$2"
>> + local loopctl=/sys/class/fcloop/ctl
>> +
>> + echo "wwnn=${wwnn},wwpn=${wwpn}" > ${loopctl}/add_target_port
>> +}
>> +
>> +_setup_fcloop() {
>> + local local_wwnn="${1:-$def_local_wwnn}"
>> + local local_wwpn="${2:-$def_local_wwpn}"
>> + local remote_wwnn="${3:-$def_remote_wwnn}"
>> + local remote_wwpn="${4:-$def_remote_wwpn}"
>> +
>> + _nvme_fcloop_add_tport "${remote_wwnn}" "${remote_wwpn}"
>> + _nvme_fcloop_add_lport "${local_wwnn}" "${local_wwpn}"
>> + _nvme_fcloop_add_rport "${local_wwnn}" "${local_wwpn}" \
>> + "${remote_wwnn}" "${remote_wwpn}"
>> +}
>> +
>> +_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
>> +
>> + if [[ ! -f "${loopctl}/del_remote_port" ]]; then
>> + return
>> + fi
>> + echo "wwnn=${remote_wwnn},wwpn=${remote_wwpn}" > "${loopctl}/del_remote_port"
>> +}
>> +
>> +_nvme_fcloop_del_lport() {
>> + local wwnn="$1"
>> + local wwpn="$2"
>> + local loopctl=/sys/class/fcloop/ctl
>> +
>> + if [[ ! -f "${loopctl}/del_local_port" ]]; then
>> + return
>> + fi
>> + echo "wwnn=${wwnn},wwpn=${wwpn}" > "${loopctl}/del_local_port"
>> +}
>> +
>> +_nvme_fcloop_del_tport() {
>> + local wwnn="$1"
>> + local wwpn="$2"
>> + local loopctl=/sys/class/fcloop/ctl
>> +
>> + if [[ ! -f "${loopctl}/del_target_port" ]]; then
>> + return
>> + fi
>> + echo "wwnn=${wwnn},wwpn=${wwpn}" > "${loopctl}/del_target_port"
>> +}
>> +
>> +_cleanup_fcloop() {
>> + local local_wwnn="${1:-$def_local_wwnn}"
>> + local local_wwpn="${2:-$def_local_wwpn}"
>> + local remote_wwnn="${3:-$def_remote_wwnn}"
>> + local remote_wwpn="${4:-$def_remote_wwpn}"
>> +
>> + _nvme_fcloop_del_tport "${remote_wwnn}" "${remote_wwpn}"
>> + _nvme_fcloop_del_lport "${local_wwnn}" "${local_wwpn}"
>> + _nvme_fcloop_del_rport "${local_wwnn}" "${local_wwpn}" \
>> + "${remote_wwnn}" "${remote_wwpn}"
>> +}
>> +
>> +_cleanup_blkdev() {
>> + local blkdev
>> + local dev
>> +
>> + blkdev="$(losetup -l | awk '$6 == "'"$(_nvme_def_file_path)"'" { print $1 }')"
>> + for dev in ${blkdev}; do
>> + losetup -d "${dev}"
>> + done
>> + rm -f "$(_nvme_def_file_path)"
>> +}
>> +
>> +_cleanup_nvmet() {
>> + local dev
>> + local port
>> + local subsys
>> + local transport
>> + local name
>> +
>> + if [[ ! -d "${NVMET_CFS}" ]]; then
>> + return 0
>> + fi
>> +
>> + # Don't let successive Ctrl-Cs interrupt the cleanup processes
>> + trap '' SIGINT
>> +
>> + shopt -s nullglob
>> +
>> + for dev in /sys/class/nvme/nvme*; do
>> + dev="$(basename "$dev")"
>> + transport="$(cat "/sys/class/nvme/${dev}/transport" 2>/dev/null)"
>> + if [[ "$transport" == "${nvme_trtype}" ]]; then
>> + # if udev auto connect is enabled for FC we get false positives
>> + if [[ "$transport" != "fc" ]]; then
>> + echo "WARNING: Test did not clean up ${nvme_trtype} device: ${dev}"
>> + fi
>> + _nvme_disconnect_ctrl "${dev}" 2>/dev/null
>> + fi
>> + done
>> +
>> + for port in "${NVMET_CFS}"/ports/*; do
>> + name=$(basename "${port}")
>> + echo "WARNING: Test did not clean up port: ${name}"
>> + rm -f "${port}"/subsystems/*
>> + rmdir "${port}"
>> + done
>> +
>> + for subsys in "${NVMET_CFS}"/subsystems/*; do
>> + name=$(basename "${subsys}")
>> + echo "WARNING: Test did not clean up subsystem: ${name}"
>> + for ns in "${subsys}"/namespaces/*; do
>> + rmdir "${ns}"
>> + done
>> + rmdir "${subsys}"
>> + done
>> +
>> + for host in "${NVMET_CFS}"/hosts/*; do
>> + name=$(basename "${host}")
>> + echo "WARNING: Test did not clean up host: ${name}"
>> + rmdir "${host}"
>> + done
>> +
>> + shopt -u nullglob
>> + trap SIGINT
>> +
>> + if [[ "${nvme_trtype}" == "fc" ]]; then
>> + _cleanup_fcloop "${def_local_wwnn}" "${def_local_wwpn}" \
>> + "${def_remote_wwnn}" "${def_remote_wwpn}"
>> + modprobe -rq nvme-fcloop 2>/dev/null
>> + fi
>> + modprobe -rq nvme-"${nvme_trtype}" 2>/dev/null
>> + if [[ "${nvme_trtype}" != "loop" ]]; then
>> + modprobe -rq nvmet-"${nvme_trtype}" 2>/dev/null
>> + fi
>> + modprobe -rq nvmet 2>/dev/null
>> + if [[ "${nvme_trtype}" == "rdma" ]]; then
>> + stop_soft_rdma
>> + fi
>> +
>> + _cleanup_blkdev
>> +}
>> +
>> +_setup_nvmet() {
>> + _register_test_cleanup _cleanup_nvmet
>> + modprobe -q nvmet
>> + if [[ "${nvme_trtype}" != "loop" ]]; then
>> + modprobe -q nvmet-"${nvme_trtype}"
>> + fi
>> + modprobe -q nvme-"${nvme_trtype}"
>> + if [[ "${nvme_trtype}" == "rdma" ]]; then
>> + start_soft_rdma
>> + for i in $(rdma_network_interfaces)
>> + do
>> + if [[ "${nvme_adrfam}" == "ipv6" ]]; then
>> + ipv6_addr=$(get_ipv6_ll_addr "$i")
>> + if [[ -n "${ipv6_addr}" ]]; then
>> + def_traddr=${ipv6_addr}
>> + fi
>> + else
>> + ipv4_addr=$(get_ipv4_addr "$i")
>> + if [[ -n "${ipv4_addr}" ]]; then
>> + def_traddr=${ipv4_addr}
>> + fi
>> + fi
>> + done
>> + fi
>> + if [[ "${nvme_trtype}" = "fc" ]]; then
>> + modprobe -q nvme-fcloop
>> + _setup_fcloop "${def_local_wwnn}" "${def_local_wwpn}" \
>> + "${def_remote_wwnn}" "${def_remote_wwpn}"
>> +
>> + def_traddr=$(printf "nn-%s:pn-%s" \
>> + "${def_remote_wwnn}" \
>> + "${def_remote_wwpn}")
>> + def_host_traddr=$(printf "nn-%s:pn-%s" \
>> + "${def_local_wwnn}" \
>> + "${def_local_wwpn}")
>> + fi
>> +}
>> +
>> +_nvme_disconnect_ctrl() {
>> + local ctrl="$1"
>> +
>> + nvme disconnect --device "${ctrl}"
>> +}
>> +
>> +_nvme_connect_subsys() {
>> + local subsysnqn="$def_subsysnqn"
>> + local hostnqn="$def_hostnqn"
>> + local hostid="$def_hostid"
>> + local hostkey=""
>> + local ctrlkey=""
>> + local nr_io_queues=""
>> + local nr_write_queues=""
>> + local nr_poll_queues=""
>> + local keep_alive_tmo=""
>> + local reconnect_delay=""
>> + local ctrl_loss_tmo=""
>> + local no_wait=false
>> + local i
>> +
>> + while [[ $# -gt 0 ]]; do
>> + case $1 in
>> + --subsysnqn)
>> + subsysnqn="$2"
>> + shift 2
>> + ;;
>> + --hostnqn)
>> + hostnqn="$2"
>> + shift 2
>> + ;;
>> + --hostid)
>> + hostid="$2"
>> + shift 2
>> + ;;
>> + --dhchap-secret)
>> + hostkey="$2"
>> + shift 2
>> + ;;
>> + --dhchap-ctrl-secret)
>> + ctrlkey="$2"
>> + shift 2
>> + ;;
>> + --nr-io-queues)
>> + nr_io_queues="$2"
>> + shift 2
>> + ;;
>> + --nr-write-queues)
>> + nr_write_queues="$2"
>> + shift 2
>> + ;;
>> + --nr-poll-queues)
>> + nr_poll_queues="$2"
>> + shift 2
>> + ;;
>> + --keep-alive-tmo)
>> + keep_alive_tmo="$2"
>> + shift 2
>> + ;;
>> + --reconnect-delay)
>> + reconnect_delay="$2"
>> + shift 2
>> + ;;
>> + --ctrl-loss-tmo)
>> + ctrl_loss_tmo="$2"
>> + shift 2
>> + ;;
>> + --no-wait)
>> + no_wait=true
>> + shift 1
>> + ;;
>> + *)
>> + echo "WARNING: unknown argument: $1"
>> + shift
>> + ;;
>> + esac
>> + done
>> +
>> + ARGS=(--transport "${nvme_trtype}" --nqn "${subsysnqn}")
>> + if [[ "${nvme_trtype}" == "fc" ]] ; then
>> + ARGS+=(--traddr "${def_traddr}" --host-traddr "${def_host_traddr}")
>> + elif [[ "${nvme_trtype}" != "loop" ]]; then
>> + ARGS+=(--traddr "${def_traddr}" --trsvcid "${def_trsvcid}")
>> + fi
>> + ARGS+=(--hostnqn="${hostnqn}")
>> + ARGS+=(--hostid="${hostid}")
>> + if [[ -n "${hostkey}" ]]; then
>> + ARGS+=(--dhchap-secret="${hostkey}")
>> + fi
>> + if [[ -n "${ctrlkey}" ]]; then
>> + ARGS+=(--dhchap-ctrl-secret="${ctrlkey}")
>> + fi
>> + if [[ -n "${nr_io_queues}" ]]; then
>> + ARGS+=(--nr-io-queues="${nr_io_queues}")
>> + fi
>> + if [[ -n "${nr_write_queues}" ]]; then
>> + ARGS+=(--nr-write-queues="${nr_write_queues}")
>> + fi
>> + if [[ -n "${nr_poll_queues}" ]]; then
>> + ARGS+=(--nr-poll-queues="${nr_poll_queues}")
>> + fi
>> + if [[ -n "${keep_alive_tmo}" ]]; then
>> + ARGS+=(--keep-alive-tmo="${keep_alive_tmo}")
>> + fi
>> + if [[ -n "${reconnect_delay}" ]]; then
>> + ARGS+=(--reconnect-delay="${reconnect_delay}")
>> + fi
>> + if [[ -n "${ctrl_loss_tmo}" ]]; then
>> + ARGS+=(--ctrl-loss-tmo="${ctrl_loss_tmo}")
>> + fi
>> +
>> + 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.
>> + if [[ ${no_wait} = false ]]; then
>> + udevadm settle
>> + for ((i = 0; i < 10; i++)); do
>> + _nvme_ns_ready "${subsysnqn}" && return
>> + sleep .1
>> + done
>> + fi
>> +}
>> +
>> +_nvme_ns_ready() {
>> + local subsysnqn="${1}"
>> + local ns_path ns_id dev
>> + local cfs_path="${NVMET_CFS}/subsystems/$subsysnqn"
>> +
>> + 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
>> +}
>> +
>> +_create_nvmet_port() {
>> + local trtype="$1"
>> + local traddr="${2:-$def_traddr}"
>> + local adrfam="${3:-$def_adrfam}"
>> + local trsvcid="${4:-$def_trsvcid}"
>> +
>> + local port
>> + for ((port = 0; ; port++)); do
>> + if [[ ! -e "${NVMET_CFS}/ports/${port}" ]]; then
>> + break
>> + fi
>> + done
>> +
>> + mkdir "${NVMET_CFS}/ports/${port}"
>> + echo "${trtype}" > "${NVMET_CFS}/ports/${port}/addr_trtype"
>> + echo "${traddr}" > "${NVMET_CFS}/ports/${port}/addr_traddr"
>> + echo "${adrfam}" > "${NVMET_CFS}/ports/${port}/addr_adrfam"
>> + if [[ "${adrfam}" != "fc" ]]; then
>> + echo "${trsvcid}" > "${NVMET_CFS}/ports/${port}/addr_trsvcid"
>> + fi
>> +
>> + echo "${port}"
>> +}
>> +
>> +_remove_nvmet_port() {
>> + local port="$1"
>> + rmdir "${NVMET_CFS}/ports/${port}"
>> +}
>> +
>> +_create_nvmet_ns() {
>> + local nvmet_subsystem="$1"
>> + local nsid="$2"
>> + local blkdev="$3"
>> + local uuid="00000000-0000-0000-0000-000000000000"
>> + local subsys_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
>> + local ns_path="${subsys_path}/namespaces/${nsid}"
>> +
>> + if [[ $# -eq 4 ]]; then
>> + uuid="$4"
>> + fi
>> +
>> + mkdir "${ns_path}"
>> + printf "%s" "${blkdev}" > "${ns_path}/device_path"
>> + printf "%s" "${uuid}" > "${ns_path}/device_uuid"
>> + printf 1 > "${ns_path}/enable"
>> +}
>> +
>> +_create_nvmet_subsystem() {
>> + local nvmet_subsystem="$1"
>> + local blkdev="$2"
>> + local uuid=$3
>> + local cfs_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
>> +
>> + mkdir -p "${cfs_path}"
>> + echo 0 > "${cfs_path}/attr_allow_any_host"
>> + _create_nvmet_ns "${nvmet_subsystem}" "1" "${blkdev}" "${uuid}"
>> +}
>> +
>> +_add_nvmet_allow_hosts() {
>> + local nvmet_subsystem="$1"
>> + local nvmet_hostnqn="$2"
>> + local cfs_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
>> + local host_path="${NVMET_CFS}/hosts/${nvmet_hostnqn}"
>> +
>> + ln -s "${host_path}" "${cfs_path}/allowed_hosts/${nvmet_hostnqn}"
>> +}
>> +
>> +_create_nvmet_host() {
>> + local nvmet_subsystem="$1"
>> + local nvmet_hostnqn="$2"
>> + local nvmet_hostkey="$3"
>> + local nvmet_ctrlkey="$4"
>> + local host_path="${NVMET_CFS}/hosts/${nvmet_hostnqn}"
>> +
>> + if [[ -d "${host_path}" ]]; then
>> + echo "FAIL target setup failed. stale host configuration found"
>> + return 1;
>> + fi
>> +
>> + mkdir "${host_path}"
>> + _add_nvmet_allow_hosts "${nvmet_subsystem}" "${nvmet_hostnqn}"
>> + if [[ "${nvmet_hostkey}" ]] ; then
>> + echo "${nvmet_hostkey}" > "${host_path}/dhchap_key"
>> + fi
>> + if [[ "${nvmet_ctrlkey}" ]] ; then
>> + echo "${nvmet_ctrlkey}" > "${host_path}/dhchap_ctrl_key"
>> + fi
>> +}
>> +
>> +_remove_nvmet_ns() {
>> + local nvmet_subsystem="$1"
>> + local nsid=$2
>> + local subsys_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
>> + local nvmet_ns_path="${subsys_path}/namespaces/${nsid}"
>> +
>> + echo 0 > "${nvmet_ns_path}/enable"
>> + rmdir "${nvmet_ns_path}"
>> +}
>> +
>> +_remove_nvmet_subsystem() {
>> + local nvmet_subsystem="$1"
>> + local subsys_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
>> +
>> + _remove_nvmet_ns "${nvmet_subsystem}" "1"
>> + rm -f "${subsys_path}"/allowed_hosts/*
>> + rmdir "${subsys_path}"
>> +}
>> +
>> +_remove_nvmet_host() {
>> + local nvmet_host="$1"
>> + local host_path="${NVMET_CFS}/hosts/${nvmet_host}"
>> +
>> + rmdir "${host_path}"
>> +}
>> +
>> +_add_nvmet_subsys_to_port() {
>> + local port="$1"
>> + local nvmet_subsystem="$2"
>> +
>> + ln -s "${NVMET_CFS}/subsystems/${nvmet_subsystem}" \
>> + "${NVMET_CFS}/ports/${port}/subsystems/${nvmet_subsystem}"
>> +}
>> +
>> +_remove_nvmet_subsystem_from_port() {
>> + local port="$1"
>> + local nvmet_subsystem="$2"
>> +
>> + rm "${NVMET_CFS}/ports/${port}/subsystems/${nvmet_subsystem}"
>> +}
>> +
>> +_get_nvmet_ports() {
>> + local nvmet_subsystem="$1"
>> + local -n nvmet_ports="$2"
>> + local cfs_path="${NVMET_CFS}/ports"
>> + local sarg
>> +
>> + sarg="s;^${cfs_path}/\([0-9]\+\)/subsystems/${nvmet_subsystem}$;\1;p"
>> +
>> + for path in "${cfs_path}/"*"/subsystems/${nvmet_subsystem}"; do
>> + nvmet_ports+=("$(echo "${path}" | sed -n -s "${sarg}")")
>> + done
>> +}
>> +
>> +_find_nvme_dev() {
>> + local subsys=$1
>> + local subsysnqn
>> + local dev
>> + for dev in /sys/class/nvme/nvme*; do
>> + [ -e "$dev" ] || continue
>> + dev="$(basename "$dev")"
>> + subsysnqn="$(cat "/sys/class/nvme/${dev}/subsysnqn" 2>/dev/null)"
>> + if [[ "$subsysnqn" == "$subsys" ]]; then
>> + echo "$dev"
>> + fi
>> + done
>> +}
>> +
>> +_nvmet_target_cleanup() {
>> + local ports
>> + local port
>> + local blkdev
>> + local subsysnqn="${def_subsysnqn}"
>> + local blkdev_type=""
>> +
>> + while [[ $# -gt 0 ]]; do
>> + case $1 in
>> + --blkdev)
>> + blkdev_type="$2"
>> + shift 2
>> + ;;
>> + --subsysnqn)
>> + subsysnqn="$2"
>> + shift 2
>> + ;;
>> + *)
>> + echo "WARNING: unknown argument: $1"
>> + shift
>> + ;;
>> + esac
>> + done
>> +
>> + _get_nvmet_ports "${subsysnqn}" ports
>> +
>> + for port in "${ports[@]}"; do
>> + _remove_nvmet_subsystem_from_port "${port}" "${subsysnqn}"
>> + _remove_nvmet_port "${port}"
>> + done
>> + _remove_nvmet_subsystem "${subsysnqn}"
>> + _remove_nvmet_host "${def_hostnqn}"
>> +
>> + if [[ "${blkdev_type}" == "device" ]]; then
>> + _cleanup_blkdev
>> + fi
>> +}
>> diff --git a/tests/nvme/rc b/tests/nvme/rc
>> index c1ddf41..3462f2e 100644
>> --- a/tests/nvme/rc
>> +++ b/tests/nvme/rc
>> @@ -5,25 +5,9 @@
>> # Test specific to NVMe devices
>>
>> . common/rc
>> +. common/nvme
>> . common/multipath-over-rdma
>>
>> -def_traddr="127.0.0.1"
>> -def_adrfam="ipv4"
>> -def_trsvcid="4420"
>> -def_remote_wwnn="0x10001100aa000001"
>> -def_remote_wwpn="0x20001100aa000001"
>> -def_local_wwnn="0x10001100aa000002"
>> -def_local_wwpn="0x20001100aa000002"
>> -def_hostid="0f01fb42-9f7f-4856-b0b3-51e60b8de349"
>> -def_hostnqn="nqn.2014-08.org.nvmexpress:uuid:${def_hostid}"
>> -export def_subsysnqn="blktests-subsystem-1"
>> -export def_subsys_uuid="91fdba0d-f87b-4c25-b80f-db7be1418b9e"
>> -_check_conflict_and_set_default NVMET_TRTYPES nvme_trtype "loop"
>> -_check_conflict_and_set_default NVME_IMG_SIZE nvme_img_size 1G
>> -_check_conflict_and_set_default NVME_NUM_ITER nvme_num_iter 1000
>> -nvmet_blkdev_type=${nvmet_blkdev_type:-"device"}
>> -NVMET_BLKDEV_TYPES=${NVMET_BLKDEV_TYPES:-"device file"}
>> -
>> _NVMET_TRTYPES_is_valid() {
>> local type
>>
>> @@ -70,12 +54,6 @@ _set_nvmet_blkdev_type() {
>> COND_DESC="bd=${nvmet_blkdev_type}"
>> }
>>
>> -# TMPDIR can not be referred out of test() or test_device() context. Instead of
>> -# global variable def_flie_path, use this getter function.
>> -_nvme_def_file_path() {
>> - echo "${TMPDIR}/img"
>> -}
>> -
>> _nvme_requires() {
>> _have_program nvme
>> _require_nvme_test_img_size 4m
>> @@ -144,8 +122,6 @@ group_device_requires() {
>> _require_test_dev_is_nvme
>> }
>>
>> -NVMET_CFS="/sys/kernel/config/nvmet/"
>> -
>> _require_test_dev_is_nvme() {
>> if ! readlink -f "$TEST_DEV_SYSFS/device" | grep -q nvme; then
>> SKIP_REASONS+=("$TEST_DEV is not a NVMe device")
>> @@ -168,31 +144,6 @@ _require_nvme_test_img_size() {
>> return 0
>> }
>>
>> -_require_nvme_trtype() {
>> - local trtype
>> - for trtype in "$@"; do
>> - if [[ "${nvme_trtype}" == "$trtype" ]]; then
>> - return 0
>> - fi
>> - done
>> - SKIP_REASONS+=("nvme_trtype=${nvme_trtype} is not supported in this test")
>> - return 1
>> -}
>> -
>> -_require_nvme_trtype_is_loop() {
>> - if ! _require_nvme_trtype loop; then
>> - return 1
>> - fi
>> - return 0
>> -}
>> -
>> -_require_nvme_trtype_is_fabrics() {
>> - if ! _require_nvme_trtype loop fc rdma tcp; then
>> - return 1
>> - fi
>> - return 0
>> -}
>> -
>> _require_nvme_cli_auth() {
>> if ! nvme gen-dhchap-key --nqn nvmf-test-subsys > /dev/null 2>&1 ; then
>> SKIP_REASONS+=("nvme gen-dhchap-key command missing")
>> @@ -235,216 +186,6 @@ _nvme_calc_rand_io_size() {
>> echo "${io_size_kb}k"
>> }
>>
>> -_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_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_add_tport() {
>> - local wwnn="$1"
>> - local wwpn="$2"
>> - local loopctl=/sys/class/fcloop/ctl
>> -
>> - echo "wwnn=${wwnn},wwpn=${wwpn}" > ${loopctl}/add_target_port
>> -}
>> -
>> -_setup_fcloop() {
>> - local local_wwnn="${1:-$def_local_wwnn}"
>> - local local_wwpn="${2:-$def_local_wwpn}"
>> - local remote_wwnn="${3:-$def_remote_wwnn}"
>> - local remote_wwpn="${4:-$def_remote_wwpn}"
>> -
>> - _nvme_fcloop_add_tport "${remote_wwnn}" "${remote_wwpn}"
>> - _nvme_fcloop_add_lport "${local_wwnn}" "${local_wwpn}"
>> - _nvme_fcloop_add_rport "${local_wwnn}" "${local_wwpn}" \
>> - "${remote_wwnn}" "${remote_wwpn}"
>> -}
>> -
>> -_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
>> -
>> - if [[ ! -f "${loopctl}/del_remote_port" ]]; then
>> - return
>> - fi
>> - echo "wwnn=${remote_wwnn},wwpn=${remote_wwpn}" > "${loopctl}/del_remote_port"
>> -}
>> -
>> -_nvme_fcloop_del_lport() {
>> - local wwnn="$1"
>> - local wwpn="$2"
>> - local loopctl=/sys/class/fcloop/ctl
>> -
>> - if [[ ! -f "${loopctl}/del_local_port" ]]; then
>> - return
>> - fi
>> - echo "wwnn=${wwnn},wwpn=${wwpn}" > "${loopctl}/del_local_port"
>> -}
>> -
>> -_nvme_fcloop_del_tport() {
>> - local wwnn="$1"
>> - local wwpn="$2"
>> - local loopctl=/sys/class/fcloop/ctl
>> -
>> - if [[ ! -f "${loopctl}/del_target_port" ]]; then
>> - return
>> - fi
>> - echo "wwnn=${wwnn},wwpn=${wwpn}" > "${loopctl}/del_target_port"
>> -}
>> -
>> -_cleanup_fcloop() {
>> - local local_wwnn="${1:-$def_local_wwnn}"
>> - local local_wwpn="${2:-$def_local_wwpn}"
>> - local remote_wwnn="${3:-$def_remote_wwnn}"
>> - local remote_wwpn="${4:-$def_remote_wwpn}"
>> -
>> - _nvme_fcloop_del_tport "${remote_wwnn}" "${remote_wwpn}"
>> - _nvme_fcloop_del_lport "${local_wwnn}" "${local_wwpn}"
>> - _nvme_fcloop_del_rport "${local_wwnn}" "${local_wwpn}" \
>> - "${remote_wwnn}" "${remote_wwpn}"
>> -}
>> -
>> -_cleanup_blkdev() {
>> - local blkdev
>> - local dev
>> -
>> - blkdev="$(losetup -l | awk '$6 == "'"$(_nvme_def_file_path)"'" { print $1 }')"
>> - for dev in ${blkdev}; do
>> - losetup -d "${dev}"
>> - done
>> - rm -f "$(_nvme_def_file_path)"
>> -}
>> -
>> -_cleanup_nvmet() {
>> - local dev
>> - local port
>> - local subsys
>> - local transport
>> - local name
>> -
>> - if [[ ! -d "${NVMET_CFS}" ]]; then
>> - return 0
>> - fi
>> -
>> - # Don't let successive Ctrl-Cs interrupt the cleanup processes
>> - trap '' SIGINT
>> -
>> - shopt -s nullglob
>> -
>> - for dev in /sys/class/nvme/nvme*; do
>> - dev="$(basename "$dev")"
>> - transport="$(cat "/sys/class/nvme/${dev}/transport" 2>/dev/null)"
>> - if [[ "$transport" == "${nvme_trtype}" ]]; then
>> - # if udev auto connect is enabled for FC we get false positives
>> - if [[ "$transport" != "fc" ]]; then
>> - echo "WARNING: Test did not clean up ${nvme_trtype} device: ${dev}"
>> - fi
>> - _nvme_disconnect_ctrl "${dev}" 2>/dev/null
>> - fi
>> - done
>> -
>> - for port in "${NVMET_CFS}"/ports/*; do
>> - name=$(basename "${port}")
>> - echo "WARNING: Test did not clean up port: ${name}"
>> - rm -f "${port}"/subsystems/*
>> - rmdir "${port}"
>> - done
>> -
>> - for subsys in "${NVMET_CFS}"/subsystems/*; do
>> - name=$(basename "${subsys}")
>> - echo "WARNING: Test did not clean up subsystem: ${name}"
>> - for ns in "${subsys}"/namespaces/*; do
>> - rmdir "${ns}"
>> - done
>> - rmdir "${subsys}"
>> - done
>> -
>> - for host in "${NVMET_CFS}"/hosts/*; do
>> - name=$(basename "${host}")
>> - echo "WARNING: Test did not clean up host: ${name}"
>> - rmdir "${host}"
>> - done
>> -
>> - shopt -u nullglob
>> - trap SIGINT
>> -
>> - if [[ "${nvme_trtype}" == "fc" ]]; then
>> - _cleanup_fcloop "${def_local_wwnn}" "${def_local_wwpn}" \
>> - "${def_remote_wwnn}" "${def_remote_wwpn}"
>> - modprobe -rq nvme-fcloop 2>/dev/null
>> - fi
>> - modprobe -rq nvme-"${nvme_trtype}" 2>/dev/null
>> - if [[ "${nvme_trtype}" != "loop" ]]; then
>> - modprobe -rq nvmet-"${nvme_trtype}" 2>/dev/null
>> - fi
>> - modprobe -rq nvmet 2>/dev/null
>> - if [[ "${nvme_trtype}" == "rdma" ]]; then
>> - stop_soft_rdma
>> - fi
>> -
>> - _cleanup_blkdev
>> -}
>> -
>> -_setup_nvmet() {
>> - _register_test_cleanup _cleanup_nvmet
>> - modprobe -q nvmet
>> - if [[ "${nvme_trtype}" != "loop" ]]; then
>> - modprobe -q nvmet-"${nvme_trtype}"
>> - fi
>> - modprobe -q nvme-"${nvme_trtype}"
>> - if [[ "${nvme_trtype}" == "rdma" ]]; then
>> - start_soft_rdma
>> - for i in $(rdma_network_interfaces)
>> - do
>> - if [[ "${nvme_adrfam}" == "ipv6" ]]; then
>> - ipv6_addr=$(get_ipv6_ll_addr "$i")
>> - if [[ -n "${ipv6_addr}" ]]; then
>> - def_traddr=${ipv6_addr}
>> - fi
>> - else
>> - ipv4_addr=$(get_ipv4_addr "$i")
>> - if [[ -n "${ipv4_addr}" ]]; then
>> - def_traddr=${ipv4_addr}
>> - fi
>> - fi
>> - done
>> - fi
>> - if [[ "${nvme_trtype}" = "fc" ]]; then
>> - modprobe -q nvme-fcloop
>> - _setup_fcloop "${def_local_wwnn}" "${def_local_wwpn}" \
>> - "${def_remote_wwnn}" "${def_remote_wwpn}"
>> -
>> - def_traddr=$(printf "nn-%s:pn-%s" \
>> - "${def_remote_wwnn}" \
>> - "${def_remote_wwpn}")
>> - def_host_traddr=$(printf "nn-%s:pn-%s" \
>> - "${def_local_wwnn}" \
>> - "${def_local_wwpn}")
>> - fi
>> -}
>> -
>> -_nvme_disconnect_ctrl() {
>> - local ctrl="$1"
>> -
>> - nvme disconnect --device "${ctrl}"
>> -}
>> -
>> _nvme_disconnect_subsys() {
>> local subsysnqn="$def_subsysnqn"
>>
>> @@ -465,141 +206,6 @@ _nvme_disconnect_subsys() {
>> grep -o "disconnected.*"
>> }
>>
>> -_nvme_connect_subsys() {
>> - local subsysnqn="$def_subsysnqn"
>> - local hostnqn="$def_hostnqn"
>
> It looks weird that _nvme_connect_subsys() is moved to common/nvme, but
> _nvme_disconnect_subsys() stays in tests/nvme/rc. I think it's the better to
> move _nvme_disconnect_subsys() also. Currently, md/001 does not use
> _nvme_disconnect_subsys(). Isn't it the better to call it in
> cleanup_nvme_over_tcp()?
>
I agree, I would move _nvme_disconnect_subsys() in v3.
cleanup_nvme_over_tcp() use _nvme_disconnect_ctrl() to disconnect the
controller by the controller name rather the subsys name. I can change
it to _nvme_disconnect_subsys() if it's more appropriate.
>> - local hostid="$def_hostid"
>> - local hostkey=""
>> - local ctrlkey=""
>> - local nr_io_queues=""
>> - local nr_write_queues=""
>> - local nr_poll_queues=""
>> - local keep_alive_tmo=""
>> - local reconnect_delay=""
>> - local ctrl_loss_tmo=""
>> - local no_wait=false
>> - local i
>> -
>> - while [[ $# -gt 0 ]]; do
>> - case $1 in
>> - --subsysnqn)
>> - subsysnqn="$2"
>> - shift 2
>> - ;;
>> - --hostnqn)
>> - hostnqn="$2"
>> - shift 2
>> - ;;
>> - --hostid)
>> - hostid="$2"
>> - shift 2
>> - ;;
>> - --dhchap-secret)
>> - hostkey="$2"
>> - shift 2
>> - ;;
>> - --dhchap-ctrl-secret)
>> - ctrlkey="$2"
>> - shift 2
>> - ;;
>> - --nr-io-queues)
>> - nr_io_queues="$2"
>> - shift 2
>> - ;;
>> - --nr-write-queues)
>> - nr_write_queues="$2"
>> - shift 2
>> - ;;
>> - --nr-poll-queues)
>> - nr_poll_queues="$2"
>> - shift 2
>> - ;;
>> - --keep-alive-tmo)
>> - keep_alive_tmo="$2"
>> - shift 2
>> - ;;
>> - --reconnect-delay)
>> - reconnect_delay="$2"
>> - shift 2
>> - ;;
>> - --ctrl-loss-tmo)
>> - ctrl_loss_tmo="$2"
>> - shift 2
>> - ;;
>> - --no-wait)
>> - no_wait=true
>> - shift 1
>> - ;;
>> - *)
>> - echo "WARNING: unknown argument: $1"
>> - shift
>> - ;;
>> - esac
>> - done
>> -
>> - ARGS=(--transport "${nvme_trtype}" --nqn "${subsysnqn}")
>> - if [[ "${nvme_trtype}" == "fc" ]] ; then
>> - ARGS+=(--traddr "${def_traddr}" --host-traddr "${def_host_traddr}")
>> - elif [[ "${nvme_trtype}" != "loop" ]]; then
>> - ARGS+=(--traddr "${def_traddr}" --trsvcid "${def_trsvcid}")
>> - fi
>> - ARGS+=(--hostnqn="${hostnqn}")
>> - ARGS+=(--hostid="${hostid}")
>> - if [[ -n "${hostkey}" ]]; then
>> - ARGS+=(--dhchap-secret="${hostkey}")
>> - fi
>> - if [[ -n "${ctrlkey}" ]]; then
>> - ARGS+=(--dhchap-ctrl-secret="${ctrlkey}")
>> - fi
>> - if [[ -n "${nr_io_queues}" ]]; then
>> - ARGS+=(--nr-io-queues="${nr_io_queues}")
>> - fi
>> - if [[ -n "${nr_write_queues}" ]]; then
>> - ARGS+=(--nr-write-queues="${nr_write_queues}")
>> - fi
>> - if [[ -n "${nr_poll_queues}" ]]; then
>> - ARGS+=(--nr-poll-queues="${nr_poll_queues}")
>> - fi
>> - if [[ -n "${keep_alive_tmo}" ]]; then
>> - ARGS+=(--keep-alive-tmo="${keep_alive_tmo}")
>> - fi
>> - if [[ -n "${reconnect_delay}" ]]; then
>> - ARGS+=(--reconnect-delay="${reconnect_delay}")
>> - fi
>> - if [[ -n "${ctrl_loss_tmo}" ]]; then
>> - ARGS+=(--ctrl-loss-tmo="${ctrl_loss_tmo}")
>> - fi
>> -
>> - 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.
>> - if [[ ${no_wait} = false ]]; then
>> - udevadm settle
>> - for ((i = 0; i < 10; i++)); do
>> - _nvme_ns_ready "${subsysnqn}" && return
>> - sleep .1
>> - done
>> - fi
>> -}
>> -
>> -_nvme_ns_ready() {
>> - local subsysnqn="${1}"
>> - local ns_path ns_id dev
>> - local cfs_path="${NVMET_CFS}/subsystems/$subsysnqn"
>> -
>> - 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
>> -}
>> -
>> _nvme_discover() {
>> local trtype="$1"
>> local traddr="${2:-$def_traddr}"
>> @@ -617,73 +223,6 @@ _nvme_discover() {
>> nvme discover "${ARGS[@]}"
>> }
>>
>> -_create_nvmet_port() {
>> - local trtype="$1"
>> - local traddr="${2:-$def_traddr}"
>> - local adrfam="${3:-$def_adrfam}"
>> - local trsvcid="${4:-$def_trsvcid}"
>> -
>> - local port
>> - for ((port = 0; ; port++)); do
>> - if [[ ! -e "${NVMET_CFS}/ports/${port}" ]]; then
>> - break
>> - fi
>> - done
>> -
>> - mkdir "${NVMET_CFS}/ports/${port}"
>> - echo "${trtype}" > "${NVMET_CFS}/ports/${port}/addr_trtype"
>> - echo "${traddr}" > "${NVMET_CFS}/ports/${port}/addr_traddr"
>> - echo "${adrfam}" > "${NVMET_CFS}/ports/${port}/addr_adrfam"
>> - if [[ "${adrfam}" != "fc" ]]; then
>> - echo "${trsvcid}" > "${NVMET_CFS}/ports/${port}/addr_trsvcid"
>> - fi
>> -
>> - echo "${port}"
>> -}
>> -
>> -_remove_nvmet_port() {
>> - local port="$1"
>> - rmdir "${NVMET_CFS}/ports/${port}"
>> -}
>> -
>> -_create_nvmet_ns() {
>> - local nvmet_subsystem="$1"
>> - local nsid="$2"
>> - local blkdev="$3"
>> - local uuid="00000000-0000-0000-0000-000000000000"
>> - local subsys_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
>> - local ns_path="${subsys_path}/namespaces/${nsid}"
>> -
>> - if [[ $# -eq 4 ]]; then
>> - uuid="$4"
>> - fi
>> -
>> - mkdir "${ns_path}"
>> - printf "%s" "${blkdev}" > "${ns_path}/device_path"
>> - printf "%s" "${uuid}" > "${ns_path}/device_uuid"
>> - printf 1 > "${ns_path}/enable"
>> -}
>> -
>> -_create_nvmet_subsystem() {
>> - local nvmet_subsystem="$1"
>> - local blkdev="$2"
>> - local uuid=$3
>> - local cfs_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
>> -
>> - mkdir -p "${cfs_path}"
>> - echo 0 > "${cfs_path}/attr_allow_any_host"
>> - _create_nvmet_ns "${nvmet_subsystem}" "1" "${blkdev}" "${uuid}"
>> -}
>> -
>> -_add_nvmet_allow_hosts() {
>> - local nvmet_subsystem="$1"
>> - local nvmet_hostnqn="$2"
>> - local cfs_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
>> - local host_path="${NVMET_CFS}/hosts/${nvmet_hostnqn}"
>> -
>> - ln -s "${host_path}" "${cfs_path}/allowed_hosts/${nvmet_hostnqn}"
>> -}
>> -
>> _remove_nvmet_allow_hosts() {
>> local nvmet_subsystem="$1"
>> local nvmet_hostnqn="$2"
>> @@ -692,54 +231,6 @@ _remove_nvmet_allow_hosts() {
>> rm "${cfs_path}/allowed_hosts/${nvmet_hostnqn}"
>> }
>>
>> -_create_nvmet_host() {
>> - local nvmet_subsystem="$1"
>> - local nvmet_hostnqn="$2"
>> - local nvmet_hostkey="$3"
>> - local nvmet_ctrlkey="$4"
>> - local host_path="${NVMET_CFS}/hosts/${nvmet_hostnqn}"
>> -
>> - if [[ -d "${host_path}" ]]; then
>> - echo "FAIL target setup failed. stale host configuration found"
>> - return 1;
>> - fi
>> -
>> - mkdir "${host_path}"
>> - _add_nvmet_allow_hosts "${nvmet_subsystem}" "${nvmet_hostnqn}"
>> - if [[ "${nvmet_hostkey}" ]] ; then
>> - echo "${nvmet_hostkey}" > "${host_path}/dhchap_key"
>> - fi
>> - if [[ "${nvmet_ctrlkey}" ]] ; then
>> - echo "${nvmet_ctrlkey}" > "${host_path}/dhchap_ctrl_key"
>> - fi
>> -}
>> -
>> -_remove_nvmet_ns() {
>> - local nvmet_subsystem="$1"
>> - local nsid=$2
>> - local subsys_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
>> - local nvmet_ns_path="${subsys_path}/namespaces/${nsid}"
>> -
>> - echo 0 > "${nvmet_ns_path}/enable"
>> - rmdir "${nvmet_ns_path}"
>> -}
>> -
>> -_remove_nvmet_subsystem() {
>> - local nvmet_subsystem="$1"
>> - local subsys_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
>> -
>> - _remove_nvmet_ns "${nvmet_subsystem}" "1"
>> - rm -f "${subsys_path}"/allowed_hosts/*
>> - rmdir "${subsys_path}"
>> -}
>> -
>> -_remove_nvmet_host() {
>> - local nvmet_host="$1"
>> - local host_path="${NVMET_CFS}/hosts/${nvmet_host}"
>> -
>> - rmdir "${host_path}"
>> -}
>> -
>> _create_nvmet_passthru() {
>> local nvmet_subsystem="$1"
>> local subsys_path="${NVMET_CFS}/subsystems/${nvmet_subsystem}"
>> @@ -765,34 +256,6 @@ _remove_nvmet_passhtru() {
>> rmdir "${subsys_path}"
>> }
>>
>> -_add_nvmet_subsys_to_port() {
>> - local port="$1"
>> - local nvmet_subsystem="$2"
>> -
>> - ln -s "${NVMET_CFS}/subsystems/${nvmet_subsystem}" \
>> - "${NVMET_CFS}/ports/${port}/subsystems/${nvmet_subsystem}"
>> -}
>> -
>> -_remove_nvmet_subsystem_from_port() {
>> - local port="$1"
>> - local nvmet_subsystem="$2"
>> -
>> - rm "${NVMET_CFS}/ports/${port}/subsystems/${nvmet_subsystem}"
>> -}
>> -
>> -_get_nvmet_ports() {
>> - local nvmet_subsystem="$1"
>> - local -n nvmet_ports="$2"
>> - local cfs_path="${NVMET_CFS}/ports"
>> - local sarg
>> -
>> - sarg="s;^${cfs_path}/\([0-9]\+\)/subsystems/${nvmet_subsystem}$;\1;p"
>> -
>> - for path in "${cfs_path}/"*"/subsystems/${nvmet_subsystem}"; do
>> - nvmet_ports+=("$(echo "${path}" | sed -n -s "${sarg}")")
>> - done
>> -}
>> -
>> _set_nvmet_hostkey() {
>> local nvmet_hostnqn="$1"
>> local nvmet_hostkey="$2"
>> @@ -829,20 +292,6 @@ _set_nvmet_dhgroup() {
>> "${cfs_path}/dhchap_dhgroup"
>> }
>>
>> -_find_nvme_dev() {
>> - local subsys=$1
>> - local subsysnqn
>> - local dev
>> - for dev in /sys/class/nvme/nvme*; do
>> - [ -e "$dev" ] || continue
>> - dev="$(basename "$dev")"
>> - subsysnqn="$(cat "/sys/class/nvme/${dev}/subsysnqn" 2>/dev/null)"
>> - if [[ "$subsysnqn" == "$subsys" ]]; then
>> - echo "$dev"
>> - fi
>> - done
>> -}
>> -
>> _find_nvme_ns() {
>> local subsys_uuid=$1
>> local uuid
>> @@ -924,44 +373,6 @@ _nvmet_target_setup() {
>> "${hostkey}" "${ctrlkey}"
>> }
>>
>> -_nvmet_target_cleanup() {
>> - local ports
>> - local port
>> - local blkdev
>> - local subsysnqn="${def_subsysnqn}"
>> - local blkdev_type=""
>> -
>> - while [[ $# -gt 0 ]]; do
>> - case $1 in
>> - --blkdev)
>> - blkdev_type="$2"
>> - shift 2
>> - ;;
>> - --subsysnqn)
>> - subsysnqn="$2"
>> - shift 2
>> - ;;
>> - *)
>> - echo "WARNING: unknown argument: $1"
>> - shift
>> - ;;
>> - esac
>> - done
>> -
>> - _get_nvmet_ports "${subsysnqn}" ports
>> -
>> - for port in "${ports[@]}"; do
>> - _remove_nvmet_subsystem_from_port "${port}" "${subsysnqn}"
>> - _remove_nvmet_port "${port}"
>> - done
>> - _remove_nvmet_subsystem "${subsysnqn}"
>> - _remove_nvmet_host "${def_hostnqn}"
>> -
>> - if [[ "${blkdev_type}" == "device" ]]; then
>> - _cleanup_blkdev
>> - fi
>> -}
>> -
>> _nvmet_passthru_target_setup() {
>> local subsysnqn="$def_subsysnqn"
>> local port
>> --
>> 2.45.1
More information about the Linux-nvme
mailing list