From 2aa7fa700256a3dd713beaf055db4f5d9109adea Mon Sep 17 00:00:00 2001 From: Dennis Maisenbacher Date: Thu, 15 Dec 2022 15:35:24 +0100 Subject: [PATCH] nvmf: Set required ZNS opcodes for NVMe-oF ZNS support In order to connect to a zoned SPDK NVMe-oF target the ZNS specific identify functions must be implemented and the supported ZNS opcodes must be set accordingly. Enable the zone management send and receive opcodes within the `g_cmds_and_effect_log_page`. If the backing zoned bdev supports the zone append command the `nvmf_get_cmds_and_effects_log_page` function will respect that in the returned data structure. Signed-off-by: Dennis Maisenbacher Change-Id: Id9dd22a8696aa28177cc52e1f3587e10194de910 Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16045 Reviewed-by: Jim Harris Reviewed-by: Shuhei Matsumoto Reviewed-by: Aleksey Marchuk Reviewed-by: Ben Walker Tested-by: SPDK CI Jenkins --- lib/nvmf/ctrlr.c | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/nvmf/ctrlr.c b/lib/nvmf/ctrlr.c index 541c47f56..eab00ddcc 100644 --- a/lib/nvmf/ctrlr.c +++ b/lib/nvmf/ctrlr.c @@ -2450,22 +2450,32 @@ static const struct spdk_nvme_cmds_and_effect_log_page g_cmds_and_effect_log_pag [SPDK_NVME_OPC_DATASET_MANAGEMENT] = {1, 1, 0, 0, 0, 0, 0, 0}, /* COMPARE */ [SPDK_NVME_OPC_COMPARE] = {1, 0, 0, 0, 0, 0, 0, 0}, + /* ZONE MANAGEMENT SEND */ + [SPDK_NVME_OPC_ZONE_MGMT_SEND] = {1, 1, 0, 0, 0, 0, 0, 0}, + /* ZONE MANAGEMENT RECEIVE */ + [SPDK_NVME_OPC_ZONE_MGMT_RECV] = {1, 0, 0, 0, 0, 0, 0, 0}, }, }; static void -nvmf_get_cmds_and_effects_log_page(struct iovec *iovs, int iovcnt, +nvmf_get_cmds_and_effects_log_page(struct spdk_nvmf_ctrlr *ctrlr, struct iovec *iovs, int iovcnt, uint64_t offset, uint32_t length) { uint32_t page_size = sizeof(struct spdk_nvme_cmds_and_effect_log_page); size_t copy_len = 0; struct copy_iovs_ctx copy_ctx; + struct spdk_nvme_cmds_and_effect_log_page cmds_and_effect_log_page = g_cmds_and_effect_log_page; + struct spdk_nvme_cmds_and_effect_entry csupp_and_lbcc_effect_entry = {1, 1, 0, 0, 0, 0, 0, 0}; _init_copy_iovs_ctx(©_ctx, iovs, iovcnt); if (offset < page_size) { + if (ctrlr->subsys->zone_append_supported) { + cmds_and_effect_log_page.io_cmds_supported[SPDK_NVME_OPC_ZONE_APPEND] = + csupp_and_lbcc_effect_entry; + } copy_len = spdk_min(page_size - offset, length); - _copy_buf_to_iovs(©_ctx, (char *)(&g_cmds_and_effect_log_page) + offset, copy_len); + _copy_buf_to_iovs(©_ctx, (char *)(&cmds_and_effect_log_page) + offset, copy_len); } } @@ -2603,7 +2613,7 @@ nvmf_ctrlr_get_log_page(struct spdk_nvmf_request *req) goto invalid_log_page; } case SPDK_NVME_LOG_COMMAND_EFFECTS_LOG: - nvmf_get_cmds_and_effects_log_page(req->iov, req->iovcnt, offset, len); + nvmf_get_cmds_and_effects_log_page(ctrlr, req->iov, req->iovcnt, offset, len); return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; case SPDK_NVME_LOG_CHANGED_NS_LIST: nvmf_get_changed_ns_list_log_page(ctrlr, req->iov, req->iovcnt, offset, len, rae);