nvme: move setting the write cache flags out of nvme_set_queue_limits
authorChristoph Hellwig <hch@lst.de>
Mon, 4 Mar 2024 14:04:53 +0000 (07:04 -0700)
committerKeith Busch <kbusch@kernel.org>
Mon, 4 Mar 2024 16:24:56 +0000 (08:24 -0800)
nvme_set_queue_limits is used on the admin queue and all gendisks
including hidden ones that don't support block I/O.  The write cache
setting on the other hand only makes sense for block I/O.  Move the
blk_queue_write_cache call to nvme_update_ns_info_block instead.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Max Gurtovoy <mgurtovoy@nvidia.com>
Signed-off-by: Keith Busch <kbusch@kernel.org>
drivers/nvme/host/core.c

index 63c2b581f7859ed4bc28cff90b9e594a6f950c75..ce70bfb66242e2009d75eb3763dfb6bbbc089db4 100644 (file)
@@ -1954,15 +1954,12 @@ static u32 nvme_max_drv_segments(struct nvme_ctrl *ctrl)
 static void nvme_set_queue_limits(struct nvme_ctrl *ctrl,
                struct request_queue *q)
 {
-       bool vwc = ctrl->vwc & NVME_CTRL_VWC_PRESENT;
-
        blk_queue_max_hw_sectors(q, ctrl->max_hw_sectors);
        blk_queue_max_segments(q, min_t(u32, USHRT_MAX,
                min_not_zero(nvme_max_drv_segments(ctrl), ctrl->max_segments)));
        blk_queue_max_integrity_segments(q, ctrl->max_integrity_segments);
        blk_queue_virt_boundary(q, NVME_CTRL_PAGE_SIZE - 1);
        blk_queue_dma_alignment(q, 3);
-       blk_queue_write_cache(q, vwc, vwc);
 }
 
 static bool nvme_update_disk_info(struct nvme_ns *ns, struct nvme_id_ns *id)
@@ -2093,6 +2090,7 @@ static int nvme_update_ns_info_generic(struct nvme_ns *ns,
 static int nvme_update_ns_info_block(struct nvme_ns *ns,
                struct nvme_ns_info *info)
 {
+       bool vwc = ns->ctrl->vwc & NVME_CTRL_VWC_PRESENT;
        struct nvme_id_ns *id;
        sector_t capacity;
        unsigned lbaf;
@@ -2154,6 +2152,7 @@ static int nvme_update_ns_info_block(struct nvme_ns *ns,
        if ((id->dlfeat & 0x7) == 0x1 && (id->dlfeat & (1 << 3)))
                ns->head->features |= NVME_NS_DEAC;
        set_disk_ro(ns->disk, nvme_ns_is_readonly(ns, info));
+       blk_queue_write_cache(ns->disk->queue, vwc, vwc);
        set_bit(NVME_NS_READY, &ns->flags);
        blk_mq_unfreeze_queue(ns->disk->queue);