mdmon: fix removed disk handling

Use SKIP_GONE_DEVS when reading the container, and correct some confused
logic in manage_new().

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
Dan Williams 2009-02-24 18:45:57 -07:00
parent dab4a5134e
commit 7da80e6faa
2 changed files with 11 additions and 8 deletions

View File

@ -283,7 +283,7 @@ static void manage_container(struct mdstat_ent *mdstat,
* To see what is removed and what is added.
* These need to be remove from, or added to, the array
*/
mdi = sysfs_read(-1, mdstat->devnum, GET_DEVS);
mdi = sysfs_read(-1, mdstat->devnum, GET_DEVS|SKIP_GONE_DEVS);
if (!mdi) {
/* invalidate the current count so we can try again */
container->devcnt = -1;
@ -460,7 +460,7 @@ static void manage_new(struct mdstat_ent *mdstat,
if (i == di->disk.raid_disk)
break;
if (di) {
if (di && newd) {
memcpy(newd, di, sizeof(*newd));
newd->state_fd = sysfs_open(new->devnum,
@ -469,13 +469,16 @@ static void manage_new(struct mdstat_ent *mdstat,
newd->prev_state = read_dev_state(newd->state_fd);
newd->curr_state = newd->prev_state;
} else if (failed + 1 > new->info.array.failed_disks) {
/* we cannot properly monitor without all working disks */
new->container = NULL;
break;
} else {
if (newd)
free(newd);
failed++;
free(newd);
if (failed > new->info.array.failed_disks) {
/* we cannot properly monitor without all working disks */
new->container = NULL;
break;
}
continue;
}
sprintf(newd->sys_name, "rd%d", i);

View File

@ -400,7 +400,7 @@ int mdmon(char *devname, int devnum, int scan, char *switchroot)
}
mdi = sysfs_read(mdfd, container->devnum,
GET_VERSION|GET_LEVEL|GET_DEVS);
GET_VERSION|GET_LEVEL|GET_DEVS|SKIP_GONE_DEVS);
if (!mdi) {
fprintf(stderr, "mdmon: failed to load sysfs info for %s\n",