diff --git a/app/nvmf_tgt/Makefile b/app/nvmf_tgt/Makefile index 646e4bb60..85c636819 100644 --- a/app/nvmf_tgt/Makefile +++ b/app/nvmf_tgt/Makefile @@ -53,6 +53,7 @@ SPDK_LIBS = \ $(SPDK_ROOT_DIR)/lib/conf/libspdk_conf.a \ $(SPDK_ROOT_DIR)/lib/util/libspdk_util.a \ $(SPDK_ROOT_DIR)/lib/memory/libspdk_memory.a \ + $(SPDK_ROOT_DIR)/lib/bdev/libspdk_bdev.a \ LIBS += $(SPDK_LIBS) $(PCIACCESS_LIB) diff --git a/lib/nvmf/request.c b/lib/nvmf/request.c index fed39937f..68977e140 100644 --- a/lib/nvmf/request.c +++ b/lib/nvmf/request.c @@ -237,7 +237,7 @@ nvmf_process_admin_cmd(struct spdk_nvmf_request *req) default: passthrough: SPDK_TRACELOG(SPDK_TRACE_NVMF, "admin_cmd passthrough: opc 0x%02x\n", cmd->opc); - rc = spdk_nvme_ctrlr_cmd_admin_raw(subsystem->ctrlr, + rc = spdk_nvme_ctrlr_cmd_admin_raw(subsystem->ctrlr.direct.ctrlr, cmd, req->data, req->length, nvmf_complete_cmd, @@ -249,6 +249,7 @@ passthrough: } return false; } + } static bool @@ -257,7 +258,7 @@ nvmf_process_io_cmd(struct spdk_nvmf_request *req) struct spdk_nvmf_subsystem *subsystem = req->conn->sess->subsys; int rc; - rc = spdk_nvme_ctrlr_cmd_io_raw(subsystem->ctrlr, subsystem->io_qpair, + rc = spdk_nvme_ctrlr_cmd_io_raw(subsystem->ctrlr.direct.ctrlr, subsystem->ctrlr.direct.io_qpair, &req->cmd->nvme_cmd, req->data, req->length, nvmf_complete_cmd, diff --git a/lib/nvmf/session.c b/lib/nvmf/session.c index ac77a0c4a..b9f4847cd 100644 --- a/lib/nvmf/session.c +++ b/lib/nvmf/session.c @@ -90,7 +90,7 @@ nvmf_init_nvme_session_properties(struct nvmf_session *session) */ /* Init the virtual controller details using actual HW details */ - cdata = spdk_nvme_ctrlr_get_data(session->subsys->ctrlr); + cdata = spdk_nvme_ctrlr_get_data(session->subsys->ctrlr.direct.ctrlr); memcpy(&session->vcdata, cdata, sizeof(struct spdk_nvme_ctrlr_data)); session->vcdata.aerl = 0; diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index 39af42c05..c27951078 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -85,8 +85,8 @@ spdk_nvmf_subsystem_poller(void *arg) /* For NVMe subsystems, check the backing physical device for completions. */ if (subsystem->subtype == SPDK_NVMF_SUBTYPE_NVME) { - spdk_nvme_ctrlr_process_admin_completions(subsystem->ctrlr); - spdk_nvme_qpair_process_completions(subsystem->io_qpair, 0); + spdk_nvme_ctrlr_process_admin_completions(subsystem->ctrlr.direct.ctrlr); + spdk_nvme_qpair_process_completions(subsystem->ctrlr.direct.io_qpair, 0); } /* For each connection in the session, check for RDMA completions */ @@ -153,8 +153,8 @@ nvmf_delete_subsystem(struct spdk_nvmf_subsystem *subsystem) spdk_nvmf_session_destruct(subsystem->session); } - if (subsystem->ctrlr) { - spdk_nvme_detach(subsystem->ctrlr); + if (subsystem->ctrlr.direct.ctrlr) { + spdk_nvme_detach(subsystem->ctrlr.direct.ctrlr); } TAILQ_REMOVE(&g_subsystems, subsystem, entries); @@ -199,11 +199,10 @@ int nvmf_subsystem_add_ctrlr(struct spdk_nvmf_subsystem *subsystem, struct spdk_nvme_ctrlr *ctrlr) { - subsystem->ctrlr = ctrlr; - + subsystem->ctrlr.direct.ctrlr = ctrlr; /* Assume that all I/O will be handled on one thread for now */ - subsystem->io_qpair = spdk_nvme_ctrlr_alloc_io_qpair(ctrlr, 0); - if (subsystem->io_qpair == NULL) { + subsystem->ctrlr.direct.io_qpair = spdk_nvme_ctrlr_alloc_io_qpair(ctrlr, 0); + if (subsystem->ctrlr.direct.io_qpair == NULL) { SPDK_ERRLOG("spdk_nvme_ctrlr_alloc_io_qpair() failed\n"); return -1; } diff --git a/lib/nvmf/subsystem.h b/lib/nvmf/subsystem.h index 60063d977..b2a77a138 100644 --- a/lib/nvmf/subsystem.h +++ b/lib/nvmf/subsystem.h @@ -39,10 +39,13 @@ #include "spdk/event.h" #include "spdk/nvme.h" #include "spdk/queue.h" +#include "spdk/bdev.h" struct spdk_nvmf_conn; +struct spdk_nvmf_subsystem; #define MAX_NQN_SIZE 255 +#define MAX_VIRTUAL_NAMESPACE 16 enum spdk_nvmf_subsystem_mode { NVMF_SUBSYSTEM_MODE_DIRECT = 0, @@ -61,6 +64,27 @@ struct spdk_nvmf_host { TAILQ_ENTRY(spdk_nvmf_host) link; }; +struct spdk_nvmf_ns { + uint32_t nsid; + struct spdk_bdev *bdev; +}; + + +union spdk_nvmf_controller { + struct { + struct nvmf_session *session; + struct spdk_nvme_ctrlr *ctrlr; + struct spdk_nvme_qpair *io_qpair; + } direct; + + struct { + struct nvmf_session *session; + struct spdk_nvmf_ns *ns_list[MAX_VIRTUAL_NAMESPACE]; + uint16_t ns_count; + } virtual; +}; + + /* * The NVMf subsystem, as indicated in the specification, is a collection * of virtual controller sessions. Any individual controller session has @@ -72,8 +96,7 @@ struct spdk_nvmf_subsystem { enum spdk_nvmf_subsystem_mode mode; enum spdk_nvmf_subtype subtype; struct nvmf_session *session; - struct spdk_nvme_ctrlr *ctrlr; - struct spdk_nvme_qpair *io_qpair; + union spdk_nvmf_controller ctrlr; struct spdk_poller poller;