On Mon, May 23, 2022 at 02:01:14PM -0700, Keith Busch wrote: > From: Keith Busch <kbusch@xxxxxxxxxx> > > The getting pages setup for zone append and normal IO are identical. Use > common code for each. > > Signed-off-by: Keith Busch <kbusch@xxxxxxxxxx> > + > +static int bio_iov_add_zone_append_page(struct bio *bio, struct page *page, > + unsigned int len, unsigned int offset) > +{ > + struct request_queue *q = bdev_get_queue(bio->bi_bdev); > + bool same_page = false; > + > + if (bio_add_hw_page(q, bio, page, len, offset, > + queue_max_zone_append_sectors(q), &same_page) != len) > + return -EINVAL; > + if (same_page) > + put_page(page); > + return 0; > +} > + > > -static int __bio_iov_append_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); > - unsigned int max_append_sectors = queue_max_zone_append_sectors(q); > - struct bio_vec *bv = bio->bi_io_vec + bio->bi_vcnt; > - struct page **pages = (struct page **)bv; > - ssize_t size, left; > - unsigned len, i; > - size_t offset; > - int ret = 0; > - > - if (WARN_ON_ONCE(!max_append_sectors)) > - return 0; I don't see this check in the append path. Should it be added in bio_iov_add_zone_append_page() function? > - > - /* > - * Move page array up in the allocated memory for the bio vecs as far as > - * possible so that we can start filling biovecs from the beginning > - * without overwriting the temporary page array. > - */ > - BUILD_BUG_ON(PAGE_PTRS_PER_BVEC < 2); > - pages += entries_left * (PAGE_PTRS_PER_BVEC - 1); > - > - size = iov_iter_get_pages(iter, pages, LONG_MAX, nr_pages, &offset); > - if (unlikely(size <= 0)) -- Pankaj Raghav