]> www.infradead.org Git - users/hch/block.git/commitdiff
block: add a bio_await_chain helper
authorKeith Busch <kbusch@kernel.org>
Tue, 12 Mar 2024 13:19:20 +0000 (07:19 -0600)
committerChristoph Hellwig <hch@lst.de>
Fri, 3 May 2024 16:50:51 +0000 (18:50 +0200)
Add a helper to wait for an entire chain of bios to complete.

Signed-off-by: Keith Busch <kbusch@kernel.org>
[hch: split from a larger patch, moved and changed the name now that it
 is non-static]
Signed-off-by: Christoph Hellwig <hch@lst.de>
block/bio.c
block/blk.h

index d82ef4fd545cb2860476f1dff0af15d2201a5d5f..dce12a0efdead26c8bf3eebc54cdce6d5e50421d 100644 (file)
@@ -1395,6 +1395,26 @@ int submit_bio_wait(struct bio *bio)
 }
 EXPORT_SYMBOL(submit_bio_wait);
 
+static void bio_wait_end_io(struct bio *bio)
+{
+       complete(bio->bi_private);
+       bio_put(bio);
+}
+
+/*
+ * bio_await_chain - ends @bio and waits for every chained bio to complete
+ */
+void bio_await_chain(struct bio *bio)
+{
+       DECLARE_COMPLETION_ONSTACK_MAP(done,
+                       bio->bi_bdev->bd_disk->lockdep_map);
+
+       bio->bi_private = &done;
+       bio->bi_end_io = bio_wait_end_io;
+       bio_endio(bio);
+       blk_wait_io(&done);
+}
+
 void __bio_advance(struct bio *bio, unsigned bytes)
 {
        if (bio_integrity(bio))
index ee4f782d14966266e80dfa06236d6ebc8e788a26..d5107e65355e271a02a9640e88e8e4e4c088d83b 100644 (file)
@@ -38,6 +38,7 @@ void __blk_mq_unfreeze_queue(struct request_queue *q, bool force_atomic);
 void blk_queue_start_drain(struct request_queue *q);
 int __bio_queue_enter(struct request_queue *q, struct bio *bio);
 void submit_bio_noacct_nocheck(struct bio *bio);
+void bio_await_chain(struct bio *bio);
 
 static inline bool blk_try_enter_queue(struct request_queue *q, bool pm)
 {