On Mar 15 10:34, Christoph Hellwig wrote: > 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 > --- > drivers/nvme/host/core.c | 36 ++++++++++++------------------------ > 1 file changed, 12 insertions(+), 24 deletions(-) > > diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c > index 82ad5eef9d0c30..1bd18d7f53b316 100644 > --- a/drivers/nvme/host/core.c > +++ b/drivers/nvme/host/core.c > @@ -1964,30 +1964,18 @@ static void nvme_config_discard(struct gendisk *disk, struct nvme_ns *ns) > 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 (!(ns->ctrl->oncs & NVME_CTRL_ONCS_WRITE_ZEROES) || > - (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)); > + if ((ctrl->oncs & NVME_CTRL_ONCS_WRITE_ZEROES) && > + !(ctrl->quirks & NVME_QUIRK_DISABLE_WRITE_ZEROES)) > + blk_queue_max_write_zeroes_sectors(q, ctrl->max_hw_sectors); > } > > static bool nvme_ns_ids_valid(struct nvme_ns_ids *ids) > @@ -2159,7 +2147,7 @@ static void nvme_update_disk_info(struct gendisk *disk, > set_capacity_and_notify(disk, capacity); > > nvme_config_discard(disk, ns); > - nvme_config_write_zeroes(disk, ns); > + nvme_config_write_zeroes(disk->queue, ns->ctrl); > > set_disk_ro(disk, (id->nsattr & NVME_NS_ATTR_RO) || > test_bit(NVME_NS_FORCE_RO, &ns->flags)); > -- > 2.30.1 > LGTM. Tested-by: Klaus Jensen Reviewed-by: Klaus Jensen