nvmf: retrieve namespace UUID from bdev
A new optional parameter is added to the NVMe-oF target namespace options to set the Namespace UUID, which will be reported via the Identify command Namespace Identification Descriptor list. Change-Id: I53c6d6fa6475d3395d412d196b42000715e9ed81 Signed-off-by: Daniel Verkamp <daniel.verkamp@intel.com> Reviewed-on: https://review.gerrithub.io/400894 Tested-by: SPDK Automated Test System <sys_sgsw@intel.com> Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
This commit is contained in:
parent
0bc4207ece
commit
a05f88ff34
@ -44,6 +44,7 @@
|
||||
#include "spdk/nvme.h"
|
||||
#include "spdk/nvmf_spec.h"
|
||||
#include "spdk/queue.h"
|
||||
#include "spdk/uuid.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@ -454,6 +455,13 @@ struct spdk_nvmf_ns_opts {
|
||||
* Fill with 0s if not specified.
|
||||
*/
|
||||
uint8_t eui64[8];
|
||||
|
||||
/**
|
||||
* Namespace UUID
|
||||
*
|
||||
* Fill with 0s if not specified.
|
||||
*/
|
||||
struct spdk_uuid uuid;
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -263,6 +263,14 @@ dump_nvmf_subsystem(struct spdk_json_write_ctx *w, struct spdk_nvmf_subsystem *s
|
||||
json_write_hex_str(w, ns_opts.eui64, sizeof(ns_opts.eui64));
|
||||
}
|
||||
|
||||
if (!spdk_mem_all_zero(&ns_opts.uuid, sizeof(ns_opts.uuid))) {
|
||||
char uuid_str[SPDK_UUID_STRING_LEN];
|
||||
|
||||
spdk_uuid_fmt_lower(uuid_str, sizeof(uuid_str), &ns_opts.uuid);
|
||||
spdk_json_write_name(w, "uuid");
|
||||
spdk_json_write_string(w, uuid_str);
|
||||
}
|
||||
|
||||
spdk_json_write_object_end(w);
|
||||
}
|
||||
spdk_json_write_array_end(w);
|
||||
|
@ -1073,15 +1073,16 @@ spdk_nvmf_ctrlr_identify_ns_id_descriptor_list(
|
||||
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
|
||||
}
|
||||
|
||||
#define ADD_ID_DESC(type, data) \
|
||||
#define ADD_ID_DESC(type, data, size) \
|
||||
do { \
|
||||
if (!spdk_mem_all_zero(data, sizeof(data))) { \
|
||||
_add_ns_id_desc(&buf_ptr, &buf_remain, type, data, sizeof(data)); \
|
||||
if (!spdk_mem_all_zero(data, size)) { \
|
||||
_add_ns_id_desc(&buf_ptr, &buf_remain, type, data, size); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
ADD_ID_DESC(SPDK_NVME_NIDT_EUI64, ns->opts.eui64);
|
||||
ADD_ID_DESC(SPDK_NVME_NIDT_NGUID, ns->opts.nguid);
|
||||
ADD_ID_DESC(SPDK_NVME_NIDT_EUI64, ns->opts.eui64, sizeof(ns->opts.eui64));
|
||||
ADD_ID_DESC(SPDK_NVME_NIDT_NGUID, ns->opts.nguid, sizeof(ns->opts.nguid));
|
||||
ADD_ID_DESC(SPDK_NVME_NIDT_UUID, &ns->opts.uuid, sizeof(ns->opts.uuid));
|
||||
|
||||
/*
|
||||
* The list is automatically 0-terminated because controller to host buffers in
|
||||
|
@ -885,6 +885,10 @@ spdk_nvmf_subsystem_add_ns(struct spdk_nvmf_subsystem *subsystem, struct spdk_bd
|
||||
memcpy(&opts, user_opts, spdk_min(sizeof(opts), opts_size));
|
||||
}
|
||||
|
||||
if (spdk_mem_all_zero(&opts.uuid, sizeof(opts.uuid))) {
|
||||
opts.uuid = *spdk_bdev_get_uuid(bdev);
|
||||
}
|
||||
|
||||
if (opts.nsid == SPDK_NVME_GLOBAL_NS_TAG) {
|
||||
SPDK_ERRLOG("Invalid NSID %" PRIu32 "\n", opts.nsid);
|
||||
return 0;
|
||||
|
@ -635,6 +635,31 @@ test_get_ns_id_desc_list(void)
|
||||
CU_ASSERT(buf[16] == 0x22);
|
||||
CU_ASSERT(buf[31] == 0xEE);
|
||||
CU_ASSERT(buf[33] == 0);
|
||||
|
||||
/* Valid NSID, EUI64, NGUID, and UUID defined */
|
||||
ns.opts.eui64[0] = 0x11;
|
||||
ns.opts.eui64[7] = 0xFF;
|
||||
ns.opts.nguid[0] = 0x22;
|
||||
ns.opts.nguid[15] = 0xEE;
|
||||
ns.opts.uuid.u.raw[0] = 0x33;
|
||||
ns.opts.uuid.u.raw[15] = 0xDD;
|
||||
memset(&rsp, 0, sizeof(rsp));
|
||||
CU_ASSERT(spdk_nvmf_ctrlr_process_admin_cmd(&req) == SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE);
|
||||
CU_ASSERT(rsp.nvme_cpl.status.sct == SPDK_NVME_SCT_GENERIC);
|
||||
CU_ASSERT(rsp.nvme_cpl.status.sc == SPDK_NVME_SC_SUCCESS);
|
||||
CU_ASSERT(buf[0] == SPDK_NVME_NIDT_EUI64);
|
||||
CU_ASSERT(buf[1] == 8);
|
||||
CU_ASSERT(buf[4] == 0x11);
|
||||
CU_ASSERT(buf[11] == 0xFF);
|
||||
CU_ASSERT(buf[12] == SPDK_NVME_NIDT_NGUID);
|
||||
CU_ASSERT(buf[13] == 16);
|
||||
CU_ASSERT(buf[16] == 0x22);
|
||||
CU_ASSERT(buf[31] == 0xEE);
|
||||
CU_ASSERT(buf[32] == SPDK_NVME_NIDT_UUID);
|
||||
CU_ASSERT(buf[33] == 16);
|
||||
CU_ASSERT(buf[36] == 0x33);
|
||||
CU_ASSERT(buf[51] == 0xDD);
|
||||
CU_ASSERT(buf[53] == 0);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
|
@ -76,6 +76,12 @@ spdk_bdev_get_name(const struct spdk_bdev *bdev)
|
||||
return "test";
|
||||
}
|
||||
|
||||
const struct spdk_uuid *
|
||||
spdk_bdev_get_uuid(const struct spdk_bdev *bdev)
|
||||
{
|
||||
return &bdev->uuid;
|
||||
}
|
||||
|
||||
int
|
||||
spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport,
|
||||
const struct spdk_nvme_transport_id *trid)
|
||||
|
@ -201,6 +201,12 @@ spdk_bdev_get_name(const struct spdk_bdev *bdev)
|
||||
return "test";
|
||||
}
|
||||
|
||||
const struct spdk_uuid *
|
||||
spdk_bdev_get_uuid(const struct spdk_bdev *bdev)
|
||||
{
|
||||
return &bdev->uuid;
|
||||
}
|
||||
|
||||
static void
|
||||
test_spdk_nvmf_subsystem_add_ns(void)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user