block: Handle bio_split() errors in bio_submit_split()
authorJohn Garry <john.g.garry@oracle.com>
Mon, 11 Nov 2024 11:21:47 +0000 (11:21 +0000)
committerJens Axboe <axboe@kernel.dk>
Mon, 11 Nov 2024 15:35:46 +0000 (08:35 -0700)
bio_split() may error, so check this.

Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Signed-off-by: John Garry <john.g.garry@oracle.com>
Link: https://lore.kernel.org/r/20241111112150.3756529-4-john.g.garry@oracle.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-merge.c

index d813d799cee72caa0755fec696f10b252efe91ac..4cbccdbba6381f9833ed20a515e644e38c2bbfa8 100644 (file)
@@ -107,17 +107,18 @@ static unsigned int bio_allowed_max_sectors(const struct queue_limits *lim)
 
 static struct bio *bio_submit_split(struct bio *bio, int split_sectors)
 {
-       if (unlikely(split_sectors < 0)) {
-               bio->bi_status = errno_to_blk_status(split_sectors);
-               bio_endio(bio);
-               return NULL;
-       }
+       if (unlikely(split_sectors < 0))
+               goto error;
 
        if (split_sectors) {
                struct bio *split;
 
                split = bio_split(bio, split_sectors, GFP_NOIO,
                                &bio->bi_bdev->bd_disk->bio_split);
+               if (IS_ERR(split)) {
+                       split_sectors = PTR_ERR(split);
+                       goto error;
+               }
                split->bi_opf |= REQ_NOMERGE;
                blkcg_bio_issue_init(split);
                bio_chain(split, bio);
@@ -128,6 +129,10 @@ static struct bio *bio_submit_split(struct bio *bio, int split_sectors)
        }
 
        return bio;
+error:
+       bio->bi_status = errno_to_blk_status(split_sectors);
+       bio_endio(bio);
+       return NULL;
 }
 
 struct bio *bio_split_discard(struct bio *bio, const struct queue_limits *lim,