The function null_submit_bio() used for null_blk devices configured with a BIO-based queue never splits BIOs according to the queue limits set with the various module and configfs parameters that the user can specify. Add a call to bio_split_to_limits() to correctly handle large BIOs that need splitting. Doing so also fixes issues with zoned devices as a large BIO may cross over a zone boundary, which breaks null_blk zone emulation. While at it, remove all the local variable that are not necessary. Signed-off-by: Damien Le Moal <dlemoal@xxxxxxxxxx> --- drivers/block/null_blk/main.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/drivers/block/null_blk/main.c b/drivers/block/null_blk/main.c index 36755f263e8e..514c2592046a 100644 --- a/drivers/block/null_blk/main.c +++ b/drivers/block/null_blk/main.c @@ -1528,12 +1528,16 @@ static struct nullb_queue *nullb_to_queue(struct nullb *nullb) static void null_submit_bio(struct bio *bio) { - sector_t sector = bio->bi_iter.bi_sector; - sector_t nr_sectors = bio_sectors(bio); - struct nullb *nullb = bio->bi_bdev->bd_disk->private_data; - struct nullb_queue *nq = nullb_to_queue(nullb); + struct nullb_queue *nq = + nullb_to_queue(bio->bi_bdev->bd_disk->private_data); + + /* Respect the queue limits */ + bio = bio_split_to_limits(bio); + if (!bio) + return; - null_handle_cmd(alloc_cmd(nq, bio), sector, nr_sectors, bio_op(bio)); + null_handle_cmd(alloc_cmd(nq, bio), bio->bi_iter.bi_sector, + bio_sectors(bio), bio_op(bio)); } #ifdef CONFIG_BLK_DEV_NULL_BLK_FAULT_INJECTION -- 2.43.0