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:
Daniel Verkamp 2018-02-21 17:09:56 -07:00
parent 0bc4207ece
commit a05f88ff34
7 changed files with 63 additions and 5 deletions

View File

@ -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;
};
/**

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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)

View File

@ -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)

View File

@ -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)
{