diff --git a/include/spdk/nvme.h b/include/spdk/nvme.h index 1f4e0c6fe..db9797d1b 100644 --- a/include/spdk/nvme.h +++ b/include/spdk/nvme.h @@ -2639,6 +2639,15 @@ enum spdk_nvme_dealloc_logical_block_read_value spdk_nvme_ns_get_dealloc_logical */ uint32_t spdk_nvme_ns_get_optimal_io_boundary(struct spdk_nvme_ns *ns); +/** + * Get the NGUID for the given namespace. + * + * \param ns Namespace to query. + * + * \return a pointer to namespace NGUID, or NULL if ns does not have a NGUID. + */ +const uint8_t *spdk_nvme_ns_get_nguid(const struct spdk_nvme_ns *ns); + /** * Get the UUID for the given namespace. * diff --git a/lib/nvme/nvme_ns.c b/lib/nvme/nvme_ns.c index 21bab4b74..c4dd2b279 100644 --- a/lib/nvme/nvme_ns.c +++ b/lib/nvme/nvme_ns.c @@ -406,6 +406,22 @@ nvme_ns_find_id_desc(const struct spdk_nvme_ns *ns, enum spdk_nvme_nidt type, si return NULL; } +const uint8_t * +spdk_nvme_ns_get_nguid(const struct spdk_nvme_ns *ns) +{ + const uint8_t *nguid; + size_t size; + + nguid = nvme_ns_find_id_desc(ns, SPDK_NVME_NIDT_NGUID, &size); + if (nguid && size != sizeof(((struct spdk_nvme_ns_data *)0)->nguid)) { + SPDK_WARNLOG("Invalid NIDT_NGUID descriptor length reported: %zu (expected: %zu)\n", + size, sizeof(((struct spdk_nvme_ns_data *)0)->nguid)); + return NULL; + } + + return nguid; +} + const struct spdk_uuid * spdk_nvme_ns_get_uuid(const struct spdk_nvme_ns *ns) { diff --git a/lib/nvme/spdk_nvme.map b/lib/nvme/spdk_nvme.map index eb4feddbd..0b5bc5cb0 100644 --- a/lib/nvme/spdk_nvme.map +++ b/lib/nvme/spdk_nvme.map @@ -124,6 +124,7 @@ spdk_nvme_ns_supports_compare; spdk_nvme_ns_get_dealloc_logical_block_read_value; spdk_nvme_ns_get_optimal_io_boundary; + spdk_nvme_ns_get_nguid; spdk_nvme_ns_get_uuid; spdk_nvme_ns_get_csi; spdk_nvme_ns_get_flags;