On 2020/09/14 23:52, Mike Snitzer wrote: > On Sun, Sep 13 2020 at 8:43pm -0400, > Damien Le Moal <Damien.LeMoal@xxxxxxx> wrote: > >> On 2020/09/12 22:53, Ming Lei wrote: >>> On Fri, Sep 11, 2020 at 05:53:36PM -0400, Mike Snitzer wrote: >>>> blk_queue_get_max_sectors() has been trained for REQ_OP_WRITE_SAME and >>>> REQ_OP_WRITE_ZEROES yet blk_rq_get_max_sectors() didn't call it for >>>> those operations. >>> >>> Actually WRITE_SAME & WRITE_ZEROS are handled by the following if >>> chunk_sectors is set: >>> >>> return min(blk_max_size_offset(q, offset), >>> blk_queue_get_max_sectors(q, req_op(rq))); >>> >>>> Also, there is no need to avoid blk_max_size_offset() if >>>> 'chunk_sectors' isn't set because it falls back to 'max_sectors'. >>>> >>>> Signed-off-by: Mike Snitzer <snitzer@xxxxxxxxxx> >>>> --- >>>> include/linux/blkdev.h | 19 +++++++++++++------ >>>> 1 file changed, 13 insertions(+), 6 deletions(-) >>>> >>>> diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h >>>> index bb5636cc17b9..453a3d735d66 100644 >>>> --- a/include/linux/blkdev.h >>>> +++ b/include/linux/blkdev.h >>>> @@ -1070,17 +1070,24 @@ static inline unsigned int blk_rq_get_max_sectors(struct request *rq, >>>> sector_t offset) >>>> { >>>> struct request_queue *q = rq->q; >>>> + int op; >>>> + unsigned int max_sectors; >>>> >>>> if (blk_rq_is_passthrough(rq)) >>>> return q->limits.max_hw_sectors; >>>> >>>> - if (!q->limits.chunk_sectors || >>>> - req_op(rq) == REQ_OP_DISCARD || >>>> - req_op(rq) == REQ_OP_SECURE_ERASE) >>>> - return blk_queue_get_max_sectors(q, req_op(rq)); >>>> + op = req_op(rq); >>>> + max_sectors = blk_queue_get_max_sectors(q, op); >>>> >>>> - return min(blk_max_size_offset(q, offset), >>>> - blk_queue_get_max_sectors(q, req_op(rq))); >>>> + switch (op) { >>>> + case REQ_OP_DISCARD: >>>> + case REQ_OP_SECURE_ERASE: >>>> + case REQ_OP_WRITE_SAME: >>>> + case REQ_OP_WRITE_ZEROES: >>>> + return max_sectors; >>>> + }>> + >>>> + return min(blk_max_size_offset(q, offset), max_sectors); >>>> } >>> >>> It depends if offset & chunk_sectors limit for WRITE_SAME & WRITE_ZEROS >>> needs to be considered. >> >> That limit is needed for zoned block devices to ensure that *any* write request, >> no matter the command, do not cross zone boundaries. Otherwise, the write would >> be immediately failed by the device. > > Thanks for the additional context, sorry to make you so concerned! ;) No worries :) -- Damien Le Moal Western Digital Research -- dm-devel mailing list dm-devel@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/dm-devel