]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
block: add a bio_submit_or_kill helper
authorChristoph Hellwig <hch@lst.de>
Tue, 7 Apr 2026 14:05:27 +0000 (16:05 +0200)
committerJens Axboe <axboe@kernel.dk>
Tue, 7 Apr 2026 14:22:24 +0000 (08:22 -0600)
Factor the common logic for the ioctl helpers to either submit a bio or
end if the process is being killed.  As this is now the only user of
bio_await_chain, open code that.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Damien Le Moal <dlemoal@kernel.org>
Link: https://patch.msgid.link/20260407140538.633364-5-hch@lst.de
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/bio.c
block/blk-lib.c
block/blk.h
block/ioctl.c

index 61d65c544bcca16b46470088f8a7aefc3ef056c4..641ef0928d73585c965ec75f2bbe8b6519df393c 100644 (file)
@@ -1520,6 +1520,20 @@ static void bio_endio_cb(struct bio *bio, void *priv)
        bio_endio(bio);
 }
 
+/*
+ * Submit @bio synchronously, or call bio_endio on it if the current process
+ * is being killed.
+ */
+int bio_submit_or_kill(struct bio *bio, unsigned int flags)
+{
+       if ((flags & BLKDEV_ZERO_KILLABLE) && fatal_signal_pending(current)) {
+               bio_await(bio, NULL, bio_endio_cb);
+               return -EINTR;
+       }
+
+       return submit_bio_wait(bio);
+}
+
 /**
  * bdev_rw_virt - synchronously read into / write from kernel mapping
  * @bdev:      block device to access
@@ -1550,15 +1564,6 @@ int bdev_rw_virt(struct block_device *bdev, sector_t sector, void *data,
 }
 EXPORT_SYMBOL_GPL(bdev_rw_virt);
 
-/*
- * bio_await_chain - ends @bio and waits for every chained bio to complete
- */
-void bio_await_chain(struct bio *bio)
-{
-       bio_await(bio, NULL, bio_endio_cb);
-       bio_put(bio);
-}
-
 void __bio_advance(struct bio *bio, unsigned bytes)
 {
        if (bio_integrity(bio))
index 3213afc7f0d5dc61e9df4e69775c23c8a653d767..688bc67cbf733d7fa89ef63754d73fd5eb3872f0 100644 (file)
@@ -155,13 +155,7 @@ static int blkdev_issue_write_zeroes(struct block_device *bdev, sector_t sector,
        __blkdev_issue_write_zeroes(bdev, sector, nr_sects, gfp, &bio,
                        flags, limit);
        if (bio) {
-               if ((flags & BLKDEV_ZERO_KILLABLE) &&
-                   fatal_signal_pending(current)) {
-                       bio_await_chain(bio);
-                       blk_finish_plug(&plug);
-                       return -EINTR;
-               }
-               ret = submit_bio_wait(bio);
+               ret = bio_submit_or_kill(bio, flags);
                bio_put(bio);
        }
        blk_finish_plug(&plug);
@@ -236,13 +230,7 @@ static int blkdev_issue_zero_pages(struct block_device *bdev, sector_t sector,
        blk_start_plug(&plug);
        __blkdev_issue_zero_pages(bdev, sector, nr_sects, gfp, &bio, flags);
        if (bio) {
-               if ((flags & BLKDEV_ZERO_KILLABLE) &&
-                   fatal_signal_pending(current)) {
-                       bio_await_chain(bio);
-                       blk_finish_plug(&plug);
-                       return -EINTR;
-               }
-               ret = submit_bio_wait(bio);
+               ret = bio_submit_or_kill(bio, flags);
                bio_put(bio);
        }
        blk_finish_plug(&plug);
index 103cb1d0b9cb3f7595226bec7230dcb78d4f2282..ec4674cdf2ead4fd259ff5fc42401f591e684ee9 100644 (file)
@@ -55,7 +55,7 @@ bool __blk_freeze_queue_start(struct request_queue *q,
                              struct task_struct *owner);
 int __bio_queue_enter(struct request_queue *q, struct bio *bio);
 void submit_bio_noacct_nocheck(struct bio *bio, bool split);
-void bio_await_chain(struct bio *bio);
+int bio_submit_or_kill(struct bio *bio, unsigned int flags);
 
 static inline bool blk_try_enter_queue(struct request_queue *q, bool pm)
 {
index 0b04661ac809821732069bc07ffacbf37cb84db6..fc3be0549aa7542eed4376ca2fac11e50400dbb1 100644 (file)
@@ -153,13 +153,7 @@ static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode,
        nr_sects = len >> SECTOR_SHIFT;
 
        blk_start_plug(&plug);
-       while (1) {
-               if (fatal_signal_pending(current)) {
-                       if (prev)
-                               bio_await_chain(prev);
-                       err = -EINTR;
-                       goto out_unplug;
-               }
+       while (!fatal_signal_pending(current)) {
                bio = blk_alloc_discard_bio(bdev, &sector, &nr_sects,
                                GFP_KERNEL);
                if (!bio)
@@ -167,12 +161,11 @@ static int blk_ioctl_discard(struct block_device *bdev, blk_mode_t mode,
                prev = bio_chain_and_submit(prev, bio);
        }
        if (prev) {
-               err = submit_bio_wait(prev);
+               err = bio_submit_or_kill(prev, BLKDEV_ZERO_KILLABLE);
                if (err == -EOPNOTSUPP)
                        err = 0;
                bio_put(prev);
        }
-out_unplug:
        blk_finish_plug(&plug);
 fail:
        filemap_invalidate_unlock(bdev->bd_mapping);