From: Zhang Yi <yi.zh...@huawei.com>

When the device supports the Write Zeroes command and the DEAC bit, it
indicates that the deallocate bit in the Write Zeroes command is
supported, and the bytes read from a deallocated logical block are
zeroes. This means the device supports unmap Write Zeroes operation, so
set the max_hw_wzeroes_unmap_sectors to max_write_zeroes_sectors on the
device's queue limit.

Signed-off-by: Zhang Yi <yi.zh...@huawei.com>
---
 drivers/nvme/host/core.c | 20 +++++++++++---------
 1 file changed, 11 insertions(+), 9 deletions(-)

diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 92697f98c601..90af4a15b696 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -2420,22 +2420,24 @@ static int nvme_update_ns_info_block(struct nvme_ns *ns,
        else
                lim.write_stream_granularity = 0;
 
-       ret = queue_limits_commit_update(ns->disk->queue, &lim);
-       if (ret) {
-               blk_mq_unfreeze_queue(ns->disk->queue, memflags);
-               goto out;
-       }
-
-       set_capacity_and_notify(ns->disk, capacity);
-
        /*
         * Only set the DEAC bit if the device guarantees that reads from
         * deallocated data return zeroes.  While the DEAC bit does not
         * require that, it must be a no-op if reads from deallocated data
         * do not return zeroes.
         */
-       if ((id->dlfeat & 0x7) == 0x1 && (id->dlfeat & (1 << 3)))
+       if ((id->dlfeat & 0x7) == 0x1 && (id->dlfeat & (1 << 3))) {
                ns->head->features |= NVME_NS_DEAC;
+               lim.max_hw_wzeroes_unmap_sectors = lim.max_write_zeroes_sectors;
+       }
+
+       ret = queue_limits_commit_update(ns->disk->queue, &lim);
+       if (ret) {
+               blk_mq_unfreeze_queue(ns->disk->queue, memflags);
+               goto out;
+       }
+
+       set_capacity_and_notify(ns->disk, capacity);
        set_disk_ro(ns->disk, nvme_ns_is_readonly(ns, info));
        set_bit(NVME_NS_READY, &ns->flags);
        blk_mq_unfreeze_queue(ns->disk->queue, memflags);
-- 
2.46.1


Reply via email to