From 14451d76fe80b768fd6cc67123c62a23fd635f50 Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Thu, 17 Aug 2017 18:20:49 -0700 Subject: [PATCH] nvmf: encapsulate namespace data into a struct Add a new struct spdk_nvmf_ns to hold namespace information, and add accessor functions so that it can be moved out of the public API in future patches. Change-Id: Id926aaa3cc279649057afc65e08024628edbc435 Signed-off-by: Daniel Verkamp Reviewed-on: https://review.gerrithub.io/374740 Tested-by: SPDK Automated Test System Reviewed-by: Ben Walker Reviewed-by: Jim Harris --- app/nvmf_tgt/nvmf_rpc.c | 13 +-- include/spdk/nvmf.h | 63 +++++++++-- lib/nvmf/ctrlr.c | 34 +++--- lib/nvmf/ctrlr_bdev.c | 104 ++++++++++-------- lib/nvmf/nvmf_internal.h | 19 ++++ lib/nvmf/subsystem.c | 79 +++++++++++-- test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c | 21 ++++ .../lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c | 21 ++++ test/unit/lib/nvmf/subsystem.c/subsystem_ut.c | 14 +-- 9 files changed, 271 insertions(+), 97 deletions(-) diff --git a/app/nvmf_tgt/nvmf_rpc.c b/app/nvmf_tgt/nvmf_rpc.c index da44c987a..4de309576 100644 --- a/app/nvmf_tgt/nvmf_rpc.c +++ b/app/nvmf_tgt/nvmf_rpc.c @@ -99,22 +99,19 @@ dump_nvmf_subsystem(struct spdk_json_write_ctx *w, struct nvmf_tgt_subsystem *tg spdk_json_write_array_end(w); if (spdk_nvmf_subsystem_get_type(subsystem) == SPDK_NVMF_SUBTYPE_NVME) { - uint32_t i; + struct spdk_nvmf_ns *ns; spdk_json_write_name(w, "serial_number"); spdk_json_write_string(w, spdk_nvmf_subsystem_get_sn(subsystem)); spdk_json_write_name(w, "namespaces"); spdk_json_write_array_begin(w); - for (i = 0; i < subsystem->dev.max_nsid; i++) { - if (subsystem->dev.ns_list[i] == NULL) { - continue; - } - + for (ns = spdk_nvmf_subsystem_get_first_ns(subsystem); ns != NULL; + ns = spdk_nvmf_subsystem_get_next_ns(subsystem, ns)) { spdk_json_write_object_begin(w); spdk_json_write_name(w, "nsid"); - spdk_json_write_int32(w, i + 1); + spdk_json_write_int32(w, spdk_nvmf_ns_get_id(ns)); spdk_json_write_name(w, "name"); - spdk_json_write_string(w, spdk_bdev_get_name(subsystem->dev.ns_list[i])); + spdk_json_write_string(w, spdk_bdev_get_name(spdk_nvmf_ns_get_bdev(ns))); spdk_json_write_object_end(w); } spdk_json_write_array_end(w); diff --git a/include/spdk/nvmf.h b/include/spdk/nvmf.h index 893bd9668..7ea06d8cd 100644 --- a/include/spdk/nvmf.h +++ b/include/spdk/nvmf.h @@ -80,6 +80,14 @@ struct spdk_nvmf_subsystem_allowed_listener { TAILQ_ENTRY(spdk_nvmf_subsystem_allowed_listener) link; }; +struct spdk_nvmf_ns { + struct spdk_bdev *bdev; + struct spdk_bdev_desc *desc; + struct spdk_io_channel *ch; + uint32_t id; + bool allocated; +}; + /* * The NVMf subsystem, as indicated in the specification, is a collection * of controllers. Any individual controller has @@ -91,13 +99,10 @@ struct spdk_nvmf_subsystem { enum spdk_nvmf_subtype subtype; bool is_removed; - struct { - char sn[MAX_SN_LEN + 1]; - struct spdk_bdev *ns_list[MAX_VIRTUAL_NAMESPACE]; - struct spdk_bdev_desc *desc[MAX_VIRTUAL_NAMESPACE]; - struct spdk_io_channel *ch[MAX_VIRTUAL_NAMESPACE]; - uint32_t max_nsid; - } dev; + char sn[MAX_SN_LEN + 1]; + + struct spdk_nvmf_ns ns[MAX_VIRTUAL_NAMESPACE]; + uint32_t max_nsid; void *cb_ctx; spdk_nvmf_subsystem_connect_fn connect_cb; @@ -157,6 +162,50 @@ void spdk_nvmf_subsystem_poll(struct spdk_nvmf_subsystem *subsystem); uint32_t spdk_nvmf_subsystem_add_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_bdev *bdev, uint32_t nsid); +/** + * Return the first allocated namespace in a subsystem. + * + * \param subsystem Subsystem to query. + * \return First allocated namespace in this subsystem, or NULL if this subsystem has no namespaces. + */ +struct spdk_nvmf_ns *spdk_nvmf_subsystem_get_first_ns(struct spdk_nvmf_subsystem *subsystem); + +/** + * Return the next allocated namespace in a subsystem. + * + * \param subsystem Subsystem to query. + * \param prev_ns Previous ns returned from this function. + * \return Next allocated namespace in this subsystem, or NULL if prev_ns was the last namespace. + */ +struct spdk_nvmf_ns *spdk_nvmf_subsystem_get_next_ns(struct spdk_nvmf_subsystem *subsystem, + struct spdk_nvmf_ns *prev_ns); + +/** + * Get a namespace in a subsystem by NSID. + * + * \param subsystem Subsystem to search. + * \param nsid Namespace ID to find. + * \return Namespace matching nsid, or NULL if nsid was not found. + */ +struct spdk_nvmf_ns *spdk_nvmf_subsystem_get_ns(struct spdk_nvmf_subsystem *subsystem, + uint32_t nsid); + +/** + * Get a namespace's NSID. + * + * \param ns Namespace to query. + * \return NSID of ns. + */ +uint32_t spdk_nvmf_ns_get_id(const struct spdk_nvmf_ns *ns); + +/** + * Get a namespace's associated bdev. + * + * \param ns Namespace to query + * \return Backing bdev of ns. + */ +struct spdk_bdev *spdk_nvmf_ns_get_bdev(struct spdk_nvmf_ns *ns); + const char *spdk_nvmf_subsystem_get_sn(const struct spdk_nvmf_subsystem *subsystem); int spdk_nvmf_subsystem_set_sn(struct spdk_nvmf_subsystem *subsystem, const char *sn); diff --git a/lib/nvmf/ctrlr.c b/lib/nvmf/ctrlr.c index 1a77910bd..a7bf7f38d 100644 --- a/lib/nvmf/ctrlr.c +++ b/lib/nvmf/ctrlr.c @@ -845,22 +845,16 @@ spdk_nvmf_ctrlr_identify_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_nvme_cpl *rsp, struct spdk_nvme_ns_data *nsdata) { - struct spdk_bdev *bdev; + struct spdk_nvmf_ns *ns; - if (cmd->nsid > subsystem->dev.max_nsid || cmd->nsid == 0) { + ns = _spdk_nvmf_subsystem_get_ns(subsystem, cmd->nsid); + if (ns == NULL || ns->bdev == NULL) { SPDK_ERRLOG("Identify Namespace for invalid NSID %u\n", cmd->nsid); rsp->status.sc = SPDK_NVME_SC_INVALID_NAMESPACE_OR_FORMAT; return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; } - bdev = subsystem->dev.ns_list[cmd->nsid - 1]; - - if (bdev == NULL) { - memset(nsdata, 0, sizeof(*nsdata)); - return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; - } - - return spdk_nvmf_bdev_ctrlr_identify_ns(bdev, nsdata); + return spdk_nvmf_bdev_ctrlr_identify_ns(ns->bdev, nsdata); } static int @@ -906,7 +900,7 @@ spdk_nvmf_ctrlr_identify_ctrlr(struct spdk_nvmf_ctrlr *ctrlr, struct spdk_nvme_c cdata->sqes.max = 6; cdata->cqes.min = 4; cdata->cqes.max = 4; - cdata->nn = subsystem->dev.max_nsid; + cdata->nn = subsystem->max_nsid; cdata->vwc.present = 1; cdata->nvmf_specific.ioccsz = sizeof(struct spdk_nvme_cmd) / 16; @@ -941,7 +935,8 @@ spdk_nvmf_ctrlr_identify_active_ns_list(struct spdk_nvmf_subsystem *subsystem, struct spdk_nvme_cpl *rsp, struct spdk_nvme_ns_list *ns_list) { - uint32_t i, num_ns, count = 0; + struct spdk_nvmf_ns *ns; + uint32_t count = 0; if (cmd->nsid >= 0xfffffffeUL) { SPDK_ERRLOG("Identify Active Namespace List with invalid NSID %u\n", cmd->nsid); @@ -949,16 +944,13 @@ spdk_nvmf_ctrlr_identify_active_ns_list(struct spdk_nvmf_subsystem *subsystem, return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; } - num_ns = subsystem->dev.max_nsid; + for (ns = spdk_nvmf_subsystem_get_first_ns(subsystem); ns != NULL; + ns = spdk_nvmf_subsystem_get_next_ns(subsystem, ns)) { + if (ns->id <= cmd->nsid) { + continue; + } - for (i = 1; i <= num_ns; i++) { - if (i <= cmd->nsid) { - continue; - } - if (subsystem->dev.ns_list[i - 1] == NULL) { - continue; - } - ns_list->ns_list[count++] = i; + ns_list->ns_list[count++] = ns->id; if (count == SPDK_COUNTOF(ns_list->ns_list)) { break; } diff --git a/lib/nvmf/ctrlr_bdev.c b/lib/nvmf/ctrlr_bdev.c index ef647eb28..aa129d419 100644 --- a/lib/nvmf/ctrlr_bdev.c +++ b/lib/nvmf/ctrlr_bdev.c @@ -61,25 +61,26 @@ struct __attribute__((packed)) nvme_read_cdw12 { bool spdk_nvmf_ctrlr_dsm_supported(struct spdk_nvmf_ctrlr *ctrlr) { - uint32_t i; + struct spdk_nvmf_subsystem *subsystem = ctrlr->subsys; + struct spdk_nvmf_ns *ns; - for (i = 0; i < ctrlr->subsys->dev.max_nsid; i++) { - struct spdk_bdev *bdev = ctrlr->subsys->dev.ns_list[i]; - - if (bdev == NULL) { + for (ns = spdk_nvmf_subsystem_get_first_ns(subsystem); ns != NULL; + ns = spdk_nvmf_subsystem_get_next_ns(subsystem, ns)) { + if (ns->bdev == NULL) { continue; } - if (!spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_UNMAP)) { + if (!spdk_bdev_io_type_supported(ns->bdev, SPDK_BDEV_IO_TYPE_UNMAP)) { SPDK_TRACELOG(SPDK_TRACE_NVMF, - "Subsystem%u Namespace %s does not support unmap - not enabling DSM\n", - i, spdk_bdev_get_name(bdev)); + "Subsystem %s namespace %u (%s) does not support unmap - not enabling DSM\n", + spdk_nvmf_subsystem_get_nqn(subsystem), + ns->id, spdk_bdev_get_name(ns->bdev)); return false; } } SPDK_TRACELOG(SPDK_TRACE_NVMF, "All devices in Subsystem %s support unmap - enabling DSM\n", - spdk_nvmf_subsystem_get_nqn(ctrlr->subsys)); + spdk_nvmf_subsystem_get_nqn(subsystem)); return true; } @@ -296,6 +297,7 @@ int spdk_nvmf_ctrlr_process_io_cmd(struct spdk_nvmf_request *req) { uint32_t nsid; + struct spdk_nvmf_ns *ns; struct spdk_bdev *bdev; struct spdk_bdev_desc *desc; struct spdk_io_channel *ch; @@ -307,20 +309,16 @@ spdk_nvmf_ctrlr_process_io_cmd(struct spdk_nvmf_request *req) response->status.sc = SPDK_NVME_SC_SUCCESS; nsid = cmd->nsid; - if (nsid > subsystem->dev.max_nsid || nsid == 0) { + ns = _spdk_nvmf_subsystem_get_ns(subsystem, nsid); + if (ns == NULL || ns->bdev == NULL) { SPDK_ERRLOG("Unsuccessful query for nsid %u\n", cmd->nsid); response->status.sc = SPDK_NVME_SC_INVALID_NAMESPACE_OR_FORMAT; return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; } - bdev = subsystem->dev.ns_list[nsid - 1]; - if (bdev == NULL) { - response->status.sc = SPDK_NVME_SC_INVALID_NAMESPACE_OR_FORMAT; - return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; - } - - desc = subsystem->dev.desc[nsid - 1]; - ch = subsystem->dev.ch[nsid - 1]; + bdev = ns->bdev; + desc = ns->desc; + ch = ns->ch; switch (cmd->opc) { case SPDK_NVME_OPC_READ: case SPDK_NVME_OPC_WRITE: @@ -334,25 +332,50 @@ spdk_nvmf_ctrlr_process_io_cmd(struct spdk_nvmf_request *req) } } +static int +spdk_nvmf_ns_bdev_attach(struct spdk_nvmf_ns *ns) +{ + if (ns->bdev == NULL) { + return 0; + } + + ns->ch = spdk_bdev_get_io_channel(ns->desc); + if (ns->ch == NULL) { + SPDK_ERRLOG("io_channel allocation failed\n"); + return -1; + } + + return 0; +} + +static void +spdk_nvmf_ns_bdev_detach(struct spdk_nvmf_ns *ns) +{ + if (ns->bdev == NULL) { + return; + } + + if (ns->ch) { + spdk_put_io_channel(ns->ch); + ns->ch = NULL; + } + if (ns->desc) { + spdk_bdev_close(ns->desc); + ns->desc = NULL; + } + ns->bdev = NULL; +} + int spdk_nvmf_subsystem_bdev_attach(struct spdk_nvmf_subsystem *subsystem) { - struct spdk_bdev *bdev; - struct spdk_io_channel *ch; - uint32_t i; + struct spdk_nvmf_ns *ns; - for (i = 0; i < subsystem->dev.max_nsid; i++) { - bdev = subsystem->dev.ns_list[i]; - if (bdev == NULL) { - continue; - } - - ch = spdk_bdev_get_io_channel(subsystem->dev.desc[i]); - if (ch == NULL) { - SPDK_ERRLOG("io_channel allocation failed\n"); + for (ns = spdk_nvmf_subsystem_get_first_ns(subsystem); ns != NULL; + ns = spdk_nvmf_subsystem_get_next_ns(subsystem, ns)) { + if (spdk_nvmf_ns_bdev_attach(ns)) { return -1; } - subsystem->dev.ch[i] = ch; } return 0; @@ -361,20 +384,11 @@ spdk_nvmf_subsystem_bdev_attach(struct spdk_nvmf_subsystem *subsystem) void spdk_nvmf_subsystem_bdev_detach(struct spdk_nvmf_subsystem *subsystem) { - uint32_t i; + struct spdk_nvmf_ns *ns; - for (i = 0; i < subsystem->dev.max_nsid; i++) { - if (subsystem->dev.ns_list[i]) { - if (subsystem->dev.ch[i]) { - spdk_put_io_channel(subsystem->dev.ch[i]); - subsystem->dev.ch[i] = NULL; - } - if (subsystem->dev.desc[i]) { - spdk_bdev_close(subsystem->dev.desc[i]); - subsystem->dev.desc[i] = NULL; - } - subsystem->dev.ns_list[i] = NULL; - } + for (ns = spdk_nvmf_subsystem_get_first_ns(subsystem); ns != NULL; + ns = spdk_nvmf_subsystem_get_next_ns(subsystem, ns)) { + spdk_nvmf_ns_bdev_detach(ns); } - subsystem->dev.max_nsid = 0; + subsystem->max_nsid = 0; } diff --git a/lib/nvmf/nvmf_internal.h b/lib/nvmf/nvmf_internal.h index 85e40e8c3..1aaa8c3a6 100644 --- a/lib/nvmf/nvmf_internal.h +++ b/lib/nvmf/nvmf_internal.h @@ -36,6 +36,7 @@ #include "spdk/stdinc.h" +#include "spdk/likely.h" #include "spdk/nvmf.h" #include "spdk/nvmf_spec.h" #include "spdk/assert.h" @@ -71,6 +72,24 @@ void spdk_nvmf_listen_addr_destroy(struct spdk_nvmf_listen_addr *addr); struct spdk_nvmf_transport *spdk_nvmf_tgt_get_transport(struct spdk_nvmf_tgt *tgt, enum spdk_nvme_transport_type); +static inline struct spdk_nvmf_ns * +_spdk_nvmf_subsystem_get_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t nsid) +{ + struct spdk_nvmf_ns *ns; + + /* NOTE: This implicitly also checks for 0, since 0 - 1 wraps around to UINT32_MAX. */ + if (spdk_unlikely(nsid - 1 >= subsystem->max_nsid)) { + return NULL; + } + + ns = &subsystem->ns[nsid - 1]; + if (!ns->allocated) { + return NULL; + } + + return ns; +} + #define OBJECT_NVMF_IO 0x30 #define TRACE_GROUP_NVMF 0x3 diff --git a/lib/nvmf/subsystem.c b/lib/nvmf/subsystem.c index ae5830614..0c95dadb3 100644 --- a/lib/nvmf/subsystem.c +++ b/lib/nvmf/subsystem.c @@ -38,6 +38,7 @@ #include "subsystem.h" #include "transport.h" +#include "spdk/likely.h" #include "spdk/string.h" #include "spdk/trace.h" #include "spdk/nvmf_spec.h" @@ -361,13 +362,14 @@ uint32_t spdk_nvmf_subsystem_add_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_bdev *bdev, uint32_t nsid) { + struct spdk_nvmf_ns *ns; uint32_t i; int rc; if (nsid == 0) { /* NSID not specified - find a free index */ for (i = 0; i < MAX_VIRTUAL_NAMESPACE; i++) { - if (subsystem->dev.ns_list[i] == NULL) { + if (_spdk_nvmf_subsystem_get_ns(subsystem, i + 1) == NULL) { nsid = i + 1; break; } @@ -384,34 +386,93 @@ spdk_nvmf_subsystem_add_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_bd return 0; } - if (subsystem->dev.ns_list[i]) { + if (_spdk_nvmf_subsystem_get_ns(subsystem, nsid)) { SPDK_ERRLOG("Requested NSID %" PRIu32 " already in use\n", nsid); return 0; } } - rc = spdk_bdev_open(bdev, true, spdk_nvmf_ctrlr_hot_remove, subsystem, - &subsystem->dev.desc[i]); + ns = &subsystem->ns[i]; + memset(ns, 0, sizeof(*ns)); + ns->bdev = bdev; + ns->id = nsid; + rc = spdk_bdev_open(bdev, true, spdk_nvmf_ctrlr_hot_remove, subsystem, &ns->desc); if (rc != 0) { SPDK_ERRLOG("Subsystem %s: bdev %s cannot be opened, error=%d\n", subsystem->subnqn, spdk_bdev_get_name(bdev), rc); return 0; } + ns->allocated = true; SPDK_TRACELOG(SPDK_TRACE_NVMF, "Subsystem %s: bdev %s assigned nsid %" PRIu32 "\n", spdk_nvmf_subsystem_get_nqn(subsystem), spdk_bdev_get_name(bdev), nsid); - subsystem->dev.ns_list[i] = bdev; - subsystem->dev.max_nsid = spdk_max(subsystem->dev.max_nsid, nsid); + subsystem->max_nsid = spdk_max(subsystem->max_nsid, nsid); return nsid; } +static uint32_t +spdk_nvmf_subsystem_get_next_allocated_nsid(struct spdk_nvmf_subsystem *subsystem, + uint32_t prev_nsid) +{ + uint32_t nsid; + + if (prev_nsid >= subsystem->max_nsid) { + return 0; + } + + for (nsid = prev_nsid + 1; nsid <= subsystem->max_nsid; nsid++) { + if (subsystem->ns[nsid - 1].allocated) { + return nsid; + } + } + + return 0; +} + +struct spdk_nvmf_ns * +spdk_nvmf_subsystem_get_first_ns(struct spdk_nvmf_subsystem *subsystem) +{ + uint32_t first_nsid; + + first_nsid = spdk_nvmf_subsystem_get_next_allocated_nsid(subsystem, 0); + return _spdk_nvmf_subsystem_get_ns(subsystem, first_nsid); +} + +struct spdk_nvmf_ns * +spdk_nvmf_subsystem_get_next_ns(struct spdk_nvmf_subsystem *subsystem, + struct spdk_nvmf_ns *prev_ns) +{ + uint32_t next_nsid; + + next_nsid = spdk_nvmf_subsystem_get_next_allocated_nsid(subsystem, prev_ns->id); + return _spdk_nvmf_subsystem_get_ns(subsystem, next_nsid); +} + +struct spdk_nvmf_ns * +spdk_nvmf_subsystem_get_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t nsid) +{ + return _spdk_nvmf_subsystem_get_ns(subsystem, nsid); +} + +uint32_t +spdk_nvmf_ns_get_id(const struct spdk_nvmf_ns *ns) +{ + return ns->id; +} + +struct spdk_bdev * +spdk_nvmf_ns_get_bdev(struct spdk_nvmf_ns *ns) +{ + return ns->bdev; +} + const char * spdk_nvmf_subsystem_get_sn(const struct spdk_nvmf_subsystem *subsystem) { - return subsystem->dev.sn; + return subsystem->sn; } int @@ -419,7 +480,7 @@ spdk_nvmf_subsystem_set_sn(struct spdk_nvmf_subsystem *subsystem, const char *sn { size_t len, max_len; - max_len = sizeof(subsystem->dev.sn) - 1; + max_len = sizeof(subsystem->sn) - 1; len = strlen(sn); if (len > max_len) { SPDK_TRACELOG(SPDK_TRACE_NVMF, "Invalid sn \"%s\": length %zu > max %zu\n", @@ -427,7 +488,7 @@ spdk_nvmf_subsystem_set_sn(struct spdk_nvmf_subsystem *subsystem, const char *sn return -1; } - snprintf(subsystem->dev.sn, sizeof(subsystem->dev.sn), "%s", sn); + snprintf(subsystem->sn, sizeof(subsystem->sn), "%s", sn); return 0; } diff --git a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c index a22879fee..ebe99afb3 100644 --- a/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c +++ b/test/unit/lib/nvmf/ctrlr.c/ctrlr_ut.c @@ -102,6 +102,27 @@ spdk_nvmf_subsystem_get_sn(const struct spdk_nvmf_subsystem *subsystem) return NULL; } +struct spdk_nvmf_ns * +spdk_nvmf_subsystem_get_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t nsid) +{ + abort(); + return NULL; +} + +struct spdk_nvmf_ns * +spdk_nvmf_subsystem_get_first_ns(struct spdk_nvmf_subsystem *subsystem) +{ + abort(); + return NULL; +} + +struct spdk_nvmf_ns * +spdk_nvmf_subsystem_get_next_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_nvmf_ns *prev_ns) +{ + abort(); + return NULL; +} + bool spdk_nvmf_ctrlr_dsm_supported(struct spdk_nvmf_ctrlr *ctrlr) { diff --git a/test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c b/test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c index 897e43f12..b18a956d3 100644 --- a/test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c +++ b/test/unit/lib/nvmf/ctrlr_bdev.c/ctrlr_bdev_ut.c @@ -150,6 +150,27 @@ const char *spdk_nvmf_subsystem_get_nqn(struct spdk_nvmf_subsystem *subsystem) return NULL; } +struct spdk_nvmf_ns * +spdk_nvmf_subsystem_get_ns(struct spdk_nvmf_subsystem *subsystem, uint32_t nsid) +{ + abort(); + return NULL; +} + +struct spdk_nvmf_ns * +spdk_nvmf_subsystem_get_first_ns(struct spdk_nvmf_subsystem *subsystem) +{ + abort(); + return NULL; +} + +struct spdk_nvmf_ns * +spdk_nvmf_subsystem_get_next_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_nvmf_ns *prev_ns) +{ + abort(); + return NULL; +} + void spdk_bdev_io_get_nvme_status(const struct spdk_bdev_io *bdev_io, int *sct, int *sc) { } diff --git a/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c b/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c index 982c7dbcf..cdeda37d6 100644 --- a/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c +++ b/test/unit/lib/nvmf/subsystem.c/subsystem_ut.c @@ -212,8 +212,8 @@ static void test_spdk_nvmf_subsystem_add_ns(void) { struct spdk_nvmf_subsystem subsystem = { - .dev.max_nsid = 0, - .dev.ns_list = {}, + .max_nsid = 0, + .ns = {}, }; struct spdk_bdev bdev1 = {}, bdev2 = {}; uint32_t nsid; @@ -222,19 +222,19 @@ test_spdk_nvmf_subsystem_add_ns(void) nsid = spdk_nvmf_subsystem_add_ns(&subsystem, &bdev1, 0); /* NSID 1 is the first unused ID */ CU_ASSERT(nsid == 1); - CU_ASSERT(subsystem.dev.max_nsid == 1); - CU_ASSERT(subsystem.dev.ns_list[nsid - 1] == &bdev1); + CU_ASSERT(subsystem.max_nsid == 1); + CU_ASSERT(subsystem.ns[nsid - 1].bdev == &bdev1); /* Request a specific NSID */ nsid = spdk_nvmf_subsystem_add_ns(&subsystem, &bdev2, 5); CU_ASSERT(nsid == 5); - CU_ASSERT(subsystem.dev.max_nsid == 5); - CU_ASSERT(subsystem.dev.ns_list[nsid - 1] == &bdev2); + CU_ASSERT(subsystem.max_nsid == 5); + CU_ASSERT(subsystem.ns[nsid - 1].bdev == &bdev2); /* Request an NSID that is already in use */ nsid = spdk_nvmf_subsystem_add_ns(&subsystem, &bdev2, 5); CU_ASSERT(nsid == 0); - CU_ASSERT(subsystem.dev.max_nsid == 5); + CU_ASSERT(subsystem.max_nsid == 5); } static void