nvme: fix Write Zeroes limitations
commit b94e8cd2e6a94fc7563529ddc82726a7e77e04de upstream. We voluntarily limit the Write Zeroes sizes to the MDTS value provided by the hardware, but currently get the units wrong, so fix that. Fixes: 6e02318eaea5 ("nvme: add support for the Write Zeroes command") Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Keith Busch <kbusch@kernel.org> Tested-by: Klaus Jensen <k.jensen@samsung.com> Reviewed-by: Klaus Jensen <k.jensen@samsung.com> Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com> Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
6712b7fcef
commit
81c1dbe107
@ -1743,30 +1743,18 @@ static void nvme_config_discard(struct gendisk *disk, struct nvme_ns *ns)
|
|||||||
blk_queue_max_write_zeroes_sectors(queue, UINT_MAX);
|
blk_queue_max_write_zeroes_sectors(queue, UINT_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nvme_config_write_zeroes(struct gendisk *disk, struct nvme_ns *ns)
|
/*
|
||||||
|
* Even though NVMe spec explicitly states that MDTS is not applicable to the
|
||||||
|
* write-zeroes, we are cautious and limit the size to the controllers
|
||||||
|
* max_hw_sectors value, which is based on the MDTS field and possibly other
|
||||||
|
* limiting factors.
|
||||||
|
*/
|
||||||
|
static void nvme_config_write_zeroes(struct request_queue *q,
|
||||||
|
struct nvme_ctrl *ctrl)
|
||||||
{
|
{
|
||||||
u64 max_blocks;
|
if ((ctrl->oncs & NVME_CTRL_ONCS_WRITE_ZEROES) &&
|
||||||
|
!(ctrl->quirks & NVME_QUIRK_DISABLE_WRITE_ZEROES))
|
||||||
if (!(ns->ctrl->oncs & NVME_CTRL_ONCS_WRITE_ZEROES) ||
|
blk_queue_max_write_zeroes_sectors(q, ctrl->max_hw_sectors);
|
||||||
(ns->ctrl->quirks & NVME_QUIRK_DISABLE_WRITE_ZEROES))
|
|
||||||
return;
|
|
||||||
/*
|
|
||||||
* Even though NVMe spec explicitly states that MDTS is not
|
|
||||||
* applicable to the write-zeroes:- "The restriction does not apply to
|
|
||||||
* commands that do not transfer data between the host and the
|
|
||||||
* controller (e.g., Write Uncorrectable ro Write Zeroes command).".
|
|
||||||
* In order to be more cautious use controller's max_hw_sectors value
|
|
||||||
* to configure the maximum sectors for the write-zeroes which is
|
|
||||||
* configured based on the controller's MDTS field in the
|
|
||||||
* nvme_init_identify() if available.
|
|
||||||
*/
|
|
||||||
if (ns->ctrl->max_hw_sectors == UINT_MAX)
|
|
||||||
max_blocks = (u64)USHRT_MAX + 1;
|
|
||||||
else
|
|
||||||
max_blocks = ns->ctrl->max_hw_sectors + 1;
|
|
||||||
|
|
||||||
blk_queue_max_write_zeroes_sectors(disk->queue,
|
|
||||||
nvme_lba_to_sect(ns, max_blocks));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int nvme_report_ns_ids(struct nvme_ctrl *ctrl, unsigned int nsid,
|
static int nvme_report_ns_ids(struct nvme_ctrl *ctrl, unsigned int nsid,
|
||||||
@ -1853,7 +1841,7 @@ static void nvme_update_disk_info(struct gendisk *disk,
|
|||||||
set_capacity(disk, capacity);
|
set_capacity(disk, capacity);
|
||||||
|
|
||||||
nvme_config_discard(disk, ns);
|
nvme_config_discard(disk, ns);
|
||||||
nvme_config_write_zeroes(disk, ns);
|
nvme_config_write_zeroes(disk->queue, ns->ctrl);
|
||||||
|
|
||||||
if (id->nsattr & (1 << 0))
|
if (id->nsattr & (1 << 0))
|
||||||
set_disk_ro(disk, true);
|
set_disk_ro(disk, true);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user