From 14a18cca32f8aa87194670e78023ca8667470c98 Mon Sep 17 00:00:00 2001 From: Changpeng Liu Date: Tue, 6 Mar 2018 20:33:32 -0500 Subject: [PATCH] nvmf: don't submit FLUSH command to backend which can't support it As for NVMeoF controller, SPDK always set volatile write cache to present, so OS may submit FLUSH command to backend block device, while here, return success for those block devices which can't support FLUSH command. Change-Id: Ib764503f1986e7e0a38a1751a91d6c11e1b78865 Signed-off-by: Changpeng Liu Reviewed-on: https://review.gerrithub.io/402653 Tested-by: SPDK Automated Test System Reviewed-by: Daniel Verkamp Reviewed-by: Jim Harris --- lib/nvmf/ctrlr_bdev.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/lib/nvmf/ctrlr_bdev.c b/lib/nvmf/ctrlr_bdev.c index 2a0447fd9..ed01d8dd8 100644 --- a/lib/nvmf/ctrlr_bdev.c +++ b/lib/nvmf/ctrlr_bdev.c @@ -264,6 +264,16 @@ nvmf_bdev_ctrlr_flush_cmd(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc, { struct spdk_nvme_cpl *response = &req->rsp->nvme_cpl; + /* As for NVMeoF controller, SPDK always set volatile write + * cache bit to 1, return success for those block devices + * which can't support FLUSH command. + */ + if (!spdk_bdev_io_type_supported(bdev, SPDK_BDEV_IO_TYPE_FLUSH)) { + response->status.sct = SPDK_NVME_SCT_GENERIC; + response->status.sc = SPDK_NVME_SC_SUCCESS; + return SPDK_NVMF_REQUEST_EXEC_STATUS_COMPLETE; + } + if (spdk_bdev_flush_blocks(desc, ch, 0, spdk_bdev_get_num_blocks(bdev), nvmf_bdev_ctrlr_complete_cmd, req)) { response->status.sc = SPDK_NVME_SC_INTERNAL_DEVICE_ERROR;