Commit 02f313d6 authored by Konrad Sztyber's avatar Konrad Sztyber Committed by Tomasz Zawadzki
Browse files

bdev/nvme: check hostnqn when attaching controllers



It's now possible to attach two controllers using the same trid, but
different host NQNs.

Signed-off-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Change-Id: I73abc6916a96324f68150e78f159d19dfff1414c
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/23720


Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: default avatarKrzysztof Karas <krzysztof.karas@intel.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent 87ca30e3
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -271,12 +271,15 @@ nvme_bdev_ctrlr_get_by_name(const char *name)

static struct nvme_ctrlr *
nvme_bdev_ctrlr_get_ctrlr(struct nvme_bdev_ctrlr *nbdev_ctrlr,
			  const struct spdk_nvme_transport_id *trid)
			  const struct spdk_nvme_transport_id *trid, const char *hostnqn)
{
	const struct spdk_nvme_ctrlr_opts *opts;
	struct nvme_ctrlr *nvme_ctrlr;

	TAILQ_FOREACH(nvme_ctrlr, &nbdev_ctrlr->ctrlrs, tailq) {
		if (spdk_nvme_transport_id_compare(trid, &nvme_ctrlr->active_path_id->trid) == 0) {
		opts = spdk_nvme_ctrlr_get_opts(nvme_ctrlr->ctrlr);
		if (spdk_nvme_transport_id_compare(trid, &nvme_ctrlr->active_path_id->trid) == 0 &&
		    strcmp(hostnqn, opts->hostnqn) == 0) {
			break;
		}
	}
@@ -345,14 +348,14 @@ nvme_ctrlr_get_next_active_ns(struct nvme_ctrlr *nvme_ctrlr, struct nvme_ns *ns)
}

static struct nvme_ctrlr *
nvme_ctrlr_get(const struct spdk_nvme_transport_id *trid)
nvme_ctrlr_get(const struct spdk_nvme_transport_id *trid, const char *hostnqn)
{
	struct nvme_bdev_ctrlr	*nbdev_ctrlr;
	struct nvme_ctrlr	*nvme_ctrlr = NULL;

	pthread_mutex_lock(&g_bdev_nvme_mutex);
	TAILQ_FOREACH(nbdev_ctrlr, &g_nvme_bdev_ctrlrs, tailq) {
		nvme_ctrlr = nvme_bdev_ctrlr_get_ctrlr(nbdev_ctrlr, trid);
		nvme_ctrlr = nvme_bdev_ctrlr_get_ctrlr(nbdev_ctrlr, trid, hostnqn);
		if (nvme_ctrlr != NULL) {
			break;
		}
@@ -6163,8 +6166,9 @@ bdev_nvme_create(struct spdk_nvme_transport_id *trid,
	/* TODO expand this check to include both the host and target TRIDs.
	 * Only if both are the same should we fail.
	 */
	if (nvme_ctrlr_get(trid) != NULL) {
		SPDK_ERRLOG("A controller with the provided trid (traddr: %s) already exists.\n", trid->traddr);
	if (nvme_ctrlr_get(trid, drv_opts->hostnqn) != NULL) {
		SPDK_ERRLOG("A controller with the provided trid (traddr: %s, hostnqn: %s) "
			    "already exists.\n", trid->traddr, drv_opts->hostnqn);
		return -EEXIST;
	}

+4 −0
Original line number Diff line number Diff line
@@ -754,3 +754,7 @@ get_main_ns_ip() {

	echo "${!ip}"
}

uuid2nguid() {
	tr -d - <<< "${1^^}"
}
+30 −2
Original line number Diff line number Diff line
@@ -8,10 +8,14 @@ source $rootdir/test/common/autotest_common.sh
source $rootdir/test/nvmf/common.sh

rpc_py="$rootdir/scripts/rpc.py"
hostsock="/var/tmp/host.sock"
loops=5
ns1uuid=$(uuidgen)
ns2uuid=$(uuidgen)

SUBSYSNQN="nqn.2016-06.io.spdk:cnode1"
HOSTNQN1="nqn.2016-06.io.spdk:host1"
HOSTNQN2="nqn.2016-06.io.spdk:host2"
HOSTID=$(uuidgen)

function connect() {
@@ -41,8 +45,10 @@ function ns_is_visible() {
	[[ $nguid != "00000000000000000000000000000000" ]]
}

hostrpc() { "$rpc_py" -s "$hostsock" "$@"; }

nvmftestinit
nvmfappstart -m 0xF
nvmfappstart

$rpc_py nvmf_create_transport $NVMF_TRANSPORT_OPTS -u 8192

@@ -107,8 +113,30 @@ NOT ns_is_visible "0x1"
ns_is_visible "0x2"
disconnect

# check two connections with different NQNs to the same subsystem on the same traddr using bdev_nvme
"$rootdir/build/bin/spdk_tgt" -r "$hostsock" -m 2 &
hostpid=$!
trap 'killprocess $hostpid; nvmftestfini' SIGINT SIGTERM EXIT

waitforlisten "$hostpid" "$hostsock"
"$rpc_py" nvmf_subsystem_remove_ns "$SUBSYSNQN" 1
"$rpc_py" nvmf_subsystem_remove_ns "$SUBSYSNQN" 2
"$rpc_py" nvmf_subsystem_add_ns "$SUBSYSNQN" Malloc1 -n 1 -g $(uuid2nguid "$ns1uuid") -i
"$rpc_py" nvmf_subsystem_add_ns "$SUBSYSNQN" Malloc2 -n 2 -g $(uuid2nguid "$ns2uuid") -i
"$rpc_py" nvmf_ns_add_host "$SUBSYSNQN" 1 "$HOSTNQN1"
"$rpc_py" nvmf_ns_add_host "$SUBSYSNQN" 2 "$HOSTNQN2"

hostrpc bdev_nvme_attach_controller -t "$TEST_TRANSPORT" -a "$NVMF_FIRST_TARGET_IP" -f ipv4 \
	-s "$NVMF_PORT" -n "$SUBSYSNQN" -q "$HOSTNQN1" -b nvme0
hostrpc bdev_nvme_attach_controller -t "$TEST_TRANSPORT" -a "$NVMF_FIRST_TARGET_IP" -f ipv4 \
	-s "$NVMF_PORT" -n "$SUBSYSNQN" -q "$HOSTNQN2" -b nvme1

[[ $(hostrpc bdev_get_bdevs | jq -r '.[].name' | sort | xargs) == "nvme0n1 nvme1n2" ]]
[[ $(hostrpc bdev_get_bdevs -b nvme0n1 | jq -r '.[].uuid') == "$ns1uuid" ]]
[[ $(hostrpc bdev_get_bdevs -b nvme1n2 | jq -r '.[].uuid') == "$ns2uuid" ]]

killprocess $hostpid
$rpc_py nvmf_delete_subsystem $SUBSYSNQN

trap - SIGINT SIGTERM EXIT

nvmftestfini
+122 −93

File changed.

Preview size limit exceeded, changes collapsed.