block: add a bio_chain_and_submit helper
authorChristoph Hellwig <hch@lst.de>
Mon, 6 May 2024 04:20:24 +0000 (06:20 +0200)
committerJens Axboe <axboe@kernel.dk>
Tue, 7 May 2024 13:29:42 +0000 (07:29 -0600)
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: Christoph Hellwig <hch@lst.de>
Link: https://lore.kernel.org/r/20240506042027.2289826-4-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bio.c
include/linux/bio.h

index 38baedb39c6f2e4ca3bc0074b96c27afe99919d7..d82ef4fd545cb2860476f1dff0af15d2201a5d5f 100644 (file)
@@ -345,18 +345,29 @@ void bio_chain(struct bio *bio, struct bio *parent)
 }
 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 (bio) {
-               bio_chain(bio, new);
-               submit_bio(bio);
+       if (prev) {
+               bio_chain(prev, new);
+               submit_bio(prev);
        }
-
        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);
 
 static void bio_alloc_rescue(struct work_struct *work)
index 9b8a369f44bc6b6215a21c0db523770604776ed1..283a0dcbd1de619b806f644b2d05a440a326e7ab 100644 (file)
@@ -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,
                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 */