From f1d267661dc681dfe9bc1c9c6ad246617206d30f Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Fri, 15 Aug 2008 10:58:43 -0700 Subject: [PATCH] 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 --- managemon.c | 11 ++++++++--- mdadm.h | 1 + sysfs.c | 6 ++++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/managemon.c b/managemon.c index 7a1c0633..0a251de7 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 52d94352..12eef2a2 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 0ea17eb9..7ca40c3a 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)) -- 2.39.2