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:
parent
0e23c59718
commit
a822017f30
15
Detail.c
15
Detail.c
|
@ -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;
|
||||||
|
|
1
mdadm.h
1
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_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
15
util.c
|
@ -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.
|
||||||
|
|
Loading…
Reference in New Issue