Commit 81c2168c authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Jens Axboe

block: add a bio_chain_and_submit helper

This is basically blk_next_bio just with the bio allocation moved
to the caller to allow for more flexible bio handling in the caller.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20240506042027.2289826-4-hch@lst.deSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 30f1e724
...@@ -345,18 +345,29 @@ void bio_chain(struct bio *bio, struct bio *parent) ...@@ -345,18 +345,29 @@ void bio_chain(struct bio *bio, struct bio *parent)
} }
EXPORT_SYMBOL(bio_chain); EXPORT_SYMBOL(bio_chain);
struct bio *blk_next_bio(struct bio *bio, struct block_device *bdev, /**
unsigned int nr_pages, blk_opf_t opf, gfp_t gfp) * bio_chain_and_submit - submit a bio after chaining it to another one
* @prev: bio to chain and submit
* @new: bio to chain to
*
* If @prev is non-NULL, chain it to @new and submit it.
*
* Return: @new.
*/
struct bio *bio_chain_and_submit(struct bio *prev, struct bio *new)
{ {
struct bio *new = bio_alloc(bdev, nr_pages, opf, gfp); if (prev) {
bio_chain(prev, new);
if (bio) { submit_bio(prev);
bio_chain(bio, new);
submit_bio(bio);
} }
return new; return new;
} }
struct bio *blk_next_bio(struct bio *bio, struct block_device *bdev,
unsigned int nr_pages, blk_opf_t opf, gfp_t gfp)
{
return bio_chain_and_submit(bio, bio_alloc(bdev, nr_pages, opf, gfp));
}
EXPORT_SYMBOL_GPL(blk_next_bio); EXPORT_SYMBOL_GPL(blk_next_bio);
static void bio_alloc_rescue(struct work_struct *work) static void bio_alloc_rescue(struct work_struct *work)
......
...@@ -831,5 +831,6 @@ static inline void bio_clear_polled(struct bio *bio) ...@@ -831,5 +831,6 @@ static inline void bio_clear_polled(struct bio *bio)
struct bio *blk_next_bio(struct bio *bio, struct block_device *bdev, struct bio *blk_next_bio(struct bio *bio, struct block_device *bdev,
unsigned int nr_pages, blk_opf_t opf, gfp_t gfp); unsigned int nr_pages, blk_opf_t opf, gfp_t gfp);
struct bio *bio_chain_and_submit(struct bio *prev, struct bio *new);
#endif /* __LINUX_BIO_H */ #endif /* __LINUX_BIO_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment