summaryrefslogtreecommitdiff
path: root/util.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2011-05-23 17:21:35 +1000
committerNeilBrown <neilb@suse.de>2011-05-23 17:21:35 +1000
commit9e6d9291275267d3fd4b6d85d7232081f89cd8e2 (patch)
tree2536ecb26b6fd0ad3d9c311d58f475b3c524c988 /util.c
parentf4db7a6f3c3b9a0701f3063b287b7cb59ccecd07 (diff)
Check all member devices in enough_fd
The loop over all member devices in enough_fd could easily stop before it had found all devices. This would cause --re-add to fail incorrectly. So change the loop to be based on the reported number of devices in the device - with a safe-guard limit of 1024. Change some other loops to be more careful too. Reported-by: "Schmidt, Annemarie" <Annemarie.Schmidt@stratus.com> Signed-off-by: NeilBrown <neilb@suse.de>
Diffstat (limited to 'util.c')
-rw-r--r--util.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/util.c b/util.c
index 1056ae4a..e92be4fe 100644
--- a/util.c
+++ b/util.c
@@ -370,10 +370,14 @@ int enough_fd(int fd)
array.raid_disks <= 0)
return 0;
avail = calloc(array.raid_disks, 1);
- for (i=0; i<array.raid_disks + array.nr_disks; i++) {
+ for (i=0; i < 1024 && array.nr_disks > 0; i++) {
disk.number = i;
if (ioctl(fd, GET_DISK_INFO, &disk) != 0)
continue;
+ if (disk.major == 0 && disk.minor == 0)
+ continue;
+ array.nr_disks--;
+
if (! (disk.state & (1<<MD_DISK_SYNC)))
continue;
if (disk.raid_disk < 0 || disk.raid_disk >= array.raid_disks)
@@ -1256,10 +1260,13 @@ int check_partitions(int fd, char *dname, unsigned long long freesize,
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 < ainf->raid_disks + ainf->nr_disks ; d++)
- if (ioctl(mdfd, GET_DISK_INFO, disk) == 0)
+ for (d = 0 ; d < 1024 ; d++) {
+ if (ioctl(mdfd, GET_DISK_INFO, disk) == 0 &&
+ (disk->major || disk->minor))
return;
+ }
}
int open_container(int fd)