block: handle bio_split_to_limits() NULL return
authorJens Axboe <axboe@kernel.dk>
Wed, 4 Jan 2023 15:51:19 +0000 (08:51 -0700)
committerJens Axboe <axboe@kernel.dk>
Wed, 4 Jan 2023 16:05:23 +0000 (09:05 -0700)
This can't happen right now, but in preparation for allowing
bio_split_to_limits() returning NULL if it ended the bio, check for it
in all the callers.

Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-merge.c
block/blk-mq.c
drivers/block/drbd/drbd_req.c
drivers/block/ps3vram.c
drivers/md/dm.c
drivers/md/md.c
drivers/nvme/host/multipath.c
drivers/s390/block/dcssblk.c

index 35a8f75cc45d1c7c8e63ecad419a19368a4e0260..071c5f8cf0cfecbb57cdb7796731d007c0e5429e 100644 (file)
@@ -358,11 +358,13 @@ struct bio *__bio_split_to_limits(struct bio *bio,
        default:
                split = bio_split_rw(bio, lim, nr_segs, bs,
                                get_max_io_size(bio, lim) << SECTOR_SHIFT);
+               if (IS_ERR(split))
+                       return NULL;
                break;
        }
 
        if (split) {
-               /* there isn't chance to merge the splitted bio */
+               /* there isn't chance to merge the split bio */
                split->bi_opf |= REQ_NOMERGE;
 
                blkcg_bio_issue_init(split);
index c5cf0dbca1db8dcae3930451b0ba56161e91753c..2c49b4151da15d419cc16b4fec553ed6d1939e00 100644 (file)
@@ -2951,8 +2951,11 @@ void blk_mq_submit_bio(struct bio *bio)
        blk_status_t ret;
 
        bio = blk_queue_bounce(bio, q);
-       if (bio_may_exceed_limits(bio, &q->limits))
+       if (bio_may_exceed_limits(bio, &q->limits)) {
                bio = __bio_split_to_limits(bio, &q->limits, &nr_segs);
+               if (!bio)
+                       return;
+       }
 
        if (!bio_integrity_prep(bio))
                return;
index eb14ec8ec04cfcaf46011809fae0c8fb9f6e8428..e36216d50753c83843e3222632872ae76c685ccd 100644 (file)
@@ -1607,6 +1607,8 @@ void drbd_submit_bio(struct bio *bio)
        struct drbd_device *device = bio->bi_bdev->bd_disk->private_data;
 
        bio = bio_split_to_limits(bio);
+       if (!bio)
+               return;
 
        /*
         * what we "blindly" assume:
index c76e0148eada3302a04b81a886fa7cdb34df2de1..574e470b220b09bf3e032f14a60998cfe5d833ce 100644 (file)
@@ -587,6 +587,8 @@ static void ps3vram_submit_bio(struct bio *bio)
        dev_dbg(&dev->core, "%s\n", __func__);
 
        bio = bio_split_to_limits(bio);
+       if (!bio)
+               return;
 
        spin_lock_irq(&priv->lock);
        busy = !bio_list_empty(&priv->list);
index e1ea3a7bd9d9f869beafc24ef67ae7757f107915..b424a6ee27baf22a7ccbf22019d34c74cbc3bf7b 100644 (file)
@@ -1742,6 +1742,8 @@ static void dm_split_and_process_bio(struct mapped_device *md,
                 * otherwise associated queue_limits won't be imposed.
                 */
                bio = bio_split_to_limits(bio);
+               if (!bio)
+                       return;
        }
 
        init_clone_info(&ci, md, map, bio, is_abnormal);
index 775f1dde190a2eea4acfb51bafd47203fb3d877a..8af639296b3c852b36047dc299a54c71ec99481b 100644 (file)
@@ -455,6 +455,8 @@ static void md_submit_bio(struct bio *bio)
        }
 
        bio = bio_split_to_limits(bio);
+       if (!bio)
+               return;
 
        if (mddev->ro == MD_RDONLY && unlikely(rw == WRITE)) {
                if (bio_sectors(bio) != 0)
index c03093b6813c599dd5fde84d410438e70ae95a43..fc39d01e7b63be8a4f9e794f915715cbc2c8609b 100644 (file)
@@ -376,6 +376,8 @@ static void nvme_ns_head_submit_bio(struct bio *bio)
         * pool from the original queue to allocate the bvecs from.
         */
        bio = bio_split_to_limits(bio);
+       if (!bio)
+               return;
 
        srcu_idx = srcu_read_lock(&head->srcu);
        ns = nvme_find_path(head);
index b392b9f5482e0e1f3c3e3c67118876981b7cfe7a..c0f85ffb2b62de7ae80c32b456fc49673e57e50e 100644 (file)
@@ -865,6 +865,8 @@ dcssblk_submit_bio(struct bio *bio)
        unsigned long bytes_done;
 
        bio = bio_split_to_limits(bio);
+       if (!bio)
+               return;
 
        bytes_done = 0;
        dev_info = bio->bi_bdev->bd_disk->private_data;