Commit c40f35b7 authored by Ben Walker's avatar Ben Walker Committed by Tomasz Zawadzki
Browse files

nvmf: Make spdk_nvmf_tgt_listen synchronous again



This was recently made asynchronous to support virtualized transports.
However, we're moving to add a new call to associated a listener with a
subsystem to transports and the operation that needed to be asynchronous
will actually be performed there. For simplicity, make this synchronous
again.

Change-Id: Ie98136a19c58f0f9bba0d140476de3bbb38e12d7
Signed-off-by: default avatarBen Walker <benjamin.walker@intel.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/881


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: default avatarShuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
parent f146bbe4
Loading
Loading
Loading
Loading
+4 −21
Original line number Diff line number Diff line
@@ -122,14 +122,6 @@ struct spdk_nvmf_transport_poll_group_stat {
 */
typedef void (*new_qpair_fn)(struct spdk_nvmf_qpair *qpair, void *cb_arg);

/**
 * Function to be called once the target is listening.
 *
 * \param ctx Context argument passed to this function.
 * \param status 0 if it completed successfully, or negative errno if it failed.
 */
typedef void (*spdk_nvmf_tgt_listen_done_fn)(void *ctx, int status);

/**
 * Construct an NVMe-oF target.
 *
@@ -211,16 +203,11 @@ void spdk_nvmf_tgt_write_config_json(struct spdk_json_write_ctx *w, struct spdk_
 *
 * \param tgt The target associated with this listen address.
 * \param trid The address to listen at.
 * \param cb_fn A callback that will be called once the target is listening
 * \param cb_arg A context argument passed to cb_fn.
 *
 * \return void. The callback status argument will be 0 on success
 *	   or a negated errno on failure.
 * \return 0 on success or a negated errno on failure.
 */
void spdk_nvmf_tgt_listen(struct spdk_nvmf_tgt *tgt,
			  struct spdk_nvme_transport_id *trid,
			  spdk_nvmf_tgt_listen_done_fn cb_fn,
			  void *cb_arg);
int spdk_nvmf_tgt_listen(struct spdk_nvmf_tgt *tgt,
			 struct spdk_nvme_transport_id *trid);

/**
 * Stop accepting new connections at the provided address.
@@ -984,16 +971,12 @@ void spdk_nvmf_tgt_add_transport(struct spdk_nvmf_tgt *tgt,
 *
 * \param transport The transport to add listener to
 * \param trid Address to listen at
 * \param cb_fn A callback that will be called once the listener is created
 * \param cb_arg A context argument passed to cb_fn.
 *
 * \return int. 0 if it completed successfully, or negative errno if it failed.
 */
int
spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport,
			   const struct spdk_nvme_transport_id *trid,
			   spdk_nvmf_tgt_listen_done_fn cb_fn,
			   void *cb_arg);
			   const struct spdk_nvme_transport_id *trid);

