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>
This commit is contained in:
NeilBrown 2012-04-18 09:06:02 +10:00
parent ae2416e7b6
commit 480f356641
3 changed files with 12 additions and 4 deletions

View File

@ -462,7 +462,7 @@ int Manage_subdevs(char *devname, int fd,
dv->devname, dv->disposition); dv->devname, dv->disposition);
goto abort; goto abort;
} }
for (; j < 1024 && remaining_disks > 0; j++) { for (; j < MAX_DISKS && remaining_disks > 0; j++) {
unsigned dev; unsigned dev;
disc.number = j; disc.number = j;
if (ioctl(fd, GET_DISK_INFO, &disc)) if (ioctl(fd, GET_DISK_INFO, &disc))
@ -495,7 +495,7 @@ int Manage_subdevs(char *devname, int fd,
dv->devname, dv->disposition); dv->devname, dv->disposition);
goto abort; goto abort;
} }
for (; j < 1024 && remaining_disks > 0; j++) { for (; j < MAX_DISKS && remaining_disks > 0; j++) {
int sfd; int sfd;
unsigned dev; unsigned dev;
disc.number = j; disc.number = j;

View File

@ -1388,4 +1388,12 @@ static inline int xasprintf(char **strp, const char *fmt, ...) {
#define PROCESS_DELAYED -2 #define PROCESS_DELAYED -2
#define PROCESS_PENDING -3 #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; extern int __offroot;

4
util.c
View File

@ -378,7 +378,7 @@ int enough_fd(int fd)
array.raid_disks <= 0) array.raid_disks <= 0)
return 0; return 0;
avail = calloc(array.raid_disks, 1); 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; disk.number = i;
if (ioctl(fd, GET_DISK_INFO, &disk) != 0) if (ioctl(fd, GET_DISK_INFO, &disk) != 0)
continue; continue;
@ -1275,7 +1275,7 @@ void get_one_disk(int mdfd, mdu_array_info_t *ainf, mdu_disk_info_t *disk)
int d; int d;
ioctl(mdfd, GET_ARRAY_INFO, ainf); 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 && if (ioctl(mdfd, GET_DISK_INFO, disk) == 0 &&
(disk->major || disk->minor)) (disk->major || disk->minor))
return; return;