Commit e8703fe1f5cdcff686f7eb0a46487b5a04a9324a
Committed by
Linus Torvalds
1 parent
d33a56d363
Exists in
master
and in
39 other branches
[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
drivers/md/md.c
... | ... | @@ -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 | /* |
init/do_mounts_md.c
... | ... | @@ -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 | } |