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>
This commit is contained in:
Mariusz Tkaczyk 2017-08-10 11:43:48 +02:00 committed by Jes Sorensen
parent 0e23c59718
commit a822017f30
3 changed files with 17 additions and 14 deletions

View File

@ -86,7 +86,8 @@ int Detail(char *dev, struct context *c)
dev, strerror(errno)); dev, strerror(errno));
return rv; 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 (!sra) {
if (md_get_array_info(fd, &array)) { if (md_get_array_info(fd, &array)) {
pr_err("%s does not appear to be an md device\n", dev); 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 && external = (sra != NULL && sra->array.major_version == -1 &&
sra->array.minor_version == -2); sra->array.minor_version == -2);
inactive = (sra->array_state == ARRAY_ACTIVE || inactive = (sra != NULL && !md_array_is_active(sra));
sra->array_state == ARRAY_CLEAR);
st = super_by_fd(fd, &subarray); st = super_by_fd(fd, &subarray);
if (md_get_array_info(fd, &array)) { if (md_get_array_info(fd, &array)) {
if (errno == ENODEV) { if (errno == ENODEV) {
@ -314,11 +314,10 @@ int Detail(char *dev, struct context *c)
next = array.raid_disks * 2; next = array.raid_disks * 2;
if (inactive) { if (inactive) {
struct mdinfo *mdi; struct mdinfo *mdi;
if (sra != NULL) for (mdi = sra->devs; mdi; mdi = mdi->next) {
for (mdi = sra->devs; mdi; mdi = mdi->next) { disks[next++] = mdi->disk;
disks[next++] = mdi->disk; disks[next - 1].number = -1;
disks[next - 1].number = -1; }
}
} else for (d = 0; d < max_disks; d++) { } else for (d = 0; d < max_disks; d++) {
mdu_disk_info_t disk; mdu_disk_info_t disk;
disk.number = d; disk.number = d;

View File

@ -1425,6 +1425,7 @@ extern int Restore_metadata(char *dev, char *dir, struct context *c,
int md_array_valid(int fd); int md_array_valid(int fd);
int md_array_active(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_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_set_array_info(int fd, struct mdu_array_info_s *array);
int md_get_disk_info(int fd, struct mdu_disk_info_s *disk); int md_get_disk_info(int fd, struct mdu_disk_info_s *disk);

15
util.c
View File

@ -228,15 +228,11 @@ int md_array_active(int fd)
{ {
struct mdinfo *sra; struct mdinfo *sra;
struct mdu_array_info_s array; struct mdu_array_info_s array;
int ret; int ret = 0;
sra = sysfs_read(fd, NULL, GET_ARRAY_STATE); sra = sysfs_read(fd, NULL, GET_ARRAY_STATE);
if (sra) { if (sra) {
if (sra->array_state != ARRAY_CLEAR && if (!md_array_is_active(sra))
sra->array_state != ARRAY_INACTIVE &&
sra->array_state != ARRAY_UNKNOWN_STATE)
ret = 0;
else
ret = -ENODEV; ret = -ENODEV;
free(sra); free(sra);
@ -251,6 +247,13 @@ int md_array_active(int fd)
return !ret; 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 * Get array info from the kernel. Longer term we want to deprecate the
* ioctl and get it from sysfs. * ioctl and get it from sysfs.