You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
5.0 KiB
163 lines
5.0 KiB
From b13b52c80f3d9e3184ea1d6d39aa7053ef7bae49 Mon Sep 17 00:00:00 2001 |
|
From: Tomasz Majchrzak <tomasz.majchrzak@intel.com> |
|
Date: Wed, 31 May 2017 12:46:57 +0200 |
|
Subject: [RHEL7.5 PATCH 151/169] 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> |
|
--- |
|
Incremental.c | 14 ++++---------- |
|
Monitor.c | 4 ++-- |
|
managemon.c | 4 ++-- |
|
mdadm.h | 1 - |
|
raid6check.c | 2 +- |
|
sysfs.c | 18 ++++++++---------- |
|
6 files changed, 17 insertions(+), 26 deletions(-) |
|
|
|
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<<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; |
|
|
|
-- |
|
2.7.4 |
|
|
|
|