diff --git a/CHANGELOG.md b/CHANGELOG.md index 5539e8ae9..dccaffc38 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## v18.10: (Upcoming Release) +### nvme + +spdk_nvme_ns_get_extended_sector_size() was added. This function includes +the metadata size per sector (if any). spdk_nvme_ns_get_sector_size() still +returns only the data size per sector, not including metadata. + ## v18.07: ### bdev diff --git a/include/spdk/nvme.h b/include/spdk/nvme.h index 10f333416..e65142035 100644 --- a/include/spdk/nvme.h +++ b/include/spdk/nvme.h @@ -1290,6 +1290,9 @@ uint32_t spdk_nvme_ns_get_max_io_xfer_size(struct spdk_nvme_ns *ns); /** * Get the sector size, in bytes, of the given namespace. * + * This function returns the size of the data sector only. It does not + * include metadata size. + * * This function is thread safe and can be called at any point while the controller * is attached to the SPDK NVMe driver. * @@ -1299,6 +1302,20 @@ uint32_t spdk_nvme_ns_get_max_io_xfer_size(struct spdk_nvme_ns *ns); */ uint32_t spdk_nvme_ns_get_sector_size(struct spdk_nvme_ns *ns); +/** + * Get the extended sector size, in bytes, of the given namespace. + * + * This function returns the size of the data sector plus metadata. + * + * This function is thread safe and can be called at any point while the controller + * is attached to the SPDK NVMe driver. + * + * \param ns Namespace to query. + * + * /return the extended sector size in bytes. + */ +uint32_t spdk_nvme_ns_get_extended_sector_size(struct spdk_nvme_ns *ns); + /** * Get the number of sectors for the given namespace. * diff --git a/lib/bdev/nvme/bdev_nvme.c b/lib/bdev/nvme/bdev_nvme.c index a5099af46..33a5191c5 100644 --- a/lib/bdev/nvme/bdev_nvme.c +++ b/lib/bdev/nvme/bdev_nvme.c @@ -727,7 +727,7 @@ nvme_ctrlr_create_bdev(struct nvme_ctrlr *nvme_ctrlr, uint32_t nsid) /* Enable if the Volatile Write Cache exists */ bdev->disk.write_cache = 1; } - bdev->disk.blocklen = spdk_nvme_ns_get_sector_size(ns); + bdev->disk.blocklen = spdk_nvme_ns_get_extended_sector_size(ns); bdev->disk.blockcnt = spdk_nvme_ns_get_num_sectors(ns); bdev->disk.optimal_io_boundary = spdk_nvme_ns_get_optimal_io_boundary(ns); @@ -1621,7 +1621,7 @@ bdev_nvme_io_passthru_md(struct nvme_bdev *nbdev, struct spdk_io_channel *ch, struct spdk_nvme_cmd *cmd, void *buf, size_t nbytes, void *md_buf, size_t md_len) { struct nvme_io_channel *nvme_ch = spdk_io_channel_get_ctx(ch); - size_t nr_sectors = nbytes / spdk_nvme_ns_get_sector_size(nbdev->ns); + size_t nr_sectors = nbytes / spdk_nvme_ns_get_extended_sector_size(nbdev->ns); uint32_t max_xfer_size = spdk_nvme_ctrlr_get_max_xfer_size(nbdev->nvme_ctrlr->ctrlr); if (nbytes > max_xfer_size) { diff --git a/lib/nvme/nvme_ns.c b/lib/nvme/nvme_ns.c index e61b3700c..01b40b316 100644 --- a/lib/nvme/nvme_ns.c +++ b/lib/nvme/nvme_ns.c @@ -170,6 +170,12 @@ spdk_nvme_ns_get_sector_size(struct spdk_nvme_ns *ns) return ns->sector_size; } +uint32_t +spdk_nvme_ns_get_extended_sector_size(struct spdk_nvme_ns *ns) +{ + return ns->extended_lba_size; +} + uint64_t spdk_nvme_ns_get_num_sectors(struct spdk_nvme_ns *ns) {