summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--managemon.c11
-rw-r--r--mdadm.h1
-rw-r--r--sysfs.c6
3 files changed, 15 insertions, 3 deletions
diff --git a/managemon.c b/managemon.c
index 7a1c063..0a251de 100644
--- a/managemon.c
+++ b/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;
diff --git a/mdadm.h b/mdadm.h
index 52d9435..12eef2a 100644
--- a/mdadm.h
+++ b/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
diff --git a/sysfs.c b/sysfs.c
index 0ea17eb..7ca40c3 100644
--- a/sysfs.c
+++ b/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))