]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Detail.c
mdadm/Detail: show correct state for clustered array
[thirdparty/mdadm.git] / Detail.c
index daec4f1a8f42338fc758dd14b00f42ffcfdf806c..f8dea6fdf715320d679d1ccf28eba210ba7a4d41 100644 (file)
--- a/Detail.c
+++ b/Detail.c
@@ -224,7 +224,10 @@ int Detail(char *dev, struct context *c)
        }
 
        /* Ok, we have some info to print... */
-       str = map_num(pers, array.level);
+       if (inactive && info)
+               str = map_num(pers, info->array.level);
+       else
+               str = map_num(pers, array.level);
 
        if (c->export) {
                if (array.raid_disks) {
@@ -495,20 +498,41 @@ int Detail(char *dev, struct context *c)
                                                          sra->array_state);
                                else
                                        arrayst = "clean";
-                       } else
+                       } else {
                                arrayst = "active";
+                               if (array.state & (1<<MD_SB_CLUSTERED)) {
+                                       for (d = 0; d < max_disks * 2; d++) {
+                                               char *dv;
+                                               mdu_disk_info_t disk = disks[d];
+
+                                               /* only check first valid disk in cluster env */
+                                               if ((disk.state & (MD_DISK_SYNC | MD_DISK_ACTIVE))
+                                                       && (disk.major | disk.minor)) {
+                                                       dv = map_dev_preferred(disk.major, disk.minor, 0,
+                                                                       c->prefer);
+                                                       if (!dv)
+                                                               continue;
+                                                       arrayst = IsBitmapDirty(dv) ? "active" : "clean";
+                                                       break;
+                                               }
+                                       }
+                               }
+                       }
 
-                       printf("             State : %s%s%s%s%s%s \n",
+                       printf("             State : %s%s%s%s%s%s%s \n",
                               arrayst, st,
                               (!e || (e->percent < 0 &&
                                       e->percent != RESYNC_PENDING &&
-                                      e->percent != RESYNC_DELAYED)) ?
+                                      e->percent != RESYNC_DELAYED &&
+                                      e->percent != RESYNC_REMOTE)) ?
                               "" : sync_action[e->resync],
                               larray_size ? "": ", Not Started",
                               (e && e->percent == RESYNC_DELAYED) ?
                               " (DELAYED)": "",
                               (e && e->percent == RESYNC_PENDING) ?
-                              " (PENDING)": "");
+                              " (PENDING)": "",
+                              (e && e->percent == RESYNC_REMOTE) ?
+                              " (REMOTE)": "");
                } else if (inactive && !is_container) {
                        printf("             State : inactive\n");
                }