Commit 9910e8d7 authored by Jim Harris's avatar Jim Harris
Browse files

nvmf: add nvmf_passthru_admin_cmd_for_ctrlr



This is a helper function to enable sending admin
cmds that target a controller rather than a
namespace. In this case the cmd's nsid will not
be valid for looking up a bdev, but we need to send
it through a bdev since there is no controller
entity in the bdev layer. It will just send it
through the first namespace on the controller.

This function will be used in upcoming patch, so
for now do not mark it static to avoid unused
warnings, we will add it when it gets used in next
patch.

Signed-off-by: default avatarJim Harris <jim.harris@samsung.com>
Change-Id: I1d723a928f9e32bc7361028fe7820a52b21151d7
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/20033


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: default avatarKarl Bonde Torp <k.torp@samsung.com>
Reviewed-by: default avatarAleksey Marchuk <alexeymar@nvidia.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarChangpeng Liu <changpeng.liu@intel.com>
parent 631e75fc
Loading
Loading
Loading
Loading
+34 −9
Original line number Diff line number Diff line
@@ -54,6 +54,7 @@ struct spdk_nvmf_custom_admin_cmd {
static struct spdk_nvmf_custom_admin_cmd g_nvmf_custom_admin_cmd_hdlrs[SPDK_NVME_MAX_OPC + 1];

static void _nvmf_request_complete(void *ctx);
int nvmf_passthru_admin_cmd_for_ctrlr(struct spdk_nvmf_request *req, struct spdk_nvmf_ctrlr *ctrlr);

static inline void
nvmf_invalid_connect_response(struct spdk_nvmf_fabric_connect_rsp *rsp,
@@ -4679,22 +4680,14 @@ spdk_nvmf_set_custom_admin_cmd_hdlr(uint8_t opc, spdk_nvmf_custom_cmd_hdlr hdlr)
}

static int
nvmf_passthru_admin_cmd(struct spdk_nvmf_request *req)
nvmf_passthru_admin_cmd_for_bdev_nsid(struct spdk_nvmf_request *req, uint32_t bdev_nsid)
{
	struct spdk_bdev *bdev;
	struct spdk_bdev_desc *desc;
	struct spdk_io_channel *ch;
	struct spdk_nvme_cmd *cmd = spdk_nvmf_request_get_cmd(req);
	struct spdk_nvme_cpl *response = spdk_nvmf_request_get_response(req);
	uint32_t bdev_nsid;
	int rc;

	if (g_nvmf_custom_admin_cmd_hdlrs[cmd->opc].nsid == 0) {
		bdev_nsid = cmd->nsid;
	} else {
		bdev_nsid = g_nvmf_custom_admin_cmd_hdlrs[cmd->opc].nsid;
	}

	rc = spdk_nvmf_request_get_bdev(bdev_nsid, req, &bdev, &desc, &ch);
	if (rc) {
		response->status.sct = SPDK_NVME_SCT_GENERIC;
@@ -4704,6 +4697,38 @@ nvmf_passthru_admin_cmd(struct spdk_nvmf_request *req)
	return spdk_nvmf_bdev_ctrlr_nvme_passthru_admin(bdev, desc, ch, req, NULL);
}

static int
nvmf_passthru_admin_cmd(struct spdk_nvmf_request *req)
{
	struct spdk_nvme_cmd *cmd = spdk_nvmf_request_get_cmd(req);
	uint32_t bdev_nsid;

	if (g_nvmf_custom_admin_cmd_hdlrs[cmd->opc].nsid != 0) {
		bdev_nsid = g_nvmf_custom_admin_cmd_hdlrs[cmd->opc].nsid;
	} else {
		bdev_nsid = cmd->nsid;
	}

	return nvmf_passthru_admin_cmd_for_bdev_nsid(req, bdev_nsid);
}

int
nvmf_passthru_admin_cmd_for_ctrlr(struct spdk_nvmf_request *req, struct spdk_nvmf_ctrlr *ctrlr)
{
	struct spdk_nvme_cpl *response = spdk_nvmf_request_get_response(req);
	struct spdk_nvmf_ns *ns;

	ns = spdk_nvmf_subsystem_get_first_ns(ctrlr->subsys);
	if (ns == NULL) {
		/* Is there a better sc to use here? */
		response->status.sct = SPDK_NVME_SCT_GENERIC;
		response->status.sc = SPDK_NVME_SC_INVALID_NAMESPACE_OR_FORMAT;
		return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
	}

	return nvmf_passthru_admin_cmd_for_bdev_nsid(req, ns->nsid);
}

void
spdk_nvmf_set_passthru_admin_cmd(uint8_t opc, uint32_t forward_nsid)
{