diff options
author | NeilBrown <neilb@suse.de> | 2011-05-23 17:21:35 +1000 |
---|---|---|
committer | NeilBrown <neilb@suse.de> | 2011-05-23 17:21:35 +1000 |
commit | 9e6d9291275267d3fd4b6d85d7232081f89cd8e2 (patch) | |
tree | 2536ecb26b6fd0ad3d9c311d58f475b3c524c988 /Monitor.c | |
parent | f4db7a6f3c3b9a0701f3063b287b7cb59ccecd07 (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 'Monitor.c')
-rw-r--r-- | Monitor.c | 10 |
1 files changed, 8 insertions, 2 deletions
@@ -449,6 +449,8 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat, char *dev = st->devname; int fd; int i; + int remaining_disks; + int last_disk; if (test) alert("TestMessage", dev, NULL, ainfo); @@ -565,7 +567,8 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat, } st->percent = mse->percent; - for (i=0; i<MaxDisks && i <= array.raid_disks + array.nr_disks; + remaining_disks = array.nr_disks; + for (i=0; i<MaxDisks && remaining_disks > 0; i++) { mdu_disk_info_t disc; disc.number = i; @@ -573,9 +576,12 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat, info[i].state = disc.state; info[i].major = disc.major; info[i].minor = disc.minor; + if (disc.major || disc.minor) + remaining_disks --; } else info[i].major = info[i].minor = 0; } + last_disk = i; if (mse->metadata_version && strncmp(mse->metadata_version, "external:", 9) == 0 && @@ -596,7 +602,7 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat, int change; char *dv = NULL; disc.number = i; - if (i > array.raid_disks + array.nr_disks) { + if (i >= last_disk) { newstate = 0; disc.major = disc.minor = 0; } else if (info[i].major || info[i].minor) { |