On Mon, May 16, 2022 at 12:13:10PM +0200, Damien Le Moal wrote: > On 2022/05/13 18:13, Keith Busch wrote: > > From: Keith Busch <kbusch@xxxxxxxxxx> > > > > If the iterator has an offset, filling a bio to the max bvecs may result > > in a size that isn't aligned to the block size. Mask off bytes for the > > bio being constructed. > > > > Signed-off-by: Keith Busch <kbusch@xxxxxxxxxx> > > --- > > block/bio.c | 4 ++++ > > 1 file changed, 4 insertions(+) > > > > diff --git a/block/bio.c b/block/bio.c > > index 4259125e16ab..b42a9e3ff068 100644 > > --- a/block/bio.c > > +++ b/block/bio.c > > @@ -1144,6 +1144,7 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter) > > { > > unsigned short nr_pages = bio->bi_max_vecs - bio->bi_vcnt; > > unsigned short entries_left = bio->bi_max_vecs - bio->bi_vcnt; > > + struct request_queue *q = bdev_get_queue(bio->bi_bdev); > > struct bio_vec *bv = bio->bi_io_vec + bio->bi_vcnt; > > struct page **pages = (struct page **)bv; > > bool same_page = false; > > @@ -1160,6 +1161,9 @@ static int __bio_iov_iter_get_pages(struct bio *bio, struct iov_iter *iter) > > pages += entries_left * (PAGE_PTRS_PER_BVEC - 1); > > > > size = iov_iter_get_pages(iter, pages, LONG_MAX, nr_pages, &offset); > > + if (size > 0) > > + size = size & ~(queue_logical_block_size(q) - 1); > > I think that __bio_iov_append_get_pages() needs the same change. And given that > both __bio_iov_append_get_pages() and __bio_iov_iter_get_pages() start with > iov_iter_get_pages(), should we do that and check the size in the single caller: > bio_iov_iter_get_pages() ? Right, __bio_iov_append_get_pages needs this too. I'll see if we can remove much of the duplicated code among these two functions as a prep patch.