]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
Report replacement devices correctly with --detail and --examine
authorNeilBrown <neilb@suse.de>
Tue, 23 Oct 2012 06:16:16 +0000 (17:16 +1100)
committerNeilBrown <neilb@suse.de>
Tue, 23 Oct 2012 06:16:16 +0000 (17:16 +1100)
--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>
Detail.c
super1.c

index 3a2799d58ff9bcad1411701181d0ca6d4723656f..ff0b6e868564ac9a5e154872ddd89ba1c7686f85 100644 (file)
--- 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);
index 9993386383f90c39f259440a5af3e99eb50d9432..dd6b9be1e0e82a65d1d14abad10a8ebe6b13c092 100644 (file)
--- 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");
 }