diff --git a/Incremental.c b/Incremental.c index 30dc7a2..6cf2174 100644 --- a/Incremental.c +++ b/Incremental.c @@ -886,16 +886,10 @@ static int array_try_spare(char *devname, int *dfdp, struct dev_policy *pol, } sra = sysfs_read(-1, mp->devnm, GET_DEVS|GET_OFFSET|GET_SIZE|GET_STATE| - GET_DEGRADED|GET_COMPONENT|GET_VERSION); - if (!sra) { - /* Probably a container - no degraded info */ - sra = sysfs_read(-1, mp->devnm, - GET_DEVS|GET_OFFSET|GET_SIZE|GET_STATE| - GET_COMPONENT|GET_VERSION); - if (sra) - sra->array.failed_disks = -1; - } - if (!sra) + GET_COMPONENT|GET_VERSION); + if (sra) + sra->array.failed_disks = -1; + else continue; if (st == NULL) { int i; diff --git a/Monitor.c b/Monitor.c index 725f47d..bef2f1b 100644 --- a/Monitor.c +++ b/Monitor.c @@ -485,8 +485,8 @@ static int check_array(struct state *st, struct mdstat_ent *mdstat, if (st->devnm[0] == 0) strcpy(st->devnm, fd2devnm(fd)); - sra = sysfs_read(-1, st->devnm, GET_LEVEL | GET_DISKS | GET_DEGRADED | - GET_MISMATCH | GET_DEVS | GET_STATE); + sra = sysfs_read(-1, st->devnm, GET_LEVEL | GET_DISKS | GET_MISMATCH | + GET_DEVS | GET_STATE); if (!sra) goto disappeared; diff --git a/managemon.c b/managemon.c index a8df666..68f0c2d 100644 --- a/managemon.c +++ b/managemon.c @@ -685,8 +685,8 @@ static void manage_new(struct mdstat_ent *mdstat, mdi = sysfs_read(-1, mdstat->devnm, GET_LEVEL|GET_CHUNK|GET_DISKS|GET_COMPONENT| - GET_DEGRADED|GET_SAFEMODE| - GET_DEVS|GET_OFFSET|GET_SIZE|GET_STATE|GET_LAYOUT); + GET_SAFEMODE|GET_DEVS|GET_OFFSET|GET_SIZE|GET_STATE| + GET_LAYOUT); if (!mdi) return; diff --git a/mdadm.h b/mdadm.h index ec0a39e..ee9b837 100644 --- a/mdadm.h +++ b/mdadm.h @@ -637,7 +637,6 @@ enum sysfs_read_flags { GET_MISMATCH = (1 << 5), GET_VERSION = (1 << 6), GET_DISKS = (1 << 7), - GET_DEGRADED = (1 << 8), GET_SAFEMODE = (1 << 9), GET_BITMAP_LOCATION = (1 << 10), diff --git a/raid6check.c b/raid6check.c index 551f835..a8e6005 100644 --- a/raid6check.c +++ b/raid6check.c @@ -562,7 +562,7 @@ int main(int argc, char *argv[]) GET_LEVEL| GET_LAYOUT| GET_DISKS| - GET_DEGRADED | + GET_STATE | GET_COMPONENT| GET_CHUNK| GET_DEVS| diff --git a/sysfs.c b/sysfs.c index e47f5e4..78d2b52 100644 --- a/sysfs.c +++ b/sysfs.c @@ -162,18 +162,12 @@ struct mdinfo *sysfs_read(int fd, char *devnm, unsigned long options) goto abort; sra->array.layout = strtoul(buf, NULL, 0); } - if (options & GET_DISKS) { + if (options & (GET_DISKS|GET_STATE)) { strcpy(base, "raid_disks"); if (load_sys(fname, buf, sizeof(buf))) goto abort; sra->array.raid_disks = strtoul(buf, NULL, 0); } - if (options & GET_DEGRADED) { - strcpy(base, "degraded"); - if (load_sys(fname, buf, sizeof(buf))) - goto abort; - sra->array.failed_disks = strtoul(buf, NULL, 0); - } if (options & GET_COMPONENT) { strcpy(base, "component_size"); if (load_sys(fname, buf, sizeof(buf))) @@ -359,10 +353,9 @@ struct mdinfo *sysfs_read(int fd, char *devnm, unsigned long options) strcpy(dbase, "state"); if (load_sys(fname, buf, sizeof(buf))) goto abort; - if (strstr(buf, "faulty")) { + if (strstr(buf, "faulty")) dev->disk.state |= (1<array.failed_disks++; - } else { + else { sra->array.working_disks++; if (strstr(buf, "in_sync")) { dev->disk.state |= (1<errors = strtoul(buf, NULL, 0); } } + + if ((options & GET_STATE) && sra->array.raid_disks) + sra->array.failed_disks = sra->array.raid_disks - + sra->array.active_disks - sra->array.spare_disks; + closedir(dir); return sra;