From 81db062c5211dbb885141f89fc8fee312c75c3e6 Mon Sep 17 00:00:00 2001 From: Changpeng Liu Date: Thu, 24 Dec 2015 10:34:38 +0800 Subject: [PATCH] nvme: fix wrong type of the deallocate function parameter According to the specification, the dataset management for deallocate attribute can support to 256 ranges, so we should use uint16_t instead of uint8_t as the ranges parameter. Change-Id: Ibacc00da8b4b9e2b2f3454d382aadf7ad353ff31 Signed-off-by: Changpeng Liu Signed-off-by: Daniel Verkamp --- include/spdk/nvme.h | 5 +++-- include/spdk/nvme_spec.h | 6 ++++++ lib/nvme/nvme_ns_cmd.c | 4 ++-- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/include/spdk/nvme.h b/include/spdk/nvme.h index 4b1dbf66ad..0695964f41 100644 --- a/include/spdk/nvme.h +++ b/include/spdk/nvme.h @@ -324,7 +324,8 @@ int nvme_ns_cmd_read(struct nvme_namespace *ns, void *payload, * \param ns NVMe namespace to submit the deallocation request * \param payload virtual address pointer to the list of LBA ranges to * deallocate - * \param num_ranges number of ranges in the list pointed to by payload + * \param num_ranges number of ranges in the list pointed to by payload; must be + * between 1 and \ref NVME_DATASET_MANAGEMENT_MAX_RANGES, inclusive. * \param cb_fn callback function to invoke when the I/O is completed * \param cb_arg argument to pass to the callback function * @@ -335,7 +336,7 @@ int nvme_ns_cmd_read(struct nvme_namespace *ns, void *payload, * nvme_register_io_thread(). */ int nvme_ns_cmd_deallocate(struct nvme_namespace *ns, void *payload, - uint8_t num_ranges, nvme_cb_fn_t cb_fn, + uint16_t num_ranges, nvme_cb_fn_t cb_fn, void *cb_arg); /** diff --git a/include/spdk/nvme_spec.h b/include/spdk/nvme_spec.h index 99f49e3170..9bd5ff3851 100644 --- a/include/spdk/nvme_spec.h +++ b/include/spdk/nvme_spec.h @@ -59,6 +59,12 @@ #define NVME_MAX_IO_QUEUES (1 << 16) +/** + * Indicates the maximum number of range sets that may be specified + * in the dataset mangement command. + */ +#define NVME_DATASET_MANAGEMENT_MAX_RANGES 256 + union nvme_cap_lo_register { uint32_t raw; struct { diff --git a/lib/nvme/nvme_ns_cmd.c b/lib/nvme/nvme_ns_cmd.c index 7e94878dde..069e2880cc 100644 --- a/lib/nvme/nvme_ns_cmd.c +++ b/lib/nvme/nvme_ns_cmd.c @@ -196,12 +196,12 @@ nvme_ns_cmd_write(struct nvme_namespace *ns, void *payload, uint64_t lba, int nvme_ns_cmd_deallocate(struct nvme_namespace *ns, void *payload, - uint8_t num_ranges, nvme_cb_fn_t cb_fn, void *cb_arg) + uint16_t num_ranges, nvme_cb_fn_t cb_fn, void *cb_arg) { struct nvme_request *req; struct nvme_command *cmd; - if (num_ranges == 0) { + if (num_ranges == 0 || num_ranges > NVME_DATASET_MANAGEMENT_MAX_RANGES) { return EINVAL; }