diff --git a/include/spdk/nvmf_transport.h b/include/spdk/nvmf_transport.h index 313680b04..3d784684a 100644 --- a/include/spdk/nvmf_transport.h +++ b/include/spdk/nvmf_transport.h @@ -429,6 +429,7 @@ int spdk_nvmf_request_get_buffers_multi(struct spdk_nvmf_request *req, bool spdk_nvmf_request_get_dif_ctx(struct spdk_nvmf_request *req, struct spdk_dif_ctx *dif_ctx); void spdk_nvmf_request_exec(struct spdk_nvmf_request *req); +void spdk_nvmf_request_exec_fabrics(struct spdk_nvmf_request *req); int spdk_nvmf_request_free(struct spdk_nvmf_request *req); int spdk_nvmf_request_complete(struct spdk_nvmf_request *req); diff --git a/lib/nvmf/ctrlr.c b/lib/nvmf/ctrlr.c index 9a51d9271..399ae5f27 100644 --- a/lib/nvmf/ctrlr.c +++ b/lib/nvmf/ctrlr.c @@ -3497,6 +3497,33 @@ spdk_nvmf_request_complete(struct spdk_nvmf_request *req) return 0; } +void +spdk_nvmf_request_exec_fabrics(struct spdk_nvmf_request *req) +{ + struct spdk_nvmf_qpair *qpair = req->qpair; + struct spdk_nvmf_subsystem_poll_group *sgroup = NULL; + enum spdk_nvmf_request_exec_status status; + + if (qpair->ctrlr) { + sgroup = &qpair->group->sgroups[qpair->ctrlr->subsys->id]; + } else if (spdk_unlikely(nvmf_request_is_fabric_connect(req))) { + sgroup = nvmf_subsystem_pg_from_connect_cmd(req); + } + + assert(sgroup != NULL); + sgroup->io_outstanding++; + + /* Place the request on the outstanding list so we can keep track of it */ + TAILQ_INSERT_TAIL(&qpair->outstanding, req, link); + + assert(req->cmd->nvmf_cmd.opcode == SPDK_NVME_OPC_FABRIC); + status = nvmf_ctrlr_process_fabrics_cmd(req); + + if (status == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE) { + _nvmf_request_complete(req); + } +} + void spdk_nvmf_request_exec(struct spdk_nvmf_request *req) { diff --git a/lib/nvmf/spdk_nvmf.map b/lib/nvmf/spdk_nvmf.map index 6e5953f1f..349f8fbc4 100644 --- a/lib/nvmf/spdk_nvmf.map +++ b/lib/nvmf/spdk_nvmf.map @@ -109,6 +109,7 @@ spdk_nvmf_request_get_buffers; spdk_nvmf_request_get_buffers_multi; spdk_nvmf_request_get_dif_ctx; + spdk_nvmf_request_exec_fabrics; spdk_nvmf_request_exec; spdk_nvmf_request_free; spdk_nvmf_request_complete;