diff options
Diffstat (limited to 'drivers/md/raid5.c')
-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) { |