-Merge IO requests to try and get larger requests on underlying drives.
-
-Index: linux-2.6.9/drivers/md/raid5.c
-===================================================================
---- linux-2.6.9.orig/drivers/md/raid5.c 2006-05-22 00:10:04.000000000 +0400
-+++ linux-2.6.9/drivers/md/raid5.c 2006-05-22 00:10:06.000000000 +0400
-@@ -934,6 +934,26 @@ static void add_stripe_bio (struct strip
+diff -pur linux-2.6.9-67.orig/drivers/md/raid5.c linux-2.6.9-67/drivers/md/raid5.c
+--- linux-2.6.9-67.orig/drivers/md/raid5.c 2009-02-20 16:06:12.000000000 +0800
++++ linux-2.6.9-67/drivers/md/raid5.c 2009-02-20 16:06:37.000000000 +0800
+@@ -852,6 +852,26 @@ static void add_stripe_bio (struct strip
}
}
/*
* handle_stripe - do things to a stripe.
-@@ -953,7 +973,7 @@ static void add_stripe_bio (struct strip
+@@ -871,7 +891,7 @@ static void add_stripe_bio (struct strip
*
*/
{
raid5_conf_t *conf = sh->raid_conf;
int disks = conf->raid_disks;
-@@ -1376,7 +1396,11 @@ static void handle_stripe(struct stripe_
+@@ -1291,7 +1311,11 @@ static void handle_stripe(struct stripe_
bi->bi_size = STRIPE_SIZE;
bi->bi_next = NULL;
atomic_inc(&conf->out_reqs_in_queue);
} else {
PRINTK("skip op %ld on disc %d for sector %llu\n",
bi->bi_rw, i, (unsigned long long)sh->sector);
-@@ -1501,6 +1525,7 @@ static int make_request (request_queue_t
+@@ -1416,6 +1440,7 @@ static int make_request (request_queue_t
int sectors_per_chunk = conf->chunk_size >> 9;
int stripes_per_chunk, sectors_per_block;
int sectors_per_stripe;
+ struct bio *bios[MD_SB_DISKS];
int i, j;
- atomic_inc(&conf->in_reqs_in_queue);
-@@ -1530,6 +1555,7 @@ static int make_request (request_queue_t
+ if (unlikely(bio_barrier(bi))) {
+@@ -1450,6 +1475,7 @@ static int make_request (request_queue_t
sector_div(block, sectors_per_block);
sectors = bi->bi_size >> 9;
+ memset(&bios, 0, sizeof(bios));
repeat:
- stripe = block * sectors_per_block / data_disks;
+ stripe = block * (sectors_per_block / data_disks);
b_sector = stripe * data_disks;
-@@ -1549,9 +1575,17 @@ repeat:
+@@ -1469,9 +1495,17 @@ repeat:
new_sector = raid5_compute_sector(r_sector, raid_disks,
data_disks, &dd_idx,
&pd_idx, conf);
if (sh) {
add_stripe_bio(sh, bi, dd_idx, (bi->bi_rw&RW_MASK));
} else {
-@@ -1571,7 +1605,7 @@ repeat:
+@@ -1491,7 +1525,7 @@ repeat:
}
if (sh) {
raid5_plug_device(conf);
release_stripe(sh);
sh = NULL;
}
-@@ -1581,6 +1615,9 @@ repeat:
+@@ -1501,6 +1535,9 @@ repeat:
if (sectors > 0)
goto repeat;
spin_lock_irq(&conf->device_lock);
if (--bi->bi_phys_segments == 0) {
int bytes = bi->bi_size;
-@@ -1636,7 +1673,7 @@ static int sync_request (mddev_t *mddev,
+@@ -1556,7 +1593,7 @@ static int sync_request (mddev_t *mddev,
clear_bit(STRIPE_INSYNC, &sh->state);
spin_unlock(&sh->lock);
release_stripe(sh);
return STRIPE_SECTORS;
-@@ -1685,7 +1722,7 @@ static void raid5d (mddev_t *mddev)
+@@ -1605,9 +1642,11 @@ static void raid5d (mddev_t *mddev)
handled++;
atomic_inc(&conf->handled_in_raid5d);
+ handle_stripe(sh, NULL);
release_stripe(sh);
++ cond_resched();
++
spin_lock_irq(&conf->device_lock);
+ }
+ PRINTK("%d stripes handled\n", handled);