From: NeilBrown Date: Tue, 23 Oct 2012 06:16:16 +0000 (+1100) Subject: Report replacement devices correctly with --detail and --examine X-Git-Tag: mdadm-3.3-rc1~164 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=24c7bc8432b955e7c32d889266f33b5fd75b2f33;p=thirdparty%2Fmdadm.git 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 --- 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<= 0 && disk.raid_disk < array.raid_disks + && disks[disk.raid_disk*2+1].state == (1<= 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); diff --git a/super1.c b/super1.c index 99933863..dd6b9be1 100644 --- a/super1.c +++ b/super1.c @@ -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"); }