From: NeilBrown 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; _