diff options
author | NeilBrown <neilb@suse.de> | 2012-04-18 09:06:02 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2012-04-18 09:06:02 +1000 |
commit | 480f3566411675ec41f18e5f6e15429f891e144c (patch) | |
tree | 8852fa9e20dbc83625bc53356b220231819e86ca | |
parent | ae2416e7b6937b9414321c5239e2ad415f7c1988 (diff) | |
download | mdadm-480f3566411675ec41f18e5f6e15429f891e144c.tar.gz |
Raid limit of 1024 when scanning for devices.
When we can for devices using GET_DISK_INFO we currently
limit to 1024. But some arrays can have more than this.
So raise it to 4096 and make the constant a #define.
Signed-off-by: NeilBrown <neilb@suse.de>
-rw-r--r-- | Manage.c | 4 | ||||
-rw-r--r-- | mdadm.h | 8 | ||||
-rw-r--r-- | util.c | 4 |
3 files changed, 12 insertions, 4 deletions
@@ -462,7 +462,7 @@ int Manage_subdevs(char *devname, int fd, dv->devname, dv->disposition); goto abort; } - for (; j < 1024 && remaining_disks > 0; j++) { + for (; j < MAX_DISKS && remaining_disks > 0; j++) { unsigned dev; disc.number = j; if (ioctl(fd, GET_DISK_INFO, &disc)) @@ -495,7 +495,7 @@ int Manage_subdevs(char *devname, int fd, dv->devname, dv->disposition); goto abort; } - for (; j < 1024 && remaining_disks > 0; j++) { + for (; j < MAX_DISKS && remaining_disks > 0; j++) { int sfd; unsigned dev; disc.number = j; @@ -1388,4 +1388,12 @@ static inline int xasprintf(char **strp, const char *fmt, ...) { #define PROCESS_DELAYED -2 #define PROCESS_PENDING -3 +/* When using "GET_DISK_INFO" it isn't certain how high + * we need to check. So we impose an absolute limit of + * MAX_DISKS. This needs to be much more than the largest + * number of devices any metadata can support. Currently + * v1.x can support 1920 + */ +#define MAX_DISKS 4096 + extern int __offroot; @@ -378,7 +378,7 @@ int enough_fd(int fd) array.raid_disks <= 0) return 0; avail = calloc(array.raid_disks, 1); - for (i=0; i < 1024 && array.nr_disks > 0; i++) { + for (i=0; i < MAX_DISKS && array.nr_disks > 0; i++) { disk.number = i; if (ioctl(fd, GET_DISK_INFO, &disk) != 0) continue; @@ -1275,7 +1275,7 @@ void get_one_disk(int mdfd, mdu_array_info_t *ainf, mdu_disk_info_t *disk) int d; ioctl(mdfd, GET_ARRAY_INFO, ainf); - for (d = 0 ; d < 1024 ; d++) { + for (d = 0 ; d < MAX_DISKS ; d++) { if (ioctl(mdfd, GET_DISK_INFO, disk) == 0 && (disk->major || disk->minor)) return; |