diff --git a/include/spdk/nvme_zns.h b/include/spdk/nvme_zns.h index 9ee02fa33..8624f1f7d 100644 --- a/include/spdk/nvme_zns.h +++ b/include/spdk/nvme_zns.h @@ -98,6 +98,15 @@ uint64_t spdk_nvme_zns_ns_get_num_zones(struct spdk_nvme_ns *ns); */ const struct spdk_nvme_zns_ctrlr_data *spdk_nvme_zns_ctrlr_get_data(struct spdk_nvme_ctrlr *ctrlr); +/** + * Get the maximum zone append data transfer size of a given NVMe controller. + * + * \param ctrlr Opaque handle to NVMe controller. + * + * \return Maximum zone append data transfer size of the NVMe controller in bytes. + */ +uint32_t spdk_nvme_zns_ctrlr_get_max_zone_append_size(const struct spdk_nvme_ctrlr *ctrlr); + /** * Submit a Close Zone operation to the specified NVMe namespace. * diff --git a/lib/nvme/Makefile b/lib/nvme/Makefile index a468d4078..776de0b0d 100644 --- a/lib/nvme/Makefile +++ b/lib/nvme/Makefile @@ -35,7 +35,7 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..) include $(SPDK_ROOT_DIR)/mk/spdk.common.mk SO_VER := 4 -SO_MINOR := 1 +SO_MINOR := 2 C_SRCS = nvme_ctrlr_cmd.c nvme_ctrlr.c nvme_fabric.c nvme_ns_cmd.c nvme_ns.c nvme_pcie.c nvme_qpair.c nvme.c nvme_quirks.c nvme_transport.c nvme_uevent.c nvme_ctrlr_ocssd_cmd.c \ nvme_ns_ocssd_cmd.c nvme_tcp.c nvme_opal.c nvme_io_msg.c nvme_poll_group.c nvme_zns.c diff --git a/lib/nvme/nvme_ctrlr.c b/lib/nvme/nvme_ctrlr.c index 7deeec193..fb78fca71 100644 --- a/lib/nvme/nvme_ctrlr.c +++ b/lib/nvme/nvme_ctrlr.c @@ -1667,6 +1667,14 @@ nvme_ctrlr_identify_zns_specific_done(void *arg, const struct spdk_nvme_cpl *cpl return; } + /* A zero zasl value means use mdts */ + if (ctrlr->cdata_zns->zasl) { + uint32_t max_append = ctrlr->min_page_size * (1 << ctrlr->cdata_zns->zasl); + ctrlr->max_zone_append_size = spdk_min(ctrlr->max_xfer_size, max_append); + } else { + ctrlr->max_zone_append_size = ctrlr->max_xfer_size; + } + nvme_ctrlr_set_state(ctrlr, NVME_CTRLR_STATE_GET_ZNS_CMD_EFFECTS_LOG, ctrlr->opts.admin_timeout_ms); } diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index eca1c05fb..c57bf85e8 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -848,6 +848,9 @@ struct spdk_nvme_ctrlr { /* scratchpad pointer that can be used to send data between two NVME_CTRLR_STATEs */ void *tmp_ptr; + + /* maximum zone append size in bytes */ + uint32_t max_zone_append_size; }; struct spdk_nvme_probe_ctx { diff --git a/lib/nvme/nvme_zns.c b/lib/nvme/nvme_zns.c index 11818b9fd..ec68aa0f8 100644 --- a/lib/nvme/nvme_zns.c +++ b/lib/nvme/nvme_zns.c @@ -60,6 +60,12 @@ spdk_nvme_zns_ctrlr_get_data(struct spdk_nvme_ctrlr *ctrlr) return ctrlr->cdata_zns; } +uint32_t +spdk_nvme_zns_ctrlr_get_max_zone_append_size(const struct spdk_nvme_ctrlr *ctrlr) +{ + return ctrlr->max_zone_append_size; +} + static int nvme_zns_zone_mgmt_recv(struct spdk_nvme_ns *ns, struct spdk_nvme_qpair *qpair, void *payload, uint32_t payload_size, uint64_t slba, diff --git a/lib/nvme/spdk_nvme.map b/lib/nvme/spdk_nvme.map index d8b535bd7..de041cc2a 100644 --- a/lib/nvme/spdk_nvme.map +++ b/lib/nvme/spdk_nvme.map @@ -163,6 +163,7 @@ spdk_nvme_zns_ns_get_zone_size; spdk_nvme_zns_ns_get_num_zones; spdk_nvme_zns_ctrlr_get_data; + spdk_nvme_zns_ctrlr_get_max_zone_append_size; spdk_nvme_zns_close_zone; spdk_nvme_zns_finish_zone; spdk_nvme_zns_open_zone;