path: root/block
diff options
authorChristoph Hellwig <>2021-01-24 11:02:37 +0100
committerJens Axboe <>2021-01-24 18:17:20 -0700
commit99dfc43ecbf67f12a06512918aaba61d55863efc (patch)
treeb31f16b3272c8bef4c90c73e7383de74a64aee3c /block
parent30c5d3456c272f0de0d7e7eb9fc355fa64a5f649 (diff)
block: use ->bi_bdev for bio based I/O accounting
Rework the I/O accounting for bio based drivers to use ->bi_bdev. This means all drivers can now simply use bio_start_io_acct to start accounting, and it will take partitions into account automatically. To end I/O account either bio_end_io_acct can be used if the driver never remaps I/O to a different device, or bio_end_io_acct_remapped if the driver did remap the I/O. Signed-off-by: Christoph Hellwig <> Acked-by: Tejun Heo <> Signed-off-by: Jens Axboe <>
Diffstat (limited to 'block')
1 files changed, 13 insertions, 10 deletions
diff --git a/block/blk-core.c b/block/blk-core.c
index 1c1b97a82caa..9315311c27a9 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -1321,14 +1321,17 @@ static unsigned long __part_start_io_acct(struct block_device *part,
return now;
-unsigned long part_start_io_acct(struct gendisk *disk, struct block_device **part,
- struct bio *bio)
+ * bio_start_io_acct - start I/O accounting for bio based drivers
+ * @bio: bio to start account for
+ *
+ * Returns the start time that should be passed back to bio_end_io_acct().
+ */
+unsigned long bio_start_io_acct(struct bio *bio)
- *part = disk_map_sector_rcu(disk, bio->bi_iter.bi_sector);
- return __part_start_io_acct(*part, bio_sectors(bio), bio_op(bio));
+ return __part_start_io_acct(bio->bi_bdev, bio_sectors(bio), bio_op(bio));
unsigned long disk_start_io_acct(struct gendisk *disk, unsigned int sectors,
unsigned int op)
@@ -1351,12 +1354,12 @@ static void __part_end_io_acct(struct block_device *part, unsigned int op,
-void part_end_io_acct(struct block_device *part, struct bio *bio,
- unsigned long start_time)
+void bio_end_io_acct_remapped(struct bio *bio, unsigned long start_time,
+ struct block_device *orig_bdev)
- __part_end_io_acct(part, bio_op(bio), start_time);
+ __part_end_io_acct(orig_bdev, bio_op(bio), start_time);
void disk_end_io_acct(struct gendisk *disk, unsigned int op,
unsigned long start_time)