Report replacement devices correctly with --detail and --examine

--detail needs to be read to report 2 devices in each slot,
and --examine need to report if the device is the original or
the replacement.

Signed-off-by: NeilBrown <neilb@suse.de>
This commit is contained in:
NeilBrown 2012-10-23 17:16:16 +11:00
parent 70c55e36b7
commit 24c7bc8432
2 changed files with 26 additions and 11 deletions

View File

@ -239,7 +239,7 @@ int Detail(char *dev, struct context *c)
disks[d].number = disks[d].raid_disk = d;
}
next = array.raid_disks;
next = array.raid_disks*2;
for (d = 0; d < max_disks; d++) {
mdu_disk_info_t disk;
disk.number = d;
@ -251,8 +251,12 @@ int Detail(char *dev, struct context *c)
}
if (disk.major == 0 && disk.minor == 0)
continue;
if (disk.raid_disk >= 0 && disk.raid_disk < array.raid_disks)
disks[disk.raid_disk] = disk;
if (disk.raid_disk >= 0 && disk.raid_disk < array.raid_disks
&& disks[disk.raid_disk*2].state == (1<<MD_DISK_REMOVED))
disks[disk.raid_disk*2] = disk;
else if (disk.raid_disk >= 0 && disk.raid_disk < array.raid_disks
&& disks[disk.raid_disk*2+1].state == (1<<MD_DISK_REMOVED))
disks[disk.raid_disk*2+1] = disk;
else if (next < max_disks)
disks[next++] = disk;
}
@ -260,9 +264,9 @@ int Detail(char *dev, struct context *c)
avail = xcalloc(array.raid_disks, 1);
for (d= 0; d < array.raid_disks; d++) {
mdu_disk_info_t disk = disks[d];
if ((disk.state & (1<<MD_DISK_SYNC))) {
if ((disks[d*2].state & (1<<MD_DISK_SYNC)) ||
(disks[d*2+1].state & (1<<MD_DISK_SYNC))) {
avail_disks ++;
avail[d] = 1;
}
@ -525,12 +529,16 @@ This is pretty boring
char *dv;
mdu_disk_info_t disk = disks[d];
if (d >= array.raid_disks &&
if (d >= array.raid_disks*2 &&
disk.major == 0 &&
disk.minor == 0)
continue;
if ((d & 1) &&
disk.major == 0 &&
disk.minor == 0)
continue;
if (!c->brief) {
if (d == array.raid_disks) printf("\n");
if (d == array.raid_disks*2) printf("\n");
if (disk.raid_disk < 0)
printf(" %5d %5d %5d - ",
disk.number, disk.major, disk.minor);

View File

@ -461,6 +461,8 @@ static void examine_super1(struct supertype *st, char *homehost)
role = 0xFFFF;
if (role >= 0xFFFE)
printf("spare\n");
else if (sb->feature_map & __cpu_to_le32(MD_FEATURE_REPLACEMENT))
printf("Replacement device %d\n", role);
else
printf("Active device %d\n", role);
@ -473,9 +475,14 @@ static void examine_super1(struct supertype *st, char *homehost)
if (role == d)
cnt++;
}
if (cnt > 1) printf("?");
else if (cnt == 1) printf("A");
else printf (".");
if (cnt == 2)
printf("R");
else if (cnt == 1)
printf("A");
else if (cnt == 0)
printf(".");
else
printf("?");
}
#if 0
/* This is confusing too */
@ -487,7 +494,7 @@ static void examine_super1(struct supertype *st, char *homehost)
}
if (faulty) printf(" %d failed", faulty);
#endif
printf(" ('A' == active, '.' == missing)");
printf(" ('A' == active, '.' == missing, 'R' == replacing)");
printf("\n");
}