Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 43996
b: refs/heads/master
c: 23032a0
h: refs/heads/master
v: v3
  • Loading branch information
Raz Ben-Jehuda(caro) authored and Linus Torvalds committed Dec 10, 2006
1 parent 8489182 commit a027b78
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 0d4ca600fcf5c5f3a0c195ccf37e989b83451dd4
refs/heads/master: 23032a0eb97c8eaae8ac9d17373b53b19d0f5413
24 changes: 24 additions & 0 deletions trunk/drivers/md/raid5.c
Original file line number Diff line number Diff line change
Expand Up @@ -2611,6 +2611,28 @@ static int raid5_congested(void *data, int bits)
return 0;
}

/* We want read requests to align with chunks where possible,
* but write requests don't need to.
*/
static int raid5_mergeable_bvec(request_queue_t *q, struct bio *bio, struct bio_vec *biovec)
{
mddev_t *mddev = q->queuedata;
sector_t sector = bio->bi_sector + get_start_sect(bio->bi_bdev);
int max;
unsigned int chunk_sectors = mddev->chunk_size >> 9;
unsigned int bio_sectors = bio->bi_size >> 9;

if (bio_data_dir(bio))
return biovec->bv_len; /* always allow writes to be mergeable */

max = (chunk_sectors - ((sector & (chunk_sectors - 1)) + bio_sectors)) << 9;
if (max < 0) max = 0;
if (max <= biovec->bv_len && bio_sectors == 0)
return biovec->bv_len;
else
return max;
}

static int make_request(request_queue_t *q, struct bio * bi)
{
mddev_t *mddev = q->queuedata;
Expand Down Expand Up @@ -3320,6 +3342,8 @@ static int run(mddev_t *mddev)
mddev->array_size = mddev->size * (conf->previous_raid_disks -
conf->max_degraded);

blk_queue_merge_bvec(mddev->queue, raid5_mergeable_bvec);

return 0;
abort:
if (conf) {
Expand Down

0 comments on commit a027b78

Please sign in to comment.