]> www.infradead.org Git - users/sagi/blktests.git/commitdiff
nvme/rc: Enable fcloop
authorHannes Reinecke <hare@suse.de>
Tue, 30 Aug 2022 09:11:18 +0000 (11:11 +0200)
committerDaniel Wagner <dwagner@suse.de>
Thu, 26 Jan 2023 14:01:49 +0000 (15:01 +0100)
Add functions to allow tests to run on fcloop as a transport.

Signed-off-by: Hannes Reinecke <hare@suse.de>
[dwagner: - fixup shellcheck reports
  - addressed review feedback from Shin'ichiro]
Signed-off-by: Daniel Wagner <dwagner@suse.de>
tests/nvme/rc

index ff13ea257cab3270bc2b727e26c4e61d33e77cf7..da996466ab396db4c8bc5af0692e836a11c9c70e 100644 (file)
 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_hostnqn="$(cat /etc/nvme/hostnqn 2> /dev/null)"
 def_hostid="$(cat /etc/nvme/hostid 2> /dev/null)"
 nvme_trtype=${nvme_trtype:-"loop"}
@@ -36,6 +40,12 @@ _nvme_requires() {
                _have_program rdma
                _have_driver rdma_rxe || _have_driver siw
                ;;
+       fc)
+               _have_driver nvme-fc
+               _have_driver nvme-fcloop
+               _have_configfs
+               def_adrfam="fc"
+               ;;
        *)
                SKIP_REASONS+=("unsupported nvme_trtype=${nvme_trtype}")
                return 1
@@ -49,6 +59,9 @@ _nvme_requires() {
                        ;;
                ipv4)
                        ;; # was already set
+               fc)
+                       def_adrfam="fc"
+                       ;;
                *)
                        # ignore for non ip transports
                        if [[ "${nvme_trtype}" == "tcp" ||
@@ -112,6 +125,82 @@ _test_dev_nvme_nsid() {
        cat "${TEST_DEV_SYSFS}/nsid"
 }
 
+_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
+
+       echo "wwnn=${remote_wwnn},wwpn=${remote_wwpn}" > ${loopctl}/del_remote_port 2> /dev/null
+}
+
+_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 2> /dev/null
+}
+
+_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> /dev/null
+}
+
+_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_rport "${local_wwnn}" "${local_wwpn}" \
+                              "${remote_wwnn}" "${remote_wwpn}"
+       _nvme_fcloop_del_tport "${remote_wwnn}" "${remote_wwpn}"
+       _nvme_fcloop_del_lport "${local_wwnn}" "${local_wwpn}"
+}
+
 _cleanup_nvmet() {
        local dev
        local port
@@ -170,6 +259,10 @@ _cleanup_nvmet() {
        if [[ "${nvme_trtype}" == "rdma" ]]; then
                stop_soft_rdma
        fi
+       if [[ "${nvme_trtype}" == "fc" ]]; then
+               _cleanup_fcloop "${def_local_wwnn}" "${def_local_wwpn}" \
+                               "${def_remote_wwnn}" "${def_remote_wwpn}"
+       fi
 }
 
 _setup_nvmet() {
@@ -196,6 +289,18 @@ _setup_nvmet() {
                        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() {
@@ -214,6 +319,7 @@ _nvme_connect_subsys() {
        local trtype="$1"
        local subsysnqn="$2"
        local traddr="${3:-$def_traddr}"
+       local host_traddr="${4:-$def_host_traddr}"
        local trsvcid="${4:-$def_trsvcid}"
        local hostnqn="${5:-$def_hostnqn}"
        local hostid="${6:-$def_hostid}"
@@ -221,7 +327,9 @@ _nvme_connect_subsys() {
        local ctrlkey="${8}"
 
        ARGS=(-t "${trtype}" -n "${subsysnqn}")
-       if [[ "${trtype}" != "loop" ]]; then
+       if [[ "${trtype}" == "fc" ]] ; then
+               ARGS+=(-a "${traddr}" -w "${host_traddr}")
+       elif [[ "${trtype}" != "loop" ]]; then
                ARGS+=(-a "${traddr}" -s "${trsvcid}")
        fi
        if [[ "${hostnqn}" != "$def_hostnqn" ]]; then
@@ -242,10 +350,13 @@ _nvme_connect_subsys() {
 _nvme_discover() {
        local trtype="$1"
        local traddr="${2:-$def_traddr}"
+       local host_traddr="${3:-$def_host_traddr}"
        local trsvcid="${3:-$def_trsvcid}"
 
        ARGS=(-t "${trtype}")
-       if [[ "${trtype}" != "loop" ]]; then
+       if [[ "${trtype}" = "fc" ]]; then
+               ARGS+=(-a "${traddr}" -w "${host_traddr}")
+       elif [[ "${trtype}" != "loop" ]]; then
                ARGS+=(-a "${traddr}" -s "${trsvcid}")
        fi
        nvme discover "${ARGS[@]}"
@@ -268,7 +379,9 @@ _create_nvmet_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"
-       echo "${trsvcid}" > "${NVMET_CFS}/ports/${port}/addr_trsvcid"
+       if [[ "${adrfam}" != "fc" ]]; then
+               echo "${trsvcid}" > "${NVMET_CFS}/ports/${port}/addr_trsvcid"
+       fi
 
        echo "${port}"
 }