Get failed disk count from array state
Recent commit has changed the way failed disks are counted. It breaks recovery for external metadata arrays as failed disks are not part of the array and have no corresponding entries is sysfs (they are only reported for containers) so degraded arrays show no failed disks. Recent commit overwrites GET_DEGRADED result prior to GET_STATE and it is not set again if GET_STATE has not been requested. As GET_STATE provides the same information as GET_DEGRADED, the latter is not needed anymore. Remove GET_DEGRADED option and replace it with GET_STATE option. Don't count number of failed disks looking at sysfs entries but calculate it at the end. Do it only for arrays as containers report no disks, just spares. Signed-off-by: Tomasz Majchrzak <tomasz.majchrzak@intel.com> Signed-off-by: Jes Sorensen <jsorensen@fb.com>
This commit is contained in:
parent
07c45a1871
commit
b13b52c80f
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
1
mdadm.h
1
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),
|
||||
|
||||
|
|
|
@ -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|
|
||||
|
|
18
sysfs.c
18
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<<MD_DISK_FAULTY);
|
||||
sra->array.failed_disks++;
|
||||
} else {
|
||||
else {
|
||||
sra->array.working_disks++;
|
||||
if (strstr(buf, "in_sync")) {
|
||||
dev->disk.state |= (1<<MD_DISK_SYNC);
|
||||
|
@ -379,6 +372,11 @@ struct mdinfo *sysfs_read(int fd, char *devnm, unsigned long options)
|
|||
dev->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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue