]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Examine.c
mdctl-v0.4.2
[thirdparty/mdadm.git] / Examine.c
index ea223c67d5f72b954f489a9de37ae252aaebf16b..4ed4f6b75c7041bd549913f8b02a42696644a5fc 100644 (file)
--- a/Examine.c
+++ b/Examine.c
@@ -29,6 +29,9 @@
 
 #include       "mdctl.h"
 
+#if ! defined(__BIG_ENDIAN) && ! defined(__LITTLE_ENDIAN)
+#error no endian defined
+#endif
 #include       "md_u.h"
 #include       "md_p.h"
 int Examine(char *dev)
@@ -47,14 +50,15 @@ int Examine(char *dev)
         *   utime, state etc
         *
         */
-       int fd = open(dev, O_RDONLY, 0);
+       int fd = open(dev, O_RDONLY);
        time_t atime;
        mdp_super_t super;
        int d;
+       char *c;
        int rv;
 
        if (fd < 0) {
-               fprintf(stderr,"mdctl: cannot open %s: %s\n",
+               fprintf(stderr,Name ": cannot open %s: %s\n",
                        dev, strerror(errno));
                return 1;
        }
@@ -63,30 +67,30 @@ int Examine(char *dev)
        close(fd);
        switch(rv) {
        case 1:
-               fprintf(stderr, "mdctl: cannot find device size for %s: %s\n",
+               fprintf(stderr, Name ": cannot find device size for %s: %s\n",
                        dev, strerror(errno));
                return 1;
        case 2:
-/*             fprintf(stderr, "mdctl: %s is too small for md: size is %ld sectors\n",
+/*             fprintf(stderr, Name ": %s is too small for md: size is %ld sectors\n",
                        dev, size);
 */
-               fprintf(stderr, "mdctl: %s is too small for md\n",
+               fprintf(stderr, Name ": %s is too small for md\n",
                        dev);
                return 1;
        case 3:
-               fprintf(stderr, "mdctl: Cannot seek to superblock on %s: %s\n",
+               fprintf(stderr, Name ": Cannot seek to superblock on %s: %s\n",
                        dev, strerror(errno));
                return 1;
        case 4:
-               fprintf(stderr, "mdctl: Cannot read superblock on %s\n",
+               fprintf(stderr, Name ": Cannot read superblock on %s\n",
                        dev);
                return 1;
        case 5:
-               fprintf(stderr, "mdctl: No super block found on %s (Expected magic %08x, got %08x)\n",
+               fprintf(stderr, Name ": No super block found on %s (Expected magic %08x, got %08x)\n",
                        dev, MD_SB_MAGIC, super.md_magic);
                return 1;
        case 6:
-               fprintf(stderr, "mdctl: Cannot interpret superblock on %s - version is %d\n",
+               fprintf(stderr, Name ": Cannot interpret superblock on %s - version is %d\n",
                        dev, super.major_version);
                return 1;
        }
@@ -104,7 +108,8 @@ int Examine(char *dev)
 
        atime = super.ctime;
        printf("  Creation Time : %.24s\n", ctime(&atime));
-       printf("     Raid Level : %d\n", super.level);
+       c=map_num(pers, super.level);
+       printf("     Raid Level : %s\n", c?c:"-unknown-");
        printf("           Size : %d\n", super.size);
        printf("     Raid Disks : %d\n", super.raid_disks);
        printf("    Total Disks : %d\n", super.nr_disks);
@@ -119,15 +124,32 @@ int Examine(char *dev)
        printf(" Working Drives : %d\n", super.working_disks);
        printf("  Failed Drives : %d\n", super.failed_disks);
        printf("   Spare Drives : %d\n", super.spare_disks);
-       printf("   - checksum not checked yet - \n");
+       if (calc_sb_csum(&super) == super.sb_csum)
+           printf("       Checksum : %x - correct\n", super.sb_csum);
+       else
+           printf("       Checksum : %x - expected %x\n", super.sb_csum, calc_sb_csum(&super));
        printf("         Events : %d.%d\n", super.events_hi, super.events_lo);
        printf("\n");
-       printf("         Layout : %d\n", super.layout);
-       printf("     Chunk Size : %dK\n", super.chunk_size/1024);
+       if (super.level == 5) {
+               c = map_num(r5layout, super.layout);
+               printf("         Layout : %s\n", c?c:"-unknown-");
+       }
+       switch(super.level) {
+       case 0:
+       case 4:
+       case 5:
+               printf("     Chunk Size : %dK\n", super.chunk_size/1024);
+               break;
+       case -1:
+               printf("       Rounding : %dK\n", super.chunk_size/1024);
+               break;
+       default: break;         
+       }
        printf("\n");
        printf("      Number   Major   Minor   RaidDisk   State\n");
        for (d= -1; d<(signed int)super.nr_disks; d++) {
                mdp_disk_t *dp;
+               char *dv;
                char nb[5];
                if (d>=0) dp = &super.disks[d];
                else dp = &super.this_disk;
@@ -138,6 +160,8 @@ int Examine(char *dev)
                if (dp->state & (1<<MD_DISK_ACTIVE)) printf(" active");
                if (dp->state & (1<<MD_DISK_SYNC)) printf(" sync");
                if (dp->state & (1<<MD_DISK_REMOVED)) printf(" removed");
+               if ((dv=map_dev(dp->major, dp->minor)))
+                   printf("   %s", dv);
                printf("\n");
        }
        return 0;