lib/nvmf: Support custom admin cmd handler for abort

The new abort functionality doesn't take custom admin cmd
handlers into account.
This commit allows setting a custom admin cmd handler
for abort that provides the ability to influence the
bdev lookup to which the abort is sent to.

Signed-off-by: Michael Haeuptle <michael.haeuptle@hpe.com>
Change-Id: I3a66c6f863f5ee4d89cb2194dffdc6855945fa8a
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/3485
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Shuhei Matsumoto <shuhei.matsumoto.xt@hitachi.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Michael Haeuptle 2020-07-23 14:28:58 +00:00 committed by Tomasz Zawadzki
parent e2b236ed50
commit 62649a7d7b
6 changed files with 42 additions and 9 deletions

View File

@ -132,6 +132,19 @@ typedef void (*spdk_nvmf_nvme_passthru_cmd_cb)(struct spdk_nvmf_request *req);
int spdk_nvmf_bdev_ctrlr_nvme_passthru_admin(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
struct spdk_io_channel *ch, struct spdk_nvmf_request *req, spdk_nvmf_nvme_passthru_cmd_cb cb_fn);
/**
* Attempts to abort a request in the specified bdev
*
* \param bdev Bdev that is processing req_to_abort
* \param desc Bdev desc
* \param ch Channel on which req_to_abort was originally submitted
* \param req Abort cmd req
* \param req_to_abort The request that should be aborted
*/
int spdk_nvmf_bdev_ctrlr_abort_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
struct spdk_io_channel *ch, struct spdk_nvmf_request *req,
struct spdk_nvmf_request *req_to_abort);
/**
* Provide access to the underlying bdev that is associated with a namespace.
*
@ -200,4 +213,14 @@ struct spdk_nvme_cmd *spdk_nvmf_request_get_cmd(struct spdk_nvmf_request *req);
*/
struct spdk_nvme_cpl *spdk_nvmf_request_get_response(struct spdk_nvmf_request *req);
/**
* Get the request to abort that is associated with this request.
* The req to abort is only set if the request processing a SPDK_NVME_OPC_ABORT cmd
*
* \param req The NVMe-oF abort request
*
* \return req_to_abort The NVMe-oF request that is in process of being aborted
*/
struct spdk_nvmf_request *spdk_nvmf_request_get_req_to_abort(struct spdk_nvmf_request *req);
#endif /* SPDK_NVMF_CMD_H_ */

View File

@ -2173,13 +2173,18 @@ nvmf_ctrlr_abort_request(struct spdk_nvmf_request *req)
assert(req_to_abort != NULL);
if (g_nvmf_custom_admin_cmd_hdlrs[SPDK_NVME_OPC_ABORT].hdlr &&
nvmf_qpair_is_admin_queue(req_to_abort->qpair)) {
return g_nvmf_custom_admin_cmd_hdlrs[SPDK_NVME_OPC_ABORT].hdlr(req);
}
rc = spdk_nvmf_request_get_bdev(req_to_abort->cmd->nvme_cmd.nsid, req_to_abort,
&bdev, &desc, &ch);
if (rc != 0) {
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
}
return nvmf_bdev_ctrlr_abort_cmd(bdev, desc, ch, req, req_to_abort);
return spdk_nvmf_bdev_ctrlr_abort_cmd(bdev, desc, ch, req, req_to_abort);
}
static int
@ -2340,7 +2345,8 @@ nvmf_ctrlr_process_admin_cmd(struct spdk_nvmf_request *req)
}
}
if (g_nvmf_custom_admin_cmd_hdlrs[cmd->opc].hdlr) {
/* Call a custom adm cmd handler if set. Aborts are handled in a different path (see nvmf_passthru_admin_cmd) */
if (g_nvmf_custom_admin_cmd_hdlrs[cmd->opc].hdlr && cmd->opc != SPDK_NVME_OPC_ABORT) {
rc = g_nvmf_custom_admin_cmd_hdlrs[cmd->opc].hdlr(req);
if (rc >= SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE) {
/* The handler took care of this commmand */
@ -3211,3 +3217,8 @@ uint16_t spdk_nvmf_ctrlr_get_id(struct spdk_nvmf_ctrlr *ctrlr)
{
return ctrlr->cntlid;
}
struct spdk_nvmf_request *spdk_nvmf_request_get_req_to_abort(struct spdk_nvmf_request *req)
{
return req->req_to_abort;
}

View File

@ -707,7 +707,7 @@ nvmf_bdev_ctrlr_complete_abort_cmd(struct spdk_bdev_io *bdev_io, bool success, v
}
int
nvmf_bdev_ctrlr_abort_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
spdk_nvmf_bdev_ctrlr_abort_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
struct spdk_io_channel *ch, struct spdk_nvmf_request *req,
struct spdk_nvmf_request *req_to_abort)
{

View File

@ -309,9 +309,6 @@ int nvmf_bdev_ctrlr_dsm_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
struct spdk_io_channel *ch, struct spdk_nvmf_request *req);
int nvmf_bdev_ctrlr_nvme_passthru_io(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
struct spdk_io_channel *ch, struct spdk_nvmf_request *req);
int nvmf_bdev_ctrlr_abort_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
struct spdk_io_channel *ch, struct spdk_nvmf_request *req,
struct spdk_nvmf_request *req_to_abort);
bool nvmf_bdev_ctrlr_get_dif_ctx(struct spdk_bdev *bdev, struct spdk_nvme_cmd *cmd,
struct spdk_dif_ctx *dif_ctx);

View File

@ -91,6 +91,8 @@
spdk_nvmf_request_get_data;
spdk_nvmf_request_get_cmd;
spdk_nvmf_request_get_response;
spdk_nvmf_request_get_req_to_abort;
spdk_nvmf_bdev_ctrlr_abort_cmd;
# public functions in nvmf_transport.h
spdk_nvmf_transport_register;

View File

@ -163,7 +163,7 @@ DEFINE_STUB(nvmf_bdev_ctrlr_nvme_passthru_io,
struct spdk_nvmf_request *req),
0);
DEFINE_STUB(nvmf_bdev_ctrlr_abort_cmd,
DEFINE_STUB(spdk_nvmf_bdev_ctrlr_abort_cmd,
int,
(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, struct spdk_io_channel *ch,
struct spdk_nvmf_request *req, struct spdk_nvmf_request *req_to_abort),