Instead of using the same check for the two layers of loops, count bio pages in the inner loop instead. Signed-off-by: Tom Yan <tom.ty89@xxxxxxxxx> --- block/blk-lib.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/block/blk-lib.c b/block/blk-lib.c index c1e9388a8fb8..354dcab760c7 100644 --- a/block/blk-lib.c +++ b/block/blk-lib.c @@ -318,7 +318,7 @@ static int __blkdev_issue_zero_pages(struct block_device *bdev, struct request_queue *q = bdev_get_queue(bdev); struct bio *bio = *biop; int bi_size = 0; - unsigned int sz; + unsigned int sz, bio_nr_pages; if (!q) return -ENXIO; @@ -327,19 +327,18 @@ static int __blkdev_issue_zero_pages(struct block_device *bdev, return -EPERM; while (nr_sects != 0) { - bio = blk_next_bio(bio, __blkdev_sectors_to_bio_pages(nr_sects), - gfp_mask); + bio_nr_pages = __blkdev_sectors_to_bio_pages(nr_sects); + bio = blk_next_bio(bio, bio_nr_pages, gfp_mask); bio->bi_iter.bi_sector = sector; bio_set_dev(bio, bdev); bio_set_op_attrs(bio, REQ_OP_WRITE, 0); - while (nr_sects != 0) { + while (bio_nr_pages != 0) { sz = min((sector_t) PAGE_SIZE, nr_sects << 9); bi_size = bio_add_page(bio, ZERO_PAGE(0), sz, 0); nr_sects -= bi_size >> 9; sector += bi_size >> 9; - if (bi_size < sz) - break; + bio_nr_pages--; } cond_resched(); } -- 2.29.2