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.
164 lines
5.0 KiB
164 lines
5.0 KiB
6 years ago
|
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
|
||
|
|