Skip to content

Commit

Permalink
block: handle bio_split_to_limits() NULL return
Browse files Browse the repository at this point in the history
commit 613b148 upstream.

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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Jens Axboe authored and Greg Kroah-Hartman committed Jan 18, 2023
1 parent e62e625 commit 73a630b
Showing 8 changed files with 19 additions and 2 deletions.
4 changes: 3 additions & 1 deletion block/blk-merge.c
Original file line number Diff line number Diff line change
@@ -358,11 +358,13 @@ struct bio *__bio_split_to_limits(struct bio *bio, struct queue_limits *lim,
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);
5 changes: 4 additions & 1 deletion block/blk-mq.c
Original file line number Diff line number Diff line change
@@ -2919,8 +2919,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;
2 changes: 2 additions & 0 deletions drivers/block/drbd/drbd_req.c
Original file line number Diff line number Diff line change
@@ -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:
2 changes: 2 additions & 0 deletions drivers/block/ps3vram.c
Original file line number Diff line number Diff line change
@@ -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);
2 changes: 2 additions & 0 deletions drivers/md/dm.c
Original file line number Diff line number Diff line change
@@ -1755,6 +1755,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);
2 changes: 2 additions & 0 deletions drivers/md/md.c
Original file line number Diff line number Diff line change
@@ -443,6 +443,8 @@ static void md_submit_bio(struct bio *bio)
}

bio = bio_split_to_limits(bio);
if (!bio)
return;

if (mddev->ro == 1 && unlikely(rw == WRITE)) {
if (bio_sectors(bio) != 0)
2 changes: 2 additions & 0 deletions drivers/nvme/host/multipath.c
Original file line number Diff line number Diff line change
@@ -351,6 +351,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);
2 changes: 2 additions & 0 deletions drivers/s390/block/dcssblk.c
Original file line number Diff line number Diff line change
@@ -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;

0 comments on commit 73a630b

Please sign in to comment.