diff --git a/lib/nvme/nvme_internal.h b/lib/nvme/nvme_internal.h index 331611a9c4..b68fafa078 100644 --- a/lib/nvme/nvme_internal.h +++ b/lib/nvme/nvme_internal.h @@ -84,6 +84,13 @@ */ #define NVME_QUIRK_DELAY_AFTER_QUEUE_ALLOC 0x10 +/* + * Earlier NVMe devices do not indicate whether unmapped blocks + * will read all zeroes or not. This define indicates that the + * device does in fact read all zeroes after an unmap event + */ +#define NVME_QUIRK_READ_ZERO_AFTER_DEALLOCATE 0x20 + #define NVME_MAX_ASYNC_EVENTS (8) #define NVME_MIN_TIMEOUT_PERIOD (5) diff --git a/lib/nvme/nvme_ns.c b/lib/nvme/nvme_ns.c index fe00ccedc4..dadd865253 100644 --- a/lib/nvme/nvme_ns.c +++ b/lib/nvme/nvme_ns.c @@ -188,8 +188,14 @@ spdk_nvme_ns_get_data(struct spdk_nvme_ns *ns) enum spdk_nvme_dealloc_logical_block_read_value spdk_nvme_ns_get_dealloc_logical_block_read_value( struct spdk_nvme_ns *ns) { + struct spdk_nvme_ctrlr *ctrlr = ns->ctrlr; const struct spdk_nvme_ns_data *data = spdk_nvme_ns_get_data(ns); - return data->dlfeat.bits.read_value; + + if (ctrlr->quirks & NVME_QUIRK_READ_ZERO_AFTER_DEALLOCATE) { + return SPDK_NVME_DEALLOC_READ_00; + } else { + return data->dlfeat.bits.read_value; + } } int nvme_ns_construct(struct spdk_nvme_ns *ns, uint16_t id, diff --git a/lib/nvme/nvme_quirks.c b/lib/nvme/nvme_quirks.c index fcd92144f2..eef22a5605 100644 --- a/lib/nvme/nvme_quirks.c +++ b/lib/nvme/nvme_quirks.c @@ -42,7 +42,8 @@ static const struct nvme_quirk nvme_quirks[] = { { {SPDK_PCI_VID_INTEL, 0x0953, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, NVME_INTEL_QUIRK_READ_LATENCY | NVME_INTEL_QUIRK_WRITE_LATENCY | - NVME_INTEL_QUIRK_STRIPING + NVME_INTEL_QUIRK_STRIPING | + NVME_QUIRK_READ_ZERO_AFTER_DEALLOCATE }, { {SPDK_PCI_VID_INTEL, 0x0A53, SPDK_PCI_ANY_ID, SPDK_PCI_ANY_ID}, NVME_INTEL_QUIRK_STRIPING