diff options
| -rw-r--r-- | drivers/md/raid5.c | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c index 52914d5cec76..b86ceba04f6f 100644 --- a/drivers/md/raid5.c +++ b/drivers/md/raid5.c | |||
| @@ -2611,6 +2611,28 @@ static int raid5_congested(void *data, int bits) | |||
| 2611 | return 0; | 2611 | return 0; |
| 2612 | } | 2612 | } |
| 2613 | 2613 | ||
| 2614 | /* We want read requests to align with chunks where possible, | ||
| 2615 | * but write requests don't need to. | ||
| 2616 | */ | ||
| 2617 | static int raid5_mergeable_bvec(request_queue_t *q, struct bio *bio, struct bio_vec *biovec) | ||
| 2618 | { | ||
| 2619 | mddev_t *mddev = q->queuedata; | ||
| 2620 | sector_t sector = bio->bi_sector + get_start_sect(bio->bi_bdev); | ||
| 2621 | int max; | ||
| 2622 | unsigned int chunk_sectors = mddev->chunk_size >> 9; | ||
| 2623 | unsigned int bio_sectors = bio->bi_size >> 9; | ||
| 2624 | |||
| 2625 | if (bio_data_dir(bio)) | ||
| 2626 | return biovec->bv_len; /* always allow writes to be mergeable */ | ||
| 2627 | |||
| 2628 | max = (chunk_sectors - ((sector & (chunk_sectors - 1)) + bio_sectors)) << 9; | ||
| 2629 | if (max < 0) max = 0; | ||
| 2630 | if (max <= biovec->bv_len && bio_sectors == 0) | ||
| 2631 | return biovec->bv_len; | ||
| 2632 | else | ||
| 2633 | return max; | ||
| 2634 | } | ||
| 2635 | |||
| 2614 | static int make_request(request_queue_t *q, struct bio * bi) | 2636 | static int make_request(request_queue_t *q, struct bio * bi) |
| 2615 | { | 2637 | { |
| 2616 | mddev_t *mddev = q->queuedata; | 2638 | mddev_t *mddev = q->queuedata; |
| @@ -3320,6 +3342,8 @@ static int run(mddev_t *mddev) | |||
| 3320 | mddev->array_size = mddev->size * (conf->previous_raid_disks - | 3342 | mddev->array_size = mddev->size * (conf->previous_raid_disks - |
| 3321 | conf->max_degraded); | 3343 | conf->max_degraded); |
| 3322 | 3344 | ||
| 3345 | blk_queue_merge_bvec(mddev->queue, raid5_mergeable_bvec); | ||
| 3346 | |||
| 3323 | return 0; | 3347 | return 0; |
| 3324 | abort: | 3348 | abort: |
| 3325 | if (conf) { | 3349 | if (conf) { |
