On Tue, Jan 25, 2022 at 08:19:06AM +0100, Christoph Hellwig wrote: > On Tue, Jan 25, 2022 at 07:16:34AM +0100, Christoph Hellwig wrote: > > So why not key off accouning off "rq->bio && rq->bio->bi_bdev" > > and remove the need for the flag and the second half of the assignment > > above? That is much less error probe and removes code size. > > Something like this, lightly tested: > Follows another simple way by accounting all request with bio attached, except for requests with kernel buffer. diff --git a/block/blk-map.c b/block/blk-map.c index 4526adde0156..1210b51c62ae 100644 --- a/block/blk-map.c +++ b/block/blk-map.c @@ -630,6 +630,8 @@ int blk_rq_map_kern(struct request_queue *q, struct request *rq, void *kbuf, struct bio *bio; int ret; + rq->rq_flags &= ~RQF_IO_STAT; + if (len > (queue_max_hw_sectors(q) << 9)) return -EINVAL; if (!len || !kbuf) diff --git a/block/blk-mq.c b/block/blk-mq.c index 72ae9955cf27..eac589d2c340 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -903,7 +903,7 @@ static void __blk_account_io_start(struct request *rq) /* passthrough requests can hold bios that do not have ->bi_bdev set */ if (rq->bio && rq->bio->bi_bdev) rq->part = rq->bio->bi_bdev; - else if (rq->q->disk) + else if (rq->q->disk && rq->bio) rq->part = rq->q->disk->part0; part_stat_lock(); Thanks, Ming