From: NeilBrown <neilb@cse.unsw.edu.au>

stripe to be effective.  This patch sets ra_pages 
appropriately.



 drivers/md/raid0.c |   16 ++++++++++++++++
 drivers/md/raid5.c |   10 ++++++++++
 2 files changed, 26 insertions(+)

diff -puN drivers/md/raid0.c~md-2-set-ra_pages drivers/md/raid0.c
--- 25/drivers/md/raid0.c~md-2-set-ra_pages	2003-12-16 20:38:32.000000000 -0800
+++ 25-akpm/drivers/md/raid0.c	2003-12-16 20:38:32.000000000 -0800
@@ -311,6 +311,22 @@ static int raid0_run (mddev_t *mddev)
 		conf->hash_spacing++;
 	}
 
+	/* calculate the max read-ahead size.
+	 * For read-ahead of large files to be effective, we need to
+	 * readahead at least a whole stripe. i.e. number of devices
+	 * multiplied by chunk size.
+	 * If an individual device has an ra_pages greater than the
+	 * chunk size, then we will not drive that device as hard as it
+	 * wants.  We consider this a configuration error: a larger
+	 * chunksize should be used in that case.
+	 */
+	{
+		int stripe = mddev->raid_disks * mddev->chunk_size / PAGE_CACHE_SIZE;
+		if (mddev->queue->backing_dev_info.ra_pages < stripe)
+			mddev->queue->backing_dev_info.ra_pages = stripe;
+	}
+
+
 	blk_queue_merge_bvec(mddev->queue, raid0_mergeable_bvec);
 	return 0;
 
diff -puN drivers/md/raid5.c~md-2-set-ra_pages drivers/md/raid5.c
--- 25/drivers/md/raid5.c~md-2-set-ra_pages	2003-12-16 20:38:32.000000000 -0800
+++ 25-akpm/drivers/md/raid5.c	2003-12-16 20:38:32.000000000 -0800
@@ -1587,6 +1587,16 @@ memory = conf->max_nr_stripes * (sizeof(
 
 	print_raid5_conf(conf);
 
+	/* read-ahead size must cover a whole stripe, which is
+	 * (n-1) * chunksize where 'n' is the number of raid devices
+	 */
+	{
+		int stripe = (mddev->raid_disks-1) * mddev->chunk_size
+			/ PAGE_CACHE_SIZE;
+		if (mddev->queue->backing_dev_info.ra_pages < stripe)
+			mddev->queue->backing_dev_info.ra_pages = stripe;
+	}
+
 	/* Ok, everything is just fine now */
 	mddev->array_size =  mddev->size * (mddev->raid_disks - 1);
 	return 0;

_