nvmf: refactor abort handling

Combine request lookup and abort into a single operation. Keeping them
separate would result in duplicating a lot of logic for finding the
proper list from which to remove aborted requests.

This is still a no-op for now, but it paves the way for aborting
requests that are still queued in software.

Change-Id: If8f268521f2c9f93b413261d87e9f39e539813aa
Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com>
Reviewed-on: https://review.gerrithub.io/412880
Tested-by: SPDK Automated Test System <sys_sgsw@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Daniel Verkamp 2018-05-29 18:21:02 -07:00 committed by Changpeng Liu
parent d10401cc07
commit 85a822292d
3 changed files with 17 additions and 21 deletions

View File

@ -498,13 +498,6 @@ spdk_nvmf_ctrlr_get_qpair(struct spdk_nvmf_ctrlr *ctrlr, uint16_t qid)
return NULL;
}
static struct spdk_nvmf_request *
spdk_nvmf_qpair_get_request(struct spdk_nvmf_qpair *qpair, uint16_t cid)
{
/* TODO: track list of outstanding requests in qpair? */
return NULL;
}
static uint64_t
nvmf_prop_get_cap(struct spdk_nvmf_ctrlr *ctrlr)
{
@ -1458,6 +1451,14 @@ invalid_cns:
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
}
static struct spdk_nvmf_request *
spdk_nvmf_qpair_abort(struct spdk_nvmf_qpair *qpair, uint16_t cid)
{
/* TODO: track list of outstanding requests in qpair? */
return NULL;
}
static void
spdk_nvmf_ctrlr_abort_on_qpair(void *arg)
{
@ -1483,7 +1484,7 @@ spdk_nvmf_ctrlr_abort_on_qpair(void *arg)
assert(spdk_get_thread() == qpair->group->thread);
req_to_abort = spdk_nvmf_qpair_get_request(qpair, cid);
req_to_abort = spdk_nvmf_qpair_abort(qpair, cid);
if (req_to_abort == NULL) {
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "cid %u not found\n", cid);
rsp->status.sct = SPDK_NVME_SCT_GENERIC;
@ -1491,11 +1492,14 @@ spdk_nvmf_ctrlr_abort_on_qpair(void *arg)
goto complete_abort;
}
if (spdk_nvmf_request_abort(req_to_abort) == 0) {
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "abort ctrlr=%p req=%p sqid=%u cid=%u successful\n",
ctrlr, req_to_abort, sqid, cid);
rsp->cdw0 = 0; /* Command successfully aborted */
}
/* Complete the request with aborted status */
req_to_abort->rsp->nvme_cpl.status.sct = SPDK_NVME_SCT_GENERIC;
req_to_abort->rsp->nvme_cpl.status.sc = SPDK_NVME_SC_ABORTED_BY_REQUEST;
spdk_nvmf_request_complete(req_to_abort);
SPDK_DEBUGLOG(SPDK_LOG_NVMF, "abort ctrlr=%p req=%p sqid=%u cid=%u successful\n",
ctrlr, req_to_abort, sqid, cid);
rsp->cdw0 = 0; /* Command successfully aborted */
rsp->status.sct = SPDK_NVME_SCT_GENERIC;
rsp->status.sc = SPDK_NVME_SC_SUCCESS;

View File

@ -252,7 +252,6 @@ int spdk_nvmf_poll_group_resume_subsystem(struct spdk_nvmf_poll_group *group,
struct spdk_nvmf_subsystem *subsystem);
void spdk_nvmf_request_exec(struct spdk_nvmf_request *req);
int spdk_nvmf_request_complete(struct spdk_nvmf_request *req);
int spdk_nvmf_request_abort(struct spdk_nvmf_request *req);
void spdk_nvmf_get_discovery_log_page(struct spdk_nvmf_tgt *tgt,
void *buffer, uint64_t offset,

View File

@ -152,10 +152,3 @@ spdk_nvmf_request_exec(struct spdk_nvmf_request *req)
spdk_nvmf_request_complete(req);
}
}
int
spdk_nvmf_request_abort(struct spdk_nvmf_request *req)
{
/* TODO: implement abort, at least for commands that are still queued in software */
return -1;
}