From: NeilBrown Move the pointers into mddev. The reduces dependance on MAX_MD_DEVS. --- 25-akpm/drivers/md/md.c | 27 +++++++++++++-------------- 25-akpm/include/linux/raid/md_k.h | 2 ++ 2 files changed, 15 insertions(+), 14 deletions(-) diff -puN drivers/md/md.c~md-08-remove-disks-array drivers/md/md.c --- 25/drivers/md/md.c~md-08-remove-disks-array Thu Jan 15 17:36:20 2004 +++ 25-akpm/drivers/md/md.c Thu Jan 15 17:36:20 2004 @@ -124,8 +124,6 @@ static ctl_table raid_root_table[] = { static struct block_device_operations md_fops; -static struct gendisk *disks[MAX_MD_DEVS]; - /* * Enables to iterate over all existing md arrays * all_mddevs_lock protects this list as well as mddev_map. @@ -1463,7 +1461,7 @@ static struct kobject *md_probe(dev_t de return NULL; down(&disks_sem); - if (disks[unit]) { + if (mddev->gendisk) { up(&disks_sem); mddev_put(mddev); return NULL; @@ -1481,7 +1479,7 @@ static struct kobject *md_probe(dev_t de disk->private_data = mddev; disk->queue = mddev->queue; add_disk(disk); - disks[mdidx(mddev)] = disk; + mddev->gendisk = disk; up(&disks_sem); return NULL; } @@ -1599,7 +1597,7 @@ static int do_md_run(mddev_t * mddev) unit = mdidx(mddev); md_probe(0, &unit, NULL); - disk = disks[unit]; + disk = mddev->gendisk; if (!disk) return -ENOMEM; @@ -1650,7 +1648,7 @@ static int do_md_run(mddev_t * mddev) static int restart_array(mddev_t *mddev) { - struct gendisk *disk = disks[mdidx(mddev)]; + struct gendisk *disk = mddev->gendisk; int err; /* @@ -1690,7 +1688,7 @@ out: static int do_md_stop(mddev_t * mddev, int ro) { int err = 0; - struct gendisk *disk = disks[mdidx(mddev)]; + struct gendisk *disk = mddev->gendisk; if (mddev->pers) { if (atomic_read(&mddev->active)>2) { @@ -1741,7 +1739,7 @@ static int do_md_stop(mddev_t * mddev, i export_array(mddev); mddev->array_size = 0; - disk = disks[mdidx(mddev)]; + disk = mddev->gendisk; if (disk) set_capacity(disk, 0); } else @@ -2530,7 +2528,7 @@ static int md_ioctl(struct inode *inode, err = put_user (4, (char *) &loc->sectors); if (err) goto abort_unlock; - err = put_user(get_capacity(disks[mdidx(mddev)])/8, + err = put_user(get_capacity(mddev->gendisk)/8, (short *) &loc->cylinders); if (err) goto abort_unlock; @@ -3572,6 +3570,8 @@ static void autostart_arrays(void) static __exit void md_exit(void) { + mddev_t *mddev; + struct list_head *tmp; int i; blk_unregister_region(MKDEV(MAJOR_NR,0), MAX_MD_DEVS); for (i=0; i < MAX_MD_DEVS; i++) @@ -3584,15 +3584,14 @@ static __exit void md_exit(void) #ifdef CONFIG_PROC_FS remove_proc_entry("mdstat", NULL); #endif - for (i = 0; i < MAX_MD_DEVS; i++) { - struct gendisk *disk = disks[i]; - mddev_t *mddev; - if (!disks[i]) + ITERATE_MDDEV(mddev,tmp) { + struct gendisk *disk = mddev->gendisk; + if (!disk) continue; - mddev = disk->private_data; export_array(mddev); del_gendisk(disk); put_disk(disk); + mddev->gendisk = NULL; mddev_put(mddev); } } diff -puN include/linux/raid/md_k.h~md-08-remove-disks-array include/linux/raid/md_k.h --- 25/include/linux/raid/md_k.h~md-08-remove-disks-array Thu Jan 15 17:36:20 2004 +++ 25-akpm/include/linux/raid/md_k.h Thu Jan 15 17:36:20 2004 @@ -191,6 +191,8 @@ struct mddev_s int sb_dirty; int ro; + struct gendisk *gendisk; + /* Superblock information */ int major_version, minor_version, _