block: add bio_add_zone_append_page
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(). Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com> Acked-by: Jens Axboe <axboe@kernel.dk> Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
72c9925f87
commit
ae29333fa6
33
block/bio.c
33
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
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user