nvmf/ctrlr: fix completion for internal connect cmd
Hit assert when completion is done is response to internal connect cmd. Fix by outstanding counter incr, add missing err handling. Signed-off-by: Jacek Kalwas <jacek.kalwas@intel.com> Change-Id: I2ba71f83432831fc043f2b6f6a5cba024045068b Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/1902 Community-CI: Mellanox Build Bot Community-CI: Broadcom CI Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com> Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
This commit is contained in:
parent
1dfac8ba69
commit
652fe8a20b
@ -599,14 +599,60 @@ _spdk_nvmf_ctrlr_connect(struct spdk_nvmf_request *req)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
nvmf_request_is_fabric_connect(struct spdk_nvmf_request *req)
|
||||||
|
{
|
||||||
|
return req->cmd->nvmf_cmd.opcode == SPDK_NVME_OPC_FABRIC &&
|
||||||
|
req->cmd->nvmf_cmd.fctype == SPDK_NVMF_FABRIC_COMMAND_CONNECT;
|
||||||
|
}
|
||||||
|
|
||||||
|
static struct spdk_nvmf_subsystem_poll_group *
|
||||||
|
nvmf_subsystem_pg_from_connect_cmd(struct spdk_nvmf_request *req)
|
||||||
|
{
|
||||||
|
struct spdk_nvmf_fabric_connect_data *data;
|
||||||
|
struct spdk_nvmf_subsystem *subsystem;
|
||||||
|
struct spdk_nvmf_tgt *tgt;
|
||||||
|
|
||||||
|
assert(nvmf_request_is_fabric_connect(req));
|
||||||
|
assert(req->qpair->ctrlr == NULL);
|
||||||
|
|
||||||
|
data = req->data;
|
||||||
|
tgt = req->qpair->transport->tgt;
|
||||||
|
|
||||||
|
subsystem = spdk_nvmf_tgt_find_subsystem(tgt, data->subnqn);
|
||||||
|
if (subsystem == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &req->qpair->group->sgroups[subsystem->id];
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
spdk_nvmf_ctrlr_connect(struct spdk_nvmf_request *req)
|
spdk_nvmf_ctrlr_connect(struct spdk_nvmf_request *req)
|
||||||
{
|
{
|
||||||
|
struct spdk_nvmf_fabric_connect_rsp *rsp = &req->rsp->connect_rsp;
|
||||||
struct spdk_nvmf_qpair *qpair = req->qpair;
|
struct spdk_nvmf_qpair *qpair = req->qpair;
|
||||||
|
struct spdk_nvmf_subsystem_poll_group *sgroup;
|
||||||
|
enum spdk_nvmf_request_exec_status status;
|
||||||
|
|
||||||
|
sgroup = nvmf_subsystem_pg_from_connect_cmd(req);
|
||||||
|
if (!sgroup) {
|
||||||
|
SPDK_NVMF_INVALID_CONNECT_DATA(rsp, subnqn);
|
||||||
|
status = SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
sgroup->io_outstanding++;
|
||||||
TAILQ_INSERT_TAIL(&qpair->outstanding, req, link);
|
TAILQ_INSERT_TAIL(&qpair->outstanding, req, link);
|
||||||
|
|
||||||
return _spdk_nvmf_ctrlr_connect(req);
|
status = _spdk_nvmf_ctrlr_connect(req);
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (status == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE) {
|
||||||
|
spdk_nvmf_request_complete(req);
|
||||||
|
}
|
||||||
|
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@ -2807,34 +2853,6 @@ spdk_nvmf_request_free(struct spdk_nvmf_request *req)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool
|
|
||||||
nvmf_request_is_fabric_connect(struct spdk_nvmf_request *req)
|
|
||||||
{
|
|
||||||
return req->cmd->nvmf_cmd.opcode == SPDK_NVME_OPC_FABRIC &&
|
|
||||||
req->cmd->nvmf_cmd.fctype == SPDK_NVMF_FABRIC_COMMAND_CONNECT;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct spdk_nvmf_subsystem_poll_group *
|
|
||||||
nvmf_subsystem_pg_from_connect_cmd(struct spdk_nvmf_request *req)
|
|
||||||
{
|
|
||||||
struct spdk_nvmf_fabric_connect_data *data;
|
|
||||||
struct spdk_nvmf_subsystem *subsystem;
|
|
||||||
struct spdk_nvmf_tgt *tgt;
|
|
||||||
|
|
||||||
assert(nvmf_request_is_fabric_connect(req));
|
|
||||||
assert(req->qpair->ctrlr == NULL);
|
|
||||||
|
|
||||||
data = req->data;
|
|
||||||
tgt = req->qpair->transport->tgt;
|
|
||||||
|
|
||||||
subsystem = spdk_nvmf_tgt_find_subsystem(tgt, data->subnqn);
|
|
||||||
if (subsystem == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return &req->qpair->group->sgroups[subsystem->id];
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
spdk_nvmf_request_complete(struct spdk_nvmf_request *req)
|
spdk_nvmf_request_complete(struct spdk_nvmf_request *req)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user