From: NeilBrown Update {read,write}{s,_sectors} on each request to an MD array. --- 25-akpm/drivers/md/linear.c | 8 ++++++++ 25-akpm/drivers/md/multipath.c | 7 +++++++ 25-akpm/drivers/md/raid0.c | 8 ++++++++ 25-akpm/drivers/md/raid1.c | 8 ++++++++ 25-akpm/drivers/md/raid5.c | 8 ++++++++ 25-akpm/drivers/md/raid6main.c | 8 ++++++++ 6 files changed, 47 insertions(+) diff -puN drivers/md/linear.c~md-04-personality-stats-collection drivers/md/linear.c --- 25/drivers/md/linear.c~md-04-personality-stats-collection Thu Jan 22 16:55:53 2004 +++ 25-akpm/drivers/md/linear.c Thu Jan 22 16:55:53 2004 @@ -208,6 +208,14 @@ static int linear_make_request (request_ dev_info_t *tmp_dev; sector_t block; + if (bio_data_dir(bio)==WRITE) { + disk_stat_inc(mddev->gendisk, writes); + disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bio)); + } else { + disk_stat_inc(mddev->gendisk, reads); + disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bio)); + } + tmp_dev = which_dev(mddev, bio->bi_sector); block = bio->bi_sector >> 1; diff -puN drivers/md/multipath.c~md-04-personality-stats-collection drivers/md/multipath.c --- 25/drivers/md/multipath.c~md-04-personality-stats-collection Thu Jan 22 16:55:53 2004 +++ 25-akpm/drivers/md/multipath.c Thu Jan 22 16:55:53 2004 @@ -167,6 +167,13 @@ static int multipath_make_request (reque mp_bh->master_bio = bio; mp_bh->mddev = mddev; + if (bio_data_dir(bio)==WRITE) { + disk_stat_inc(mddev->gendisk, writes); + disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bio)); + } else { + disk_stat_inc(mddev->gendisk, reads); + disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bio)); + } /* * read balancing logic: */ diff -puN drivers/md/raid0.c~md-04-personality-stats-collection drivers/md/raid0.c --- 25/drivers/md/raid0.c~md-04-personality-stats-collection Thu Jan 22 16:55:53 2004 +++ 25-akpm/drivers/md/raid0.c Thu Jan 22 16:55:53 2004 @@ -365,6 +365,14 @@ static int raid0_make_request (request_q unsigned long chunk; sector_t block, rsect; + if (bio_data_dir(bio)==WRITE) { + disk_stat_inc(mddev->gendisk, writes); + disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bio)); + } else { + disk_stat_inc(mddev->gendisk, reads); + disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bio)); + } + chunk_size = mddev->chunk_size >> 10; chunk_sects = mddev->chunk_size >> 9; chunksize_bits = ffz(~chunk_size); diff -puN drivers/md/raid1.c~md-04-personality-stats-collection drivers/md/raid1.c --- 25/drivers/md/raid1.c~md-04-personality-stats-collection Thu Jan 22 16:55:53 2004 +++ 25-akpm/drivers/md/raid1.c Thu Jan 22 16:55:53 2004 @@ -474,6 +474,14 @@ static int make_request(request_queue_t conf->nr_pending++; spin_unlock_irq(&conf->resync_lock); + if (bio_data_dir(bio)==WRITE) { + disk_stat_inc(mddev->gendisk, writes); + disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bio)); + } else { + disk_stat_inc(mddev->gendisk, reads); + disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bio)); + } + /* * make_request() can abort the operation when READA is being * used and no empty request is available. diff -puN drivers/md/raid5.c~md-04-personality-stats-collection drivers/md/raid5.c --- 25/drivers/md/raid5.c~md-04-personality-stats-collection Thu Jan 22 16:55:53 2004 +++ 25-akpm/drivers/md/raid5.c Thu Jan 22 16:55:53 2004 @@ -1326,6 +1326,14 @@ static int make_request (request_queue_t sector_t logical_sector, last_sector; struct stripe_head *sh; + if (bio_data_dir(bi)==WRITE) { + disk_stat_inc(mddev->gendisk, writes); + disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bi)); + } else { + disk_stat_inc(mddev->gendisk, reads); + disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bi)); + } + logical_sector = bi->bi_sector & ~(STRIPE_SECTORS-1); last_sector = bi->bi_sector + (bi->bi_size>>9); diff -puN drivers/md/raid6main.c~md-04-personality-stats-collection drivers/md/raid6main.c --- 25/drivers/md/raid6main.c~md-04-personality-stats-collection Thu Jan 22 16:55:53 2004 +++ 25-akpm/drivers/md/raid6main.c Thu Jan 22 16:55:53 2004 @@ -1488,6 +1488,14 @@ static int make_request (request_queue_t sector_t logical_sector, last_sector; struct stripe_head *sh; + if (bio_data_dir(bi)==WRITE) { + disk_stat_inc(mddev->gendisk, writes); + disk_stat_add(mddev->gendisk, write_sectors, bio_sectors(bi)); + } else { + disk_stat_inc(mddev->gendisk, reads); + disk_stat_add(mddev->gendisk, read_sectors, bio_sectors(bi)); + } + logical_sector = bi->bi_sector & ~(STRIPE_SECTORS-1); last_sector = bi->bi_sector + (bi->bi_size>>9); _