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/nvme.h"
|
||||||
#include "spdk/nvmf_spec.h"
|
#include "spdk/nvmf_spec.h"
|
||||||
#include "spdk/queue.h"
|
#include "spdk/queue.h"
|
||||||
|
#include "spdk/uuid.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
@ -454,6 +455,13 @@ struct spdk_nvmf_ns_opts {
|
|||||||
* Fill with 0s if not specified.
|
* Fill with 0s if not specified.
|
||||||
*/
|
*/
|
||||||
uint8_t eui64[8];
|
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));
|
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_object_end(w);
|
||||||
}
|
}
|
||||||
spdk_json_write_array_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;
|
return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define ADD_ID_DESC(type, data) \
|
#define ADD_ID_DESC(type, data, size) \
|
||||||
do { \
|
do { \
|
||||||
if (!spdk_mem_all_zero(data, sizeof(data))) { \
|
if (!spdk_mem_all_zero(data, size)) { \
|
||||||
_add_ns_id_desc(&buf_ptr, &buf_remain, type, data, sizeof(data)); \
|
_add_ns_id_desc(&buf_ptr, &buf_remain, type, data, size); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
ADD_ID_DESC(SPDK_NVME_NIDT_EUI64, ns->opts.eui64);
|
ADD_ID_DESC(SPDK_NVME_NIDT_EUI64, ns->opts.eui64, sizeof(ns->opts.eui64));
|
||||||
ADD_ID_DESC(SPDK_NVME_NIDT_NGUID, ns->opts.nguid);
|
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
|
* 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));
|
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) {
|
if (opts.nsid == SPDK_NVME_GLOBAL_NS_TAG) {
|
||||||
SPDK_ERRLOG("Invalid NSID %" PRIu32 "\n", opts.nsid);
|
SPDK_ERRLOG("Invalid NSID %" PRIu32 "\n", opts.nsid);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -635,6 +635,31 @@ test_get_ns_id_desc_list(void)
|
|||||||
CU_ASSERT(buf[16] == 0x22);
|
CU_ASSERT(buf[16] == 0x22);
|
||||||
CU_ASSERT(buf[31] == 0xEE);
|
CU_ASSERT(buf[31] == 0xEE);
|
||||||
CU_ASSERT(buf[33] == 0);
|
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)
|
int main(int argc, char **argv)
|
||||||
|
@ -76,6 +76,12 @@ spdk_bdev_get_name(const struct spdk_bdev *bdev)
|
|||||||
return "test";
|
return "test";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const struct spdk_uuid *
|
||||||
|
spdk_bdev_get_uuid(const struct spdk_bdev *bdev)
|
||||||
|
{
|
||||||
|
return &bdev->uuid;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport,
|
spdk_nvmf_transport_listen(struct spdk_nvmf_transport *transport,
|
||||||
const struct spdk_nvme_transport_id *trid)
|
const struct spdk_nvme_transport_id *trid)
|
||||||
|
@ -201,6 +201,12 @@ spdk_bdev_get_name(const struct spdk_bdev *bdev)
|
|||||||
return "test";
|
return "test";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const struct spdk_uuid *
|
||||||
|
spdk_bdev_get_uuid(const struct spdk_bdev *bdev)
|
||||||
|
{
|
||||||
|
return &bdev->uuid;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
test_spdk_nvmf_subsystem_add_ns(void)
|
test_spdk_nvmf_subsystem_add_ns(void)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user