/**
 * Remove listener from transport and stop accepting new connections.
+1 −3
Original line number Diff line number Diff line
@@ -209,9 +209,7 @@ struct spdk_nvmf_transport_ops {
	  * provided. This may be called multiple times.
	  */
	int (*listen)(struct spdk_nvmf_transport *transport,
		      const struct spdk_nvme_transport_id *trid,
		      spdk_nvmf_tgt_listen_done_fn cb_fn,
		      void *cb_arg);
		      const struct spdk_nvme_transport_id *trid);

	/**
	  * Stop accepting new connections at the given address.
+1 −5
Original line number Diff line number Diff line
@@ -1921,12 +1921,8 @@ nvmf_fc_destroy(struct spdk_nvmf_transport *transport)

static int
nvmf_fc_listen(struct spdk_nvmf_transport *transport,
	       const struct spdk_nvme_transport_id *trid,
	       spdk_nvmf_tgt_listen_done_fn cb_fn,
	       void *cb_arg)
	       const struct spdk_nvme_transport_id *trid)
{
	cb_fn(cb_arg, 0);

	return 0;
}

+7 −9
Original line number Diff line number Diff line
@@ -541,11 +541,9 @@ spdk_nvmf_tgt_write_config_json(struct spdk_json_write_ctx *w, struct spdk_nvmf_
	}
}

void
int
spdk_nvmf_tgt_listen(struct spdk_nvmf_tgt *tgt,
		     struct spdk_nvme_transport_id *trid,
		     spdk_nvmf_tgt_listen_done_fn cb_fn,
		     void *cb_arg)
		     struct spdk_nvme_transport_id *trid)
{
	struct spdk_nvmf_transport *transport;
	const char *trtype;
@@ -560,16 +558,16 @@ spdk_nvmf_tgt_listen(struct spdk_nvmf_tgt *tgt,
			SPDK_ERRLOG("The specified trtype %d is unknown. Please make sure that it is properly registered.\n",
				    trid->trtype);
		}
		cb_fn(cb_arg, -EINVAL);
		return;

		return -EINVAL;
	}

	rc = spdk_nvmf_transport_listen(transport, trid, cb_fn, cb_arg);
	rc = spdk_nvmf_transport_listen(transport, trid);
	if (rc < 0) {
		SPDK_ERRLOG("Unable to listen on address '%s'\n", trid->traddr);
		cb_fn(cb_arg, rc);
		return;
	}

	return rc;
}

int
+13 −28
Original line number Diff line number Diff line
@@ -634,42 +634,27 @@ nvmf_rpc_listen_resumed(struct spdk_nvmf_subsystem *subsystem,
}

static void
nvmf_rpc_tgt_listen(void *cb_arg, int status)
nvmf_rpc_listen_paused(struct spdk_nvmf_subsystem *subsystem,
		       void *cb_arg, int status)
{
	struct nvmf_rpc_listener_ctx *ctx = cb_arg;
	int rc;

	if (status) {
	if (ctx->op == NVMF_RPC_LISTEN_ADD) {
		if (!spdk_nvmf_subsystem_find_listener(subsystem, &ctx->trid)) {
			rc = spdk_nvmf_tgt_listen(ctx->tgt, &ctx->trid);
			if (rc == 0) {
				if (spdk_nvmf_subsystem_add_listener(ctx->subsystem, &ctx->trid)) {
					spdk_jsonrpc_send_error_response(ctx->request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
									 "Invalid parameters");
					ctx->response_sent = true;
				}
			} else {
		if (spdk_nvmf_subsystem_add_listener(ctx->subsystem, &ctx->trid)) {
				spdk_jsonrpc_send_error_response(ctx->request, SPDK_JSONRPC_ERROR_INVALID_PARAMS,
								 "Invalid parameters");
				ctx->response_sent = true;
			}
		}

	if (spdk_nvmf_subsystem_resume(ctx->subsystem, nvmf_rpc_listen_resumed, ctx)) {
		if (!ctx->response_sent) {
			spdk_jsonrpc_send_error_response(ctx->request, SPDK_JSONRPC_ERROR_INTERNAL_ERROR, "Internal error");
		}
		nvmf_rpc_listener_ctx_free(ctx);
		/* Can't really do anything to recover here - subsystem will remain paused. */
	}
}

static void
nvmf_rpc_listen_paused(struct spdk_nvmf_subsystem *subsystem,
		       void *cb_arg, int status)
{
	struct nvmf_rpc_listener_ctx *ctx = cb_arg;

	if (ctx->op == NVMF_RPC_LISTEN_ADD) {
		if (!spdk_nvmf_subsystem_find_listener(subsystem, &ctx->trid)) {
			spdk_nvmf_tgt_listen(ctx->tgt, &ctx->trid, nvmf_rpc_tgt_listen, ctx);
			return;
		}
	} else if (ctx->op == NVMF_RPC_LISTEN_REMOVE) {
		if (spdk_nvmf_subsystem_remove_listener(subsystem, &ctx->trid)) {
			SPDK_ERRLOG("Unable to remove listener.\n");
Loading