mdmon: allow degraded arrays to be monitored

manage_new is too strict in the face of failed devices.  Teach it to
monitor degraded arrays.

Signed-off-by: Dan Williams <dan.j.williams@intel.com>
This commit is contained in:
Dan Williams 2008-08-15 10:58:43 -07:00
parent fcb844757f
commit f1d267661d
3 changed files with 15 additions and 3 deletions

View File

@ -341,6 +341,7 @@ static void manage_new(struct mdstat_ent *mdstat,
struct mdinfo *mdi, *di;
char *inst;
int i;
int failed = 0;
/* check if array is ready to be monitored */
if (!mdstat->active)
@ -348,7 +349,7 @@ static void manage_new(struct mdstat_ent *mdstat,
mdi = sysfs_read(-1, mdstat->devnum,
GET_LEVEL|GET_CHUNK|GET_DISKS|GET_COMPONENT|
GET_DEVS|GET_OFFSET|GET_SIZE|GET_STATE);
GET_DEGRADED|GET_DEVS|GET_OFFSET|GET_SIZE|GET_STATE);
new = malloc(sizeof(*new));
@ -390,10 +391,14 @@ static void manage_new(struct mdstat_ent *mdstat,
newd->prev_state = read_dev_state(newd->state_fd);
newd->curr_state = newd->prev_state;
} else {
/* we cannot properly monitor without all raid_disks */
} else if (failed + 1 > new->info.array.failed_disks) {
/* we cannot properly monitor without all working disks */
new->container = NULL;
break;
} else {
failed++;
free(newd);
continue;
}
sprintf(newd->sys_name, "rd%d", i);
newd->next = new->info.devs;

View File

@ -324,6 +324,7 @@ extern void map_add(struct map_ent **melp,
#define GET_MISMATCH 32
#define GET_VERSION 64
#define GET_DISKS 128
#define GET_DEGRADED 256
#define GET_DEVS 1024 /* gets role, major, minor */
#define GET_OFFSET 2048

View File

@ -153,6 +153,12 @@ struct mdinfo *sysfs_read(int fd, int devnum, unsigned long options)
goto abort;
sra->array.raid_disks = strtoul(buf, NULL, 0);
}
if (options & GET_DEGRADED) {
strcpy(base, "degraded");
if (load_sys(fname, buf))
goto abort;
sra->array.failed_disks = strtoul(buf, NULL, 0);
}
if (options & GET_COMPONENT) {
strcpy(base, "component_size");
if (load_sys(fname, buf))