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 35a8f75..071c5f8 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 c5cf0db..2c49b41 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 eb14ec8..e36216d 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 c76e014..574e470 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 e1ea3a7..b424a6e 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 775f1dd..8af6392 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 c03093b..fc39d01 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 b392b9f..c0f85ff 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;