On Tue, Jul 23, 2019 at 08:48:52AM -0700, James Bottomley wrote: > diff --git a/block/blk-settings.c b/block/blk-settings.c > index 2ae348c101a0..46a95536f3bd 100644 > --- a/block/blk-settings.c > +++ b/block/blk-settings.c > @@ -752,7 +752,8 @@ void blk_queue_virt_boundary(struct request_queue *q, unsigned long mask) > * page (which might not be idential to the Linux PAGE_SIZE). Because > * of that they are not limited by our notion of "segment size". > */ > - q->limits.max_segment_size = UINT_MAX; > + if (mask != 0 && q->limits.max_segment_size == BLK_MAX_SEGMENT_SIZE) > + q->limits.max_segment_size = UINT_MAX; The first check makes sense, defintively safer than leaving it to the caller. The second one is wrong - we need to force an unlimited segment size because we can't account for it for the virt_boundary merges. And the comment just above explains why that is safe.