Message ID | 94eb00fce052ef7c64a45b067a86904d174e92fb.1611295439.git.naohiro.aota@wdc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: zoned block device support | expand |
On 1/21/21 10:24 PM, Naohiro Aota wrote: > From: Johannes Thumshirn <johannes.thumshirn@wdc.com> > > Add bio_add_zone_append_page(), a wrapper around bio_add_hw_page() which > is intended to be used by file systems that directly add pages to a bio > instead of using bio_iov_iter_get_pages(). > > Cc: Jens Axboe <axboe@kernel.dk> > Reviewed-by: Christoph Hellwig <hch@lst.de> > Reviewed-by: Josef Bacik <josef@toxicpanda.com> > Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Looks good. Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
On 1/21/21 10:24 PM, Naohiro Aota wrote: > From: Johannes Thumshirn <johannes.thumshirn@wdc.com> > > Add bio_add_zone_append_page(), a wrapper around bio_add_hw_page() which > is intended to be used by file systems that directly add pages to a bio > instead of using bio_iov_iter_get_pages(). > > Cc: Jens Axboe <axboe@kernel.dk> > Reviewed-by: Christoph Hellwig <hch@lst.de> > Reviewed-by: Josef Bacik <josef@toxicpanda.com> > Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Looks good. Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
On 22/01/2021 07:22, Naohiro Aota wrote: > From: Johannes Thumshirn <johannes.thumshirn@wdc.com> > > Add bio_add_zone_append_page(), a wrapper around bio_add_hw_page() which > is intended to be used by file systems that directly add pages to a bio > instead of using bio_iov_iter_get_pages(). > > Cc: Jens Axboe <axboe@kernel.dk> > Reviewed-by: Christoph Hellwig <hch@lst.de> > Reviewed-by: Josef Bacik <josef@toxicpanda.com> > Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Jens ping? > --- > block/bio.c | 33 +++++++++++++++++++++++++++++++++ > include/linux/bio.h | 2 ++ > 2 files changed, 35 insertions(+) > > diff --git a/block/bio.c b/block/bio.c > index 1f2cc1fbe283..2f21d2958b60 100644 > --- a/block/bio.c > +++ b/block/bio.c > @@ -851,6 +851,39 @@ int bio_add_pc_page(struct request_queue *q, struct bio *bio, > } > EXPORT_SYMBOL(bio_add_pc_page); > > +/** > + * bio_add_zone_append_page - attempt to add page to zone-append bio > + * @bio: destination bio > + * @page: page to add > + * @len: vec entry length > + * @offset: vec entry offset > + * > + * Attempt to add a page to the bio_vec maplist of a bio that will be submitted > + * for a zone-append request. This can fail for a number of reasons, such as the > + * bio being full or the target block device is not a zoned block device or > + * other limitations of the target block device. The target block device must > + * allow bio's up to PAGE_SIZE, so it is always possible to add a single page > + * to an empty bio. > + * > + * Returns: number of bytes added to the bio, or 0 in case of a failure. > + */ > +int bio_add_zone_append_page(struct bio *bio, struct page *page, > + unsigned int len, unsigned int offset) > +{ > + struct request_queue *q = bio->bi_disk->queue; > + bool same_page = false; > + > + if (WARN_ON_ONCE(bio_op(bio) != REQ_OP_ZONE_APPEND)) > + return 0; > + > + if (WARN_ON_ONCE(!blk_queue_is_zoned(q))) > + return 0; > + > + return bio_add_hw_page(q, bio, page, len, offset, > + queue_max_zone_append_sectors(q), &same_page); > +} > +EXPORT_SYMBOL_GPL(bio_add_zone_append_page); > + > /** > * __bio_try_merge_page - try appending data to an existing bvec. > * @bio: destination bio > diff --git a/include/linux/bio.h b/include/linux/bio.h > index 1edda614f7ce..de62911473bb 100644 > --- a/include/linux/bio.h > +++ b/include/linux/bio.h > @@ -455,6 +455,8 @@ void bio_chain(struct bio *, struct bio *); > extern int bio_add_page(struct bio *, struct page *, unsigned int,unsigned int); > extern int bio_add_pc_page(struct request_queue *, struct bio *, struct page *, > unsigned int, unsigned int); > +int bio_add_zone_append_page(struct bio *bio, struct page *page, > + unsigned int len, unsigned int offset); > bool __bio_try_merge_page(struct bio *bio, struct page *page, > unsigned int len, unsigned int off, bool *same_page); > void __bio_add_page(struct bio *bio, struct page *page, >
diff --git a/block/bio.c b/block/bio.c index 1f2cc1fbe283..2f21d2958b60 100644 --- a/block/bio.c +++ b/block/bio.c @@ -851,6 +851,39 @@ int bio_add_pc_page(struct request_queue *q, struct bio *bio, } EXPORT_SYMBOL(bio_add_pc_page); +/** + * bio_add_zone_append_page - attempt to add page to zone-append bio + * @bio: destination bio + * @page: page to add + * @len: vec entry length + * @offset: vec entry offset + * + * Attempt to add a page to the bio_vec maplist of a bio that will be submitted + * for a zone-append request. This can fail for a number of reasons, such as the + * bio being full or the target block device is not a zoned block device or + * other limitations of the target block device. The target block device must + * allow bio's up to PAGE_SIZE, so it is always possible to add a single page + * to an empty bio. + * + * Returns: number of bytes added to the bio, or 0 in case of a failure. + */ +int bio_add_zone_append_page(struct bio *bio, struct page *page, + unsigned int len, unsigned int offset) +{ + struct request_queue *q = bio->bi_disk->queue; + bool same_page = false; + + if (WARN_ON_ONCE(bio_op(bio) != REQ_OP_ZONE_APPEND)) + return 0; + + if (WARN_ON_ONCE(!blk_queue_is_zoned(q))) + return 0; + + return bio_add_hw_page(q, bio, page, len, offset, + queue_max_zone_append_sectors(q), &same_page); +} +EXPORT_SYMBOL_GPL(bio_add_zone_append_page); + /** * __bio_try_merge_page - try appending data to an existing bvec. * @bio: destination bio diff --git a/include/linux/bio.h b/include/linux/bio.h index 1edda614f7ce..de62911473bb 100644 --- a/include/linux/bio.h +++ b/include/linux/bio.h @@ -455,6 +455,8 @@ void bio_chain(struct bio *, struct bio *); extern int bio_add_page(struct bio *, struct page *, unsigned int,unsigned int); extern int bio_add_pc_page(struct request_queue *, struct bio *, struct page *, unsigned int, unsigned int); +int bio_add_zone_append_page(struct bio *bio, struct page *page, + unsigned int len, unsigned int offset); bool __bio_try_merge_page(struct bio *bio, struct page *page, unsigned int len, unsigned int off, bool *same_page); void __bio_add_page(struct bio *bio, struct page *page,