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.
111 lines
3.4 KiB
111 lines
3.4 KiB
From a822017f30e0dadc60a687900c2aa4da32e09a93 Mon Sep 17 00:00:00 2001 |
|
From: Mariusz Tkaczyk <mariusz.tkaczyk@intel.com> |
|
Date: Thu, 10 Aug 2017 11:43:48 +0200 |
|
Subject: [RHEL7.5 PATCH 162/169] Detail: correct output for active arrays |
|
|
|
The check for inactive array is incorrect as it compares it against |
|
active array. Introduce a new function md_is_array_active so the check |
|
is consistent across the code. |
|
|
|
As the output contains list of disks in the array include this |
|
information in sysfs read. |
|
|
|
Signed-off-by: Mariusz Tkaczyk <mariusz.tkaczyk@intel.com> |
|
Signed-off-by: Jes Sorensen <jsorensen@fb.com> |
|
--- |
|
Detail.c | 15 +++++++-------- |
|
mdadm.h | 1 + |
|
util.c | 15 +++++++++------ |
|
3 files changed, 17 insertions(+), 14 deletions(-) |
|
|
|
diff --git a/Detail.c b/Detail.c |
|
index 2332b85..2c9fb24 100644 |
|
--- a/Detail.c |
|
+++ b/Detail.c |
|
@@ -86,7 +86,8 @@ int Detail(char *dev, struct context *c) |
|
dev, strerror(errno)); |
|
return rv; |
|
} |
|
- sra = sysfs_read(fd, NULL, GET_VERSION | GET_DEVS | GET_ARRAY_STATE); |
|
+ sra = sysfs_read(fd, NULL, GET_VERSION | GET_DEVS | |
|
+ GET_ARRAY_STATE | GET_STATE); |
|
if (!sra) { |
|
if (md_get_array_info(fd, &array)) { |
|
pr_err("%s does not appear to be an md device\n", dev); |
|
@@ -96,8 +97,7 @@ int Detail(char *dev, struct context *c) |
|
} |
|
external = (sra != NULL && sra->array.major_version == -1 && |
|
sra->array.minor_version == -2); |
|
- inactive = (sra->array_state == ARRAY_ACTIVE || |
|
- sra->array_state == ARRAY_CLEAR); |
|
+ inactive = (sra != NULL && !md_array_is_active(sra)); |
|
st = super_by_fd(fd, &subarray); |
|
if (md_get_array_info(fd, &array)) { |
|
if (errno == ENODEV) { |
|
@@ -314,11 +314,10 @@ int Detail(char *dev, struct context *c) |
|
next = array.raid_disks * 2; |
|
if (inactive) { |
|
struct mdinfo *mdi; |
|
- if (sra != NULL) |
|
- for (mdi = sra->devs; mdi; mdi = mdi->next) { |
|
- disks[next++] = mdi->disk; |
|
- disks[next - 1].number = -1; |
|
- } |
|
+ for (mdi = sra->devs; mdi; mdi = mdi->next) { |
|
+ disks[next++] = mdi->disk; |
|
+ disks[next - 1].number = -1; |
|
+ } |
|
} else for (d = 0; d < max_disks; d++) { |
|
mdu_disk_info_t disk; |
|
disk.number = d; |
|
diff --git a/mdadm.h b/mdadm.h |
|
index ee9b837..191ae8f 100644 |
|
--- a/mdadm.h |
|
+++ b/mdadm.h |
|
@@ -1425,6 +1425,7 @@ extern int Restore_metadata(char *dev, char *dir, struct context *c, |
|
|
|
int md_array_valid(int fd); |
|
int md_array_active(int fd); |
|
+int md_array_is_active(struct mdinfo *info); |
|
int md_get_array_info(int fd, struct mdu_array_info_s *array); |
|
int md_set_array_info(int fd, struct mdu_array_info_s *array); |
|
int md_get_disk_info(int fd, struct mdu_disk_info_s *disk); |
|
diff --git a/util.c b/util.c |
|
index 8eeb509..c1c8509 100644 |
|
--- a/util.c |
|
+++ b/util.c |
|
@@ -228,15 +228,11 @@ int md_array_active(int fd) |
|
{ |
|
struct mdinfo *sra; |
|
struct mdu_array_info_s array; |
|
- int ret; |
|
+ int ret = 0; |
|
|
|
sra = sysfs_read(fd, NULL, GET_ARRAY_STATE); |
|
if (sra) { |
|
- if (sra->array_state != ARRAY_CLEAR && |
|
- sra->array_state != ARRAY_INACTIVE && |
|
- sra->array_state != ARRAY_UNKNOWN_STATE) |
|
- ret = 0; |
|
- else |
|
+ if (!md_array_is_active(sra)) |
|
ret = -ENODEV; |
|
|
|
free(sra); |
|
@@ -251,6 +247,13 @@ int md_array_active(int fd) |
|
return !ret; |
|
} |
|
|
|
+int md_array_is_active(struct mdinfo *info) |
|
+{ |
|
+ return (info->array_state != ARRAY_CLEAR && |
|
+ info->array_state != ARRAY_INACTIVE && |
|
+ info->array_state != ARRAY_UNKNOWN_STATE); |
|
+} |
|
+ |
|
/* |
|
* Get array info from the kernel. Longer term we want to deprecate the |
|
* ioctl and get it from sysfs. |
|
-- |
|
2.7.4 |
|
|
|
|