On 2020/8/18 15:02, Song Liu wrote: > This enables proper statistics in /proc/diskstats for bcache partitions. > > Cc: Coly Li <colyli@xxxxxxx> > Signed-off-by: Song Liu <songliubraving@xxxxxx> The code looks good to me. It is fine to submit this bcache patch in your submission path. Reviewed-by: Coly Li <colyli@xxxxxxx> Thanks. Coly Li > --- > drivers/md/bcache/request.c | 14 ++++++++++---- > 1 file changed, 10 insertions(+), 4 deletions(-) > > diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c > index 7de82c67597ce..1d946f601f7eb 100644 > --- a/drivers/md/bcache/request.c > +++ b/drivers/md/bcache/request.c > @@ -475,6 +475,7 @@ struct search { > unsigned int read_dirty_data:1; > unsigned int cache_missed:1; > > + struct hd_struct *part; > unsigned long start_time; > > struct btree_op op; > @@ -669,7 +670,8 @@ static void bio_complete(struct search *s) > { > if (s->orig_bio) { > /* Count on bcache device */ > - disk_end_io_acct(s->d->disk, bio_op(s->orig_bio), s->start_time); > + part_end_io_acct(s->part, bio_op(s->orig_bio), s->start_time); > + hd_struct_put(s->part); > > trace_bcache_request_end(s->d, s->orig_bio); > s->orig_bio->bi_status = s->iop.status; > @@ -731,7 +733,8 @@ static inline struct search *search_alloc(struct bio *bio, > s->write = op_is_write(bio_op(bio)); > s->read_dirty_data = 0; > /* Count on the bcache device */ > - s->start_time = disk_start_io_acct(d->disk, bio_sectors(bio), bio_op(bio)); > + s->part = disk_map_sector_rcu(d->disk, bio->bi_iter.bi_sector); > + s->start_time = part_start_io_acct(s->part, bio_sectors(bio), bio_op(bio)); > s->iop.c = d->c; > s->iop.bio = NULL; > s->iop.inode = d->id; > @@ -1072,6 +1075,7 @@ struct detached_dev_io_private { > unsigned long start_time; > bio_end_io_t *bi_end_io; > void *bi_private; > + struct hd_struct *part; > }; > > static void detached_dev_end_io(struct bio *bio) > @@ -1083,7 +1087,8 @@ static void detached_dev_end_io(struct bio *bio) > bio->bi_private = ddip->bi_private; > > /* Count on the bcache device */ > - disk_end_io_acct(ddip->d->disk, bio_op(bio), ddip->start_time); > + part_end_io_acct(ddip->part, bio_op(bio), ddip->start_time); > + hd_struct_put(ddip->part); > > if (bio->bi_status) { > struct cached_dev *dc = container_of(ddip->d, > @@ -1109,7 +1114,8 @@ static void detached_dev_do_request(struct bcache_device *d, struct bio *bio) > ddip = kzalloc(sizeof(struct detached_dev_io_private), GFP_NOIO); > ddip->d = d; > /* Count on the bcache device */ > - ddip->start_time = disk_start_io_acct(d->disk, bio_sectors(bio), bio_op(bio)); > + ddip->part = disk_map_sector_rcu(d->disk, bio->bi_iter.bi_sector); > + ddip->start_time = part_start_io_acct(ddip->part, bio_sectors(bio), bio_op(bio)); > ddip->bi_end_io = bio->bi_end_io; > ddip->bi_private = bio->bi_private; > bio->bi_end_io = detached_dev_end_io; >