diff options
| author | NeilBrown <neilb@suse.de> | 2010-03-25 01:20:56 -0400 |
|---|---|---|
| committer | NeilBrown <neilb@suse.de> | 2010-05-18 01:27:52 -0400 |
| commit | 490773268cf64f68da2470e07b52c7944da6312d (patch) | |
| tree | d394aafa7203c316db6b63f128b8894e18993fca | |
| parent | 2b7f22284d71975e37a82db154386348eec0e52c (diff) | |
md: move io accounting out of personalities into md_make_request
While I generally prefer letting personalities do as much as possible,
given that we have a central md_make_request anyway we may as well use
it to simplify code.
Also this centralises knowledge of ->gendisk which will help later.
Signed-off-by: NeilBrown <neilb@suse.de>
| -rw-r--r-- | drivers/md/linear.c | 8 | ||||
| -rw-r--r-- | drivers/md/md.c | 11 | ||||
| -rw-r--r-- | drivers/md/multipath.c | 8 | ||||
| -rw-r--r-- | drivers/md/raid0.c | 8 | ||||
| -rw-r--r-- | drivers/md/raid1.c | 7 | ||||
| -rw-r--r-- | drivers/md/raid10.c | 7 | ||||
| -rw-r--r-- | drivers/md/raid5.c | 8 |
7 files changed, 12 insertions, 45 deletions
diff --git a/drivers/md/linear.c b/drivers/md/linear.c index 9db8ee0614a4..3048c1704f40 100644 --- a/drivers/md/linear.c +++ b/drivers/md/linear.c | |||
| @@ -288,23 +288,15 @@ static int linear_stop (mddev_t *mddev) | |||
| 288 | 288 | ||
| 289 | static int linear_make_request (struct request_queue *q, struct bio *bio) | 289 | static int linear_make_request (struct request_queue *q, struct bio *bio) |
| 290 | { | 290 | { |
| 291 | const int rw = bio_data_dir(bio); | ||
| 292 | mddev_t *mddev = q->queuedata; | 291 | mddev_t *mddev = q->queuedata; |
| 293 | dev_info_t *tmp_dev; | 292 | dev_info_t *tmp_dev; |
| 294 | sector_t start_sector; | 293 | sector_t start_sector; |
| 295 | int cpu; | ||
| 296 | 294 | ||
| 297 | if (unlikely(bio_rw_flagged(bio, BIO_RW_BARRIER))) { | 295 | if (unlikely(bio_rw_flagged(bio, BIO_RW_BARRIER))) { |
| 298 | md_barrier_request(mddev, bio); | 296 | md_barrier_request(mddev, bio); |
| 299 | return 0; | 297 | return 0; |
| 300 | } | 298 | } |
| 301 | 299 | ||
| 302 | cpu = part_stat_lock(); | ||
| 303 | part_stat_inc(cpu, &mddev->gendisk->part0, ios[rw]); | ||
| 304 | part_stat_add(cpu, &mddev->gendisk->part0, sectors[rw], | ||
| 305 | bio_sectors(bio)); | ||
| 306 | part_stat_unlock(); | ||
| 307 | |||
| 308 | rcu_read_lock(); | 300 | rcu_read_lock(); |
| 309 | tmp_dev = which_dev(mddev, bio->bi_sector); | 301 | tmp_dev = which_dev(mddev, bio->bi_sector); |
| 310 | start_sector = tmp_dev->end_sector - tmp_dev->rdev->sectors; | 302 | start_sector = tmp_dev->end_sector - tmp_dev->rdev->sectors; |
diff --git a/drivers/md/md.c b/drivers/md/md.c index c5a1b0725c9f..117663d2a4e5 100644 --- a/drivers/md/md.c +++ b/drivers/md/md.c | |||
| @@ -214,8 +214,11 @@ static DEFINE_SPINLOCK(all_mddevs_lock); | |||
| 214 | */ | 214 | */ |
| 215 | static int md_make_request(struct request_queue *q, struct bio *bio) | 215 | static int md_make_request(struct request_queue *q, struct bio *bio) |
| 216 | { | 216 | { |
| 217 | const int rw = bio_data_dir(bio); | ||
| 217 | mddev_t *mddev = q->queuedata; | 218 | mddev_t *mddev = q->queuedata; |
| 218 | int rv; | 219 | int rv; |
| 220 | int cpu; | ||
| 221 | |||
| 219 | if (mddev == NULL || mddev->pers == NULL) { | 222 | if (mddev == NULL || mddev->pers == NULL) { |
| 220 | bio_io_error(bio); | 223 | bio_io_error(bio); |
| 221 | return 0; | 224 | return 0; |
| @@ -236,7 +239,15 @@ static int md_make_request(struct request_queue *q, struct bio *bio) | |||
| 236 | } | 239 | } |
| 237 | atomic_inc(&mddev->active_io); | 240 | atomic_inc(&mddev->active_io); |
| 238 | rcu_read_unlock(); | 241 | rcu_read_unlock(); |
| 242 | |||
| 239 | rv = mddev->pers->make_request(q, bio); | 243 | rv = mddev->pers->make_request(q, bio); |
| 244 | |||
| 245 | cpu = part_stat_lock(); | ||
| 246 | part_stat_inc(cpu, &mddev->gendisk->part0, ios[rw]); | ||
| 247 | part_stat_add(cpu, &mddev->gendisk->part0, sectors[rw], | ||
| 248 | bio_sectors(bio)); | ||
| 249 | part_stat_unlock(); | ||
| 250 | |||
| 240 | if (atomic_dec_and_test(&mddev->active_io) && mddev->suspended) | 251 | if (atomic_dec_and_test(&mddev->active_io) && mddev->suspended) |
| 241 | wake_up(&mddev->sb_wait); | 252 | wake_up(&mddev->sb_wait); |
| 242 | 253 | ||
diff --git a/drivers/md/multipath.c b/drivers/md/multipath.c index 97befd5cc0e3..5b4e2918663a 100644 --- a/drivers/md/multipath.c +++ b/drivers/md/multipath.c | |||
| @@ -141,8 +141,6 @@ static int multipath_make_request (struct request_queue *q, struct bio * bio) | |||
| 141 | multipath_conf_t *conf = mddev->private; | 141 | multipath_conf_t *conf = mddev->private; |
| 142 | struct multipath_bh * mp_bh; | 142 | struct multipath_bh * mp_bh; |
| 143 | struct multipath_info *multipath; | 143 | struct multipath_info *multipath; |
| 144 | const int rw = bio_data_dir(bio); | ||
| 145 | int cpu; | ||
| 146 | 144 | ||
| 147 | if (unlikely(bio_rw_flagged(bio, BIO_RW_BARRIER))) { | 145 | if (unlikely(bio_rw_flagged(bio, BIO_RW_BARRIER))) { |
| 148 | md_barrier_request(mddev, bio); | 146 | md_barrier_request(mddev, bio); |
| @@ -154,12 +152,6 @@ static int multipath_make_request (struct request_queue *q, struct bio * bio) | |||
| 154 | mp_bh->master_bio = bio; | 152 | mp_bh->master_bio = bio; |
| 155 | mp_bh->mddev = mddev; | 153 | mp_bh->mddev = mddev; |
| 156 | 154 | ||
| 157 | cpu = part_stat_lock(); | ||
| 158 | part_stat_inc(cpu, &mddev->gendisk->part0, ios[rw]); | ||
| 159 | part_stat_add(cpu, &mddev->gendisk->part0, sectors[rw], | ||
| 160 | bio_sectors(bio)); | ||
| 161 | part_stat_unlock(); | ||
| 162 | |||
| 163 | mp_bh->path = multipath_map(conf); | 155 | mp_bh->path = multipath_map(conf); |
| 164 | if (mp_bh->path < 0) { | 156 | if (mp_bh->path < 0) { |
| 165 | bio_endio(bio, -EIO); | 157 | bio_endio(bio, -EIO); |
diff --git a/drivers/md/raid0.c b/drivers/md/raid0.c index afddf624bad3..d535f9be39f4 100644 --- a/drivers/md/raid0.c +++ b/drivers/md/raid0.c | |||
| @@ -472,20 +472,12 @@ static int raid0_make_request(struct request_queue *q, struct bio *bio) | |||
| 472 | sector_t sector_offset; | 472 | sector_t sector_offset; |
| 473 | struct strip_zone *zone; | 473 | struct strip_zone *zone; |
| 474 | mdk_rdev_t *tmp_dev; | 474 | mdk_rdev_t *tmp_dev; |
| 475 | const int rw = bio_data_dir(bio); | ||
| 476 | int cpu; | ||
| 477 | 475 | ||
| 478 | if (unlikely(bio_rw_flagged(bio, BIO_RW_BARRIER))) { | 476 | if (unlikely(bio_rw_flagged(bio, BIO_RW_BARRIER))) { |
| 479 | md_barrier_request(mddev, bio); | 477 | md_barrier_request(mddev, bio); |
| 480 | return 0; | 478 | return 0; |
| 481 | } | 479 | } |
| 482 | 480 | ||
| 483 | cpu = part_stat_lock(); | ||
| 484 | part_stat_inc(cpu, &mddev->gendisk->part0, ios[rw]); | ||
| 485 | part_stat_add(cpu, &mddev->gendisk->part0, sectors[rw], | ||
| 486 | bio_sectors(bio)); | ||
| 487 | part_stat_unlock(); | ||
| 488 | |||
| 489 | chunk_sects = mddev->chunk_sectors; | 481 | chunk_sects = mddev->chunk_sectors; |
| 490 | if (unlikely(!is_io_in_chunk_boundary(mddev, chunk_sects, bio))) { | 482 | if (unlikely(!is_io_in_chunk_boundary(mddev, chunk_sects, bio))) { |
| 491 | sector_t sector = bio->bi_sector; | 483 | sector_t sector = bio->bi_sector; |
diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c index 23a7516abbfd..e277013ac808 100644 --- a/drivers/md/raid1.c +++ b/drivers/md/raid1.c | |||
| @@ -787,7 +787,6 @@ static int make_request(struct request_queue *q, struct bio * bio) | |||
| 787 | struct page **behind_pages = NULL; | 787 | struct page **behind_pages = NULL; |
| 788 | const int rw = bio_data_dir(bio); | 788 | const int rw = bio_data_dir(bio); |
| 789 | const bool do_sync = bio_rw_flagged(bio, BIO_RW_SYNCIO); | 789 | const bool do_sync = bio_rw_flagged(bio, BIO_RW_SYNCIO); |
| 790 | int cpu; | ||
| 791 | bool do_barriers; | 790 | bool do_barriers; |
| 792 | mdk_rdev_t *blocked_rdev; | 791 | mdk_rdev_t *blocked_rdev; |
| 793 | 792 | ||
| @@ -833,12 +832,6 @@ static int make_request(struct request_queue *q, struct bio * bio) | |||
| 833 | 832 | ||
| 834 | bitmap = mddev->bitmap; | 833 | bitmap = mddev->bitmap; |
| 835 | 834 | ||
| 836 | cpu = part_stat_lock(); | ||
| 837 | part_stat_inc(cpu, &mddev->gendisk->part0, ios[rw]); | ||
| 838 | part_stat_add(cpu, &mddev->gendisk->part0, sectors[rw], | ||
| 839 | bio_sectors(bio)); | ||
| 840 | part_stat_unlock(); | ||
| 841 | |||
| 842 | /* | 835 | /* |
| 843 | * make_request() can abort the operation when READA is being | 836 | * make_request() can abort the operation when READA is being |
| 844 | * used and no empty request is available. | 837 | * used and no empty request is available. |
diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c index 57d71d5d88f4..ca313d646fd1 100644 --- a/drivers/md/raid10.c +++ b/drivers/md/raid10.c | |||
| @@ -795,7 +795,6 @@ static int make_request(struct request_queue *q, struct bio * bio) | |||
| 795 | mirror_info_t *mirror; | 795 | mirror_info_t *mirror; |
| 796 | r10bio_t *r10_bio; | 796 | r10bio_t *r10_bio; |
| 797 | struct bio *read_bio; | 797 | struct bio *read_bio; |
| 798 | int cpu; | ||
| 799 | int i; | 798 | int i; |
| 800 | int chunk_sects = conf->chunk_mask + 1; | 799 | int chunk_sects = conf->chunk_mask + 1; |
| 801 | const int rw = bio_data_dir(bio); | 800 | const int rw = bio_data_dir(bio); |
| @@ -850,12 +849,6 @@ static int make_request(struct request_queue *q, struct bio * bio) | |||
| 850 | */ | 849 | */ |
| 851 | wait_barrier(conf); | 850 | wait_barrier(conf); |
| 852 | 851 | ||
| 853 | cpu = part_stat_lock(); | ||
| 854 | part_stat_inc(cpu, &mddev->gendisk->part0, ios[rw]); | ||
| 855 | part_stat_add(cpu, &mddev->gendisk->part0, sectors[rw], | ||
| 856 | bio_sectors(bio)); | ||
| 857 | part_stat_unlock(); | ||
| 858 | |||
| 859 | r10_bio = mempool_alloc(conf->r10bio_pool, GFP_NOIO); | 852 | r10_bio = mempool_alloc(conf->r10bio_pool, GFP_NOIO); |
| 860 | 853 | ||
| 861 | r10_bio->master_bio = bio; | 854 | r10_bio->master_bio = bio; |
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 7bfeba3ce1e0..c6ae7c194915 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -3879,7 +3879,7 @@ static int make_request(struct request_queue *q, struct bio * bi) | |||
| 3879 | sector_t logical_sector, last_sector; | 3879 | sector_t logical_sector, last_sector; |
| 3880 | struct stripe_head *sh; | 3880 | struct stripe_head *sh; |
| 3881 | const int rw = bio_data_dir(bi); | 3881 | const int rw = bio_data_dir(bi); |
| 3882 | int cpu, remaining; | 3882 | int remaining; |
| 3883 | 3883 | ||
| 3884 | if (unlikely(bio_rw_flagged(bi, BIO_RW_BARRIER))) { | 3884 | if (unlikely(bio_rw_flagged(bi, BIO_RW_BARRIER))) { |
| 3885 | /* Drain all pending writes. We only really need | 3885 | /* Drain all pending writes. We only really need |
| @@ -3894,12 +3894,6 @@ static int make_request(struct request_queue *q, struct bio * bi) | |||
| 3894 | 3894 | ||
| 3895 | md_write_start(mddev, bi); | 3895 | md_write_start(mddev, bi); |
| 3896 | 3896 | ||
| 3897 | cpu = part_stat_lock(); | ||
| 3898 | part_stat_inc(cpu, &mddev->gendisk->part0, ios[rw]); | ||
| 3899 | part_stat_add(cpu, &mddev->gendisk->part0, sectors[rw], | ||
| 3900 | bio_sectors(bi)); | ||
| 3901 | part_stat_unlock(); | ||
| 3902 | |||
| 3903 | if (rw == READ && | 3897 | if (rw == READ && |
| 3904 | mddev->reshape_position == MaxSector && | 3898 | mddev->reshape_position == MaxSector && |
| 3905 | chunk_aligned_read(q,bi)) | 3899 | chunk_aligned_read(q,bi)) |
