summaryrefslogtreecommitdiff
path: root/Detail.c
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.de>2012-10-23 17:16:16 +1100
committerNeilBrown <neilb@suse.de>2012-10-23 17:16:16 +1100
commit24c7bc8432b955e7c32d889266f33b5fd75b2f33 (patch)
tree341391bb237ff5eb42654823ed9d9f46fc498b38 /Detail.c
parent70c55e36b73827579fcb2dadbb6359ef605191ff (diff)
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>
Diffstat (limited to 'Detail.c')
-rw-r--r--Detail.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/Detail.c b/Detail.c
index 3a2799d5..ff0b6e86 100644
--- a/Detail.c
+++ b/Detail.c
@@ -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);