Commit 6803032d authored by Krzysztof Karas's avatar Krzysztof Karas Committed by Jim Harris
Browse files

nvmf: added transport module interfaces to add/remove a host from a subsystem



Add optional callbacks, subsystem_add_host() and subsystem_remove_host()
to spdk_nvmf_transport_ops with transport specific spdk_json_val.

Notify transport about adding/removing hosts

Change-Id: I04a76f7985fc6379f3cd76786732c4e9bb34d227
Signed-off-by: default avatarKrzysztof Karas <krzysztof.karas@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/15446


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
parent 4becb0d1
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -61,6 +61,9 @@ Added a secure_channel parameter to the nvmf_subsystem_add_listener RPC. When tr
established via this listener will immediately attempt to establish a secure channel, prior to any
authentication. Only valid for the TCP transport.

Added two optional transport module callbacks: `subsystem_add_host()` and `subsystem_remove_host()`.
These functions will notify a transport about adding/removing hosts' access.

### nvme

New API `spdk_nvme_ns_get_format_index` was added to calculate the exact format index, that
+2 −1
Original line number Diff line number Diff line
@@ -511,11 +511,12 @@ struct spdk_nvmf_subsystem *spdk_nvmf_subsystem_get_next(struct spdk_nvmf_subsys
 *
 * \param subsystem Subsystem to add host to.
 * \param hostnqn The NQN for the host.
 * \param params Transport specific parameters.
 *
 * \return 0 on success, or negated errno value on failure.
 */
int spdk_nvmf_subsystem_add_host(struct spdk_nvmf_subsystem *subsystem,
				 const char *hostnqn);
				 const char *hostnqn, const struct spdk_json_val *params);

/**
 * Remove the given host NQN from the list of allowed hosts.
+19 −0
Original line number Diff line number Diff line
@@ -397,6 +397,25 @@ struct spdk_nvmf_transport_ops {
	 */
	void (*poll_group_dump_stat)(struct spdk_nvmf_transport_poll_group *group,
				     struct spdk_json_write_ctx *w);

	/*
	 * A notification that a subsystem has been configured to allow access
	 * from the given host.
	 * This callback is optional and not all transports need to implement it.
	 */
	int (*subsystem_add_host)(struct spdk_nvmf_transport *transport,
				  const struct spdk_nvmf_subsystem *subsystem,
				  const char *hostnqn,
				  const struct spdk_json_val *transport_specific);

	/*
	 * A notification that a subsystem is no longer configured to allow access
	 * from the given host.
	 * This callback is optional and not all transports need to implement it.
	 */
	void (*subsystem_remove_host)(struct spdk_nvmf_transport *transport,
				      const struct spdk_nvmf_subsystem *subsystem,
				      const char *hostnqn);
};

/**
+4 −4
Original line number Diff line number Diff line
@@ -1462,7 +1462,7 @@ rpc_nvmf_subsystem_add_host(struct spdk_jsonrpc_request *request,
	struct spdk_nvmf_tgt *tgt;
	int rc;

	if (spdk_json_decode_object(params, nvmf_rpc_subsystem_host_decoder,
	if (spdk_json_decode_object_relaxed(params, nvmf_rpc_subsystem_host_decoder,
					    SPDK_COUNTOF(nvmf_rpc_subsystem_host_decoder),
					    &ctx)) {
		SPDK_ERRLOG("spdk_json_decode_object failed\n");
@@ -1488,7 +1488,7 @@ rpc_nvmf_subsystem_add_host(struct spdk_jsonrpc_request *request,
		return;
	}

	rc = spdk_nvmf_subsystem_add_host(subsystem, ctx.host);
	rc = spdk_nvmf_subsystem_add_host(subsystem, ctx.host, params);
	if (rc != 0) {
		spdk_jsonrpc_send_error_response(request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, "Internal error");
		nvmf_rpc_host_ctx_free(&ctx);
+33 −1
Original line number Diff line number Diff line
@@ -422,6 +422,7 @@ spdk_nvmf_subsystem_destroy(struct spdk_nvmf_subsystem *subsystem, nvmf_subsyste
			    void *cpl_cb_arg)
{
	struct spdk_nvmf_host *host, *host_tmp;
	struct spdk_nvmf_transport *transport;

	if (!subsystem) {
		return -EINVAL;
@@ -451,6 +452,12 @@ spdk_nvmf_subsystem_destroy(struct spdk_nvmf_subsystem *subsystem, nvmf_subsyste
	pthread_mutex_lock(&subsystem->mutex);

	TAILQ_FOREACH_SAFE(host, &subsystem->hosts, link, host_tmp) {
		for (transport = spdk_nvmf_transport_get_first(subsystem->tgt); transport;
		     transport = spdk_nvmf_transport_get_next(transport)) {
			if (transport->ops->subsystem_remove_host) {
				transport->ops->subsystem_remove_host(transport, subsystem, host->nqn);
			}
		}
		nvmf_subsystem_remove_host(subsystem, host);
	}

@@ -789,9 +796,12 @@ nvmf_subsystem_find_host(struct spdk_nvmf_subsystem *subsystem, const char *host
}

int
spdk_nvmf_subsystem_add_host(struct spdk_nvmf_subsystem *subsystem, const char *hostnqn)
spdk_nvmf_subsystem_add_host(struct spdk_nvmf_subsystem *subsystem, const char *hostnqn,
			     const struct spdk_json_val *params)
{
	struct spdk_nvmf_host *host;
	struct spdk_nvmf_transport *transport;
	int rc;

	if (!nvmf_valid_nqn(hostnqn)) {
		return -EINVAL;
@@ -821,6 +831,20 @@ spdk_nvmf_subsystem_add_host(struct spdk_nvmf_subsystem *subsystem, const char *
		nvmf_update_discovery_log(subsystem->tgt, hostnqn);
	}

	for (transport = spdk_nvmf_transport_get_first(subsystem->tgt); transport;
	     transport = spdk_nvmf_transport_get_next(transport)) {
		if (transport->ops->subsystem_add_host) {
			rc = transport->ops->subsystem_add_host(transport, subsystem, hostnqn, params);
			if (rc) {
				SPDK_ERRLOG("Unable to add host to %s transport\n", transport->ops->name);
				/* Remove this host from all transports we've managed to add it to. */
				pthread_mutex_unlock(&subsystem->mutex);
				spdk_nvmf_subsystem_remove_host(subsystem, hostnqn);
				return rc;
			}
		}
	}

	pthread_mutex_unlock(&subsystem->mutex);

	return 0;
@@ -830,6 +854,7 @@ int
spdk_nvmf_subsystem_remove_host(struct spdk_nvmf_subsystem *subsystem, const char *hostnqn)
{
	struct spdk_nvmf_host *host;
	struct spdk_nvmf_transport *transport;

	pthread_mutex_lock(&subsystem->mutex);

@@ -847,6 +872,13 @@ spdk_nvmf_subsystem_remove_host(struct spdk_nvmf_subsystem *subsystem, const cha
		nvmf_update_discovery_log(subsystem->tgt, hostnqn);
	}

	for (transport = spdk_nvmf_transport_get_first(subsystem->tgt); transport;
	     transport = spdk_nvmf_transport_get_next(transport)) {
		if (transport->ops->subsystem_remove_host) {
			transport->ops->subsystem_remove_host(transport, subsystem, hostnqn);
		}
	}

	pthread_mutex_unlock(&subsystem->mutex);

	return 0;
Loading