Commit e8703fe1f5cdcff686f7eb0a46487b5a04a9324a

Authored by NeilBrown
Committed by Linus Torvalds
1 parent d33a56d363

[PATCH] md: remove MAX_MD_DEVS which is an arbitrary limit

Once upon a time we needed to fixed limit to the number of md devices,
probably because we preallocated some array.  This need no longer exists, but
we still have an arbitrary limit.

So remove MAX_MD_DEVS and allow as many devices as we can fit into the 'minor'
part of a device number.

Also remove some useless noise at init time (which reports MAX_MD_DEVS) and
remove MD_THREAD_NAME_MAX which hasn't been used for a while.

Signed-off-by: Neil Brown <neilb@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

Showing 3 changed files with 18 additions and 28 deletions Side-by-side Diff

... ... @@ -3409,6 +3409,7 @@
3409 3409  
3410 3410 printk(KERN_INFO "md: autorun ...\n");
3411 3411 while (!list_empty(&pending_raid_disks)) {
  3412 + int unit;
3412 3413 dev_t dev;
3413 3414 LIST_HEAD(candidates);
3414 3415 rdev0 = list_entry(pending_raid_disks.next,
3415 3416  
... ... @@ -3428,16 +3429,19 @@
3428 3429 * mostly sane superblocks. It's time to allocate the
3429 3430 * mddev.
3430 3431 */
3431   - if (rdev0->preferred_minor < 0 || rdev0->preferred_minor >= MAX_MD_DEVS) {
  3432 + if (part) {
  3433 + dev = MKDEV(mdp_major,
  3434 + rdev0->preferred_minor << MdpMinorShift);
  3435 + unit = MINOR(dev) >> MdpMinorShift;
  3436 + } else {
  3437 + dev = MKDEV(MD_MAJOR, rdev0->preferred_minor);
  3438 + unit = MINOR(dev);
  3439 + }
  3440 + if (rdev0->preferred_minor != unit) {
3432 3441 printk(KERN_INFO "md: unit number in %s is bad: %d\n",
3433 3442 bdevname(rdev0->bdev, b), rdev0->preferred_minor);
3434 3443 break;
3435 3444 }
3436   - if (part)
3437   - dev = MKDEV(mdp_major,
3438   - rdev0->preferred_minor << MdpMinorShift);
3439   - else
3440   - dev = MKDEV(MD_MAJOR, rdev0->preferred_minor);
3441 3445  
3442 3446 md_probe(dev, NULL, NULL);
3443 3447 mddev = mddev_find(dev);
3444 3448  
3445 3449  
... ... @@ -5524,23 +5528,16 @@
5524 5528  
5525 5529 static int __init md_init(void)
5526 5530 {
5527   - printk(KERN_INFO "md: md driver %d.%d.%d MAX_MD_DEVS=%d,"
5528   - " MD_SB_DISKS=%d\n",
5529   - MD_MAJOR_VERSION, MD_MINOR_VERSION,
5530   - MD_PATCHLEVEL_VERSION, MAX_MD_DEVS, MD_SB_DISKS);
5531   - printk(KERN_INFO "md: bitmap version %d.%d\n", BITMAP_MAJOR_HI,
5532   - BITMAP_MINOR);
5533   -
5534 5531 if (register_blkdev(MAJOR_NR, "md"))
5535 5532 return -1;
5536 5533 if ((mdp_major=register_blkdev(0, "mdp"))<=0) {
5537 5534 unregister_blkdev(MAJOR_NR, "md");
5538 5535 return -1;
5539 5536 }
5540   - blk_register_region(MKDEV(MAJOR_NR, 0), MAX_MD_DEVS, THIS_MODULE,
5541   - md_probe, NULL, NULL);
5542   - blk_register_region(MKDEV(mdp_major, 0), MAX_MD_DEVS<<MdpMinorShift, THIS_MODULE,
  5537 + blk_register_region(MKDEV(MAJOR_NR, 0), 1UL<<MINORBITS, THIS_MODULE,
5543 5538 md_probe, NULL, NULL);
  5539 + blk_register_region(MKDEV(mdp_major, 0), 1UL<<MINORBITS, THIS_MODULE,
  5540 + md_probe, NULL, NULL);
5544 5541  
5545 5542 register_reboot_notifier(&md_notifier);
5546 5543 raid_table_header = register_sysctl_table(raid_root_table, 1);
... ... @@ -5598,8 +5595,8 @@
5598 5595 mddev_t *mddev;
5599 5596 struct list_head *tmp;
5600 5597  
5601   - blk_unregister_region(MKDEV(MAJOR_NR,0), MAX_MD_DEVS);
5602   - blk_unregister_region(MKDEV(mdp_major,0), MAX_MD_DEVS << MdpMinorShift);
  5598 + blk_unregister_region(MKDEV(MAJOR_NR,0), 1U << MINORBITS);
  5599 + blk_unregister_region(MKDEV(mdp_major,0), 1U << MINORBITS);
5603 5600  
5604 5601 unregister_blkdev(MAJOR_NR,"md");
5605 5602 unregister_blkdev(mdp_major, "mdp");
include/linux/raid/md_k.h
... ... @@ -31,18 +31,15 @@
31 31 #define LEVEL_NONE (-1000000)
32 32  
33 33 #define MaxSector (~(sector_t)0)
34   -#define MD_THREAD_NAME_MAX 14
35 34  
36 35 typedef struct mddev_s mddev_t;
37 36 typedef struct mdk_rdev_s mdk_rdev_t;
38 37  
39   -#define MAX_MD_DEVS 256 /* Max number of md dev */
40   -
41 38 /*
42 39 * options passed in raidrun:
43 40 */
44 41  
45   -/* Currently this must fix in an 'int' */
  42 +/* Currently this must fit in an 'int' */
46 43 #define MAX_CHUNK_SIZE (1<<30)
47 44  
48 45 /*
... ... @@ -20,7 +20,7 @@
20 20 int level;
21 21 int chunk;
22 22 char *device_names;
23   -} md_setup_args[MAX_MD_DEVS] __initdata;
  23 +} md_setup_args[256] __initdata;
24 24  
25 25 static int md_setup_ents __initdata;
26 26  
... ... @@ -61,10 +61,6 @@
61 61 return 0;
62 62 }
63 63 str1 = str;
64   - if (minor >= MAX_MD_DEVS) {
65   - printk(KERN_WARNING "md: md=%d, Minor device number too high.\n", minor);
66   - return 0;
67   - }
68 64 for (ent=0 ; ent< md_setup_ents ; ent++)
69 65 if (md_setup_args[ent].minor == minor &&
70 66 md_setup_args[ent].partitioned == partitioned) {
... ... @@ -72,7 +68,7 @@
72 68 "Replacing previous definition.\n", partitioned?"d":"", minor);
73 69 break;
74 70 }
75   - if (ent >= MAX_MD_DEVS) {
  71 + if (ent >= ARRAY_SIZE(md_setup_args)) {
76 72 printk(KERN_WARNING "md: md=%s%d - too many md initialisations\n", partitioned?"d":"", minor);
77 73 return 0;
78 74 }