From c9dc522ba9192a2cf3c4e3c1a084534b2f855e69 Mon Sep 17 00:00:00 2001 From: Seth Howell Date: Fri, 28 Jul 2017 13:01:14 -0700 Subject: [PATCH] bdev_nvme: add support for write_zeroes In this iteration, we only support write_zeroes in the form of a deallocate call that returns all zeroes. Change-Id: Ica837ce70672174df63012719de60463fdb799cf Signed-off-by: Seth Howell Reviewed-on: https://review.gerrithub.io/372005 Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp --- lib/bdev/nvme/bdev_nvme.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lib/bdev/nvme/bdev_nvme.c b/lib/bdev/nvme/bdev_nvme.c index e44e99c2f..3b27bcde9 100644 --- a/lib/bdev/nvme/bdev_nvme.c +++ b/lib/bdev/nvme/bdev_nvme.c @@ -376,6 +376,13 @@ _bdev_nvme_submit_request(struct spdk_io_channel *ch, struct spdk_bdev_io *bdev_ bdev_io->u.write.len, bdev_io->u.write.offset); + case SPDK_BDEV_IO_TYPE_WRITE_ZEROES: + return bdev_nvme_unmap((struct nvme_bdev *)bdev_io->bdev->ctxt, + ch, + (struct nvme_bdev_io *)bdev_io->driver_ctx, + bdev_io->u.write.len, + bdev_io->u.write.offset); + case SPDK_BDEV_IO_TYPE_UNMAP: return bdev_nvme_unmap((struct nvme_bdev *)bdev_io->bdev->ctxt, ch, @@ -442,6 +449,23 @@ bdev_nvme_io_type_supported(void *ctx, enum spdk_bdev_io_type io_type) cdata = spdk_nvme_ctrlr_get_data(nbdev->nvme_ctrlr->ctrlr); return cdata->oncs.dsm; + case SPDK_BDEV_IO_TYPE_WRITE_ZEROES: + cdata = spdk_nvme_ctrlr_get_data(nbdev->nvme_ctrlr->ctrlr); + /* + * If an NVMe controller guarantees reading unallocated blocks returns zero, + * we can implement WRITE_ZEROES as an NVMe deallocate command. + */ + if (cdata->oncs.dsm && + spdk_nvme_ns_get_dealloc_logical_block_read_value(nbdev->ns) == SPDK_NVME_DEALLOC_READ_00) { + return true; + } + /* + * The NVMe controller write_zeroes function is currently not used by our driver. + * If a user submits an arbitrarily large write_zeroes request to the controller, the request will fail. + * Until this is resolved, we only claim support for write_zeroes if deallocated blocks return 0's when read. + */ + return false; + default: return false; }