nvmf: pass listen done cb to transport specific code
This would allow to respond for add listener rpc request even when there are async calls in transport specific function. Signed-off-by: Jacek Kalwas <jacek.kalwas@intel.com> Change-Id: I94a9f45b7ba9e8d46a60ae3785953cea12554732 Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/479511 Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Broadcom SPDK FC-NVMe CI <spdk-ci.pdl@broadcom.com> Community-CI: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Ben Walker <benjamin.walker@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Anil Veerabhadrappa <anil.veerabhadrappa@broadcom.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
parent
7cd56fb3ed
commit
708ed4fb6e
@ -122,6 +122,14 @@ 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);
|
||||
|
||||
struct spdk_nvmf_transport_ops {
|
||||
/**
|
||||
* Transport name
|
||||
@ -153,7 +161,9 @@ 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);
|
||||
const struct spdk_nvme_transport_id *trid,
|
||||
spdk_nvmf_tgt_listen_done_fn cb_fn,
|
||||
void *cb_arg);
|
||||
|
||||
/**
|
||||
* Stop accepting new connections at the given address.
|
||||
@ -329,14 +339,6 @@ struct spdk_nvmf_tgt *spdk_nvmf_get_next_tgt(struct spdk_nvmf_tgt *prev);
|
||||
*/
|
||||
void spdk_nvmf_tgt_write_config_json(struct spdk_json_write_ctx *w, struct spdk_nvmf_tgt *tgt);
|
||||
|
||||
/**
|
||||
* 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);
|
||||
|
||||
/**
|
||||
* Begin accepting new connections at the address provided.
|
||||
*
|
||||
@ -1083,12 +1085,16 @@ 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);
|
||||
const struct spdk_nvme_transport_id *trid,
|
||||
spdk_nvmf_tgt_listen_done_fn cb_fn,
|
||||
void *cb_arg);
|
||||
|
||||
/**
|
||||
* Write NVMe-oF target's transport configurations into provided JSON context.
|
||||
|
@ -1924,8 +1924,12 @@ 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)
|
||||
const struct spdk_nvme_transport_id *trid,
|
||||
spdk_nvmf_tgt_listen_done_fn cb_fn,
|
||||
void *cb_arg)
|
||||
{
|
||||
cb_fn(cb_arg, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -563,16 +563,12 @@ spdk_nvmf_tgt_listen(struct spdk_nvmf_tgt *tgt,
|
||||
return;
|
||||
}
|
||||
|
||||
rc = spdk_nvmf_transport_listen(transport, trid);
|
||||
rc = spdk_nvmf_transport_listen(transport, trid, cb_fn, cb_arg);
|
||||
if (rc < 0) {
|
||||
SPDK_ERRLOG("Unable to listen on address '%s'\n", trid->traddr);
|
||||
cb_fn(cb_arg, rc);
|
||||
return;
|
||||
}
|
||||
|
||||
tgt->discovery_genctr++;
|
||||
|
||||
cb_fn(cb_arg, 0);
|
||||
}
|
||||
|
||||
struct spdk_nvmf_tgt_add_transport_ctx {
|
||||
|
@ -2623,7 +2623,9 @@ spdk_nvmf_rdma_trid_from_cm_id(struct rdma_cm_id *id,
|
||||
|
||||
static int
|
||||
spdk_nvmf_rdma_listen(struct spdk_nvmf_transport *transport,
|
||||
const struct spdk_nvme_transport_id *trid)
|
||||
const struct spdk_nvme_transport_id *trid,
|
||||
spdk_nvmf_tgt_listen_done_fn cb_fn,
|
||||
void *cb_arg)
|
||||
{
|
||||
struct spdk_nvmf_rdma_transport *rtransport;
|
||||
struct spdk_nvmf_rdma_device *device;
|
||||
@ -2746,6 +2748,7 @@ spdk_nvmf_rdma_listen(struct spdk_nvmf_transport *transport,
|
||||
success:
|
||||
port->ref++;
|
||||
pthread_mutex_unlock(&rtransport->lock);
|
||||
cb_fn(cb_arg, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -779,6 +779,7 @@ spdk_nvmf_subsystem_add_listener(struct spdk_nvmf_subsystem *subsystem,
|
||||
listener->transport = transport;
|
||||
|
||||
TAILQ_INSERT_HEAD(&subsystem->listeners, listener, link);
|
||||
subsystem->tgt->discovery_genctr++;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -647,7 +647,9 @@ _spdk_nvmf_tcp_find_port(struct spdk_nvmf_tcp_transport *ttransport,
|
||||
|
||||
static int
|
||||
spdk_nvmf_tcp_listen(struct spdk_nvmf_transport *transport,
|
||||
const struct spdk_nvme_transport_id *trid)
|
||||
const struct spdk_nvme_transport_id *trid,
|
||||
spdk_nvmf_tgt_listen_done_fn cb_fn,
|
||||
void *cb_arg)
|
||||
{
|
||||
struct spdk_nvmf_tcp_transport *ttransport;
|
||||
struct spdk_nvmf_tcp_port *port;
|
||||
@ -718,6 +720,7 @@ spdk_nvmf_tcp_listen(struct spdk_nvmf_transport *transport,
|
||||
success:
|
||||
port->ref++;
|
||||
pthread_mutex_unlock(&ttransport->lock);
|
||||
cb_fn(cb_arg, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -175,9 +175,11 @@ spdk_nvmf_transport_destroy(struct spdk_nvmf_transport *transport)
|
||||
|
||||
int
|
||||
spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport,
|
||||
const struct spdk_nvme_transport_id *trid)
|
||||
const struct spdk_nvme_transport_id *trid,
|
||||
spdk_nvmf_tgt_listen_done_fn cb_fn,
|
||||
void *cb_arg)
|
||||
{
|
||||
return transport->ops->listen(transport, trid);
|
||||
return transport->ops->listen(transport, trid, cb_fn, cb_arg);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -79,7 +79,9 @@ spdk_bdev_get_uuid(const struct spdk_bdev *bdev)
|
||||
|
||||
int
|
||||
spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport,
|
||||
const struct spdk_nvme_transport_id *trid)
|
||||
const struct spdk_nvme_transport_id *trid,
|
||||
spdk_nvmf_tgt_listen_done_fn cb_fn,
|
||||
void *cb_arg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@ -223,13 +225,13 @@ test_discovery_log(void)
|
||||
disc_log = (struct spdk_nvmf_discovery_log_page *)buffer;
|
||||
spdk_nvmf_get_discovery_log_page(&tgt, "nqn.2016-06.io.spdk:host1", &iov, 1, 0,
|
||||
sizeof(disc_log->genctr));
|
||||
CU_ASSERT(disc_log->genctr == 1); /* one added subsystem */
|
||||
CU_ASSERT(disc_log->genctr == 2); /* one added subsystem and listener */
|
||||
|
||||
/* Get only the header, no entries */
|
||||
memset(buffer, 0xCC, sizeof(buffer));
|
||||
disc_log = (struct spdk_nvmf_discovery_log_page *)buffer;
|
||||
spdk_nvmf_get_discovery_log_page(&tgt, "nqn.2016-06.io.spdk:host1", &iov, 1, 0, sizeof(*disc_log));
|
||||
CU_ASSERT(disc_log->genctr == 1);
|
||||
CU_ASSERT(disc_log->genctr == 2);
|
||||
CU_ASSERT(disc_log->numrec == 1);
|
||||
|
||||
/* Offset 0, exact size match */
|
||||
|
@ -66,7 +66,9 @@ DEFINE_STUB(spdk_nvmf_transport_stop_listen,
|
||||
|
||||
int
|
||||
spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport,
|
||||
const struct spdk_nvme_transport_id *trid)
|
||||
const struct spdk_nvme_transport_id *trid,
|
||||
spdk_nvmf_tgt_listen_done_fn cb_fn,
|
||||
void *cb_arg)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user