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:
parent
fcb844757f
commit
f1d267661d
11
managemon.c
11
managemon.c
|
@ -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;
|
||||
|
|
1
mdadm.h
1
mdadm.h
|
@ -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
|
||||
|
|
6
sysfs.c
6
sysfs.c
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue