summaryrefslogtreecommitdiff
path: root/Monitor.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 /Monitor.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 'Monitor.c')
-rw-r--r--Monitor.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/Monitor.c b/Monitor.c
index 55aebeba..101bca4c 100644
--- a/Monitor.c
+++ b/Monitor.c
@@ -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) {