From 2aced8c74c6ab623baf8fd5a1838f700e359ea18 Mon Sep 17 00:00:00 2001 From: Daniel Verkamp Date: Tue, 8 May 2018 16:07:30 -0700 Subject: [PATCH] bdev/nvme: check passthru cmd size against MDTS We can't split passthru commands, since we don't know how they behave, so make sure they do not exceed the NVMe controller's declared maximum data transfer size. Change-Id: I27845dcb04d98e5d64a93f66731e6ed9db5fbbe7 Signed-off-by: Daniel Verkamp Reviewed-on: https://review.gerrithub.io/410519 Reviewed-by: Ben Walker Reviewed-by: Changpeng Liu Tested-by: SPDK Automated Test System --- lib/bdev/nvme/bdev_nvme.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lib/bdev/nvme/bdev_nvme.c b/lib/bdev/nvme/bdev_nvme.c index 9513317ad..908cf9306 100644 --- a/lib/bdev/nvme/bdev_nvme.c +++ b/lib/bdev/nvme/bdev_nvme.c @@ -1338,8 +1338,10 @@ bdev_nvme_admin_passthru(struct nvme_bdev *nbdev, struct spdk_io_channel *ch, struct nvme_bdev_io *bio, struct spdk_nvme_cmd *cmd, void *buf, size_t nbytes) { - if (nbytes > UINT32_MAX) { - SPDK_ERRLOG("nbytes is greater than UINT32_MAX.\n"); + uint32_t max_xfer_size = spdk_nvme_ctrlr_get_max_xfer_size(nbdev->nvme_ctrlr->ctrlr); + + if (nbytes > max_xfer_size) { + SPDK_ERRLOG("nbytes is greater than MDTS %" PRIu32 ".\n", max_xfer_size); return -EINVAL; } @@ -1355,9 +1357,10 @@ bdev_nvme_io_passthru(struct nvme_bdev *nbdev, struct spdk_io_channel *ch, struct spdk_nvme_cmd *cmd, void *buf, size_t nbytes) { struct nvme_io_channel *nvme_ch = spdk_io_channel_get_ctx(ch); + uint32_t max_xfer_size = spdk_nvme_ctrlr_get_max_xfer_size(nbdev->nvme_ctrlr->ctrlr); - if (nbytes > UINT32_MAX) { - SPDK_ERRLOG("nbytes is greater than UINT32_MAX.\n"); + if (nbytes > max_xfer_size) { + SPDK_ERRLOG("nbytes is greater than MDTS %" PRIu32 ".\n", max_xfer_size); return -EINVAL; } @@ -1378,9 +1381,10 @@ bdev_nvme_io_passthru_md(struct nvme_bdev *nbdev, struct spdk_io_channel *ch, { 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); + uint32_t max_xfer_size = spdk_nvme_ctrlr_get_max_xfer_size(nbdev->nvme_ctrlr->ctrlr); - if (nbytes > UINT32_MAX) { - SPDK_ERRLOG("nbytes is greater than UINT32_MAX.\n"); + if (nbytes > max_xfer_size) { + SPDK_ERRLOG("nbytes is greater than MDTS %" PRIu32 ".\n", max_xfer_size); return -EINVAL; }