]> git.ipfire.org Git - thirdparty/mdadm.git/blobdiff - Detail.c
Remove spaces/tabs from ends of lines.
[thirdparty/mdadm.git] / Detail.c
index 882ec07835a5bc0529f336e26c2e0a81c601c06c..22f0e5c0301d594f7a14fc0c0a085bd262ae5ac0 100644 (file)
--- a/Detail.c
+++ b/Detail.c
@@ -1,7 +1,7 @@
 /*
  * mdadm - manage Linux "md" devices aka RAID arrays.
  *
- * Copyright (C) 2001-2002 Neil Brown <neilb@cse.unsw.edu.au>
+ * Copyright (C) 2001-2006 Neil Brown <neilb@suse.de>
  *
  *
  *    This program is free software; you can redistribute it and/or modify
@@ -31,7 +31,7 @@
 #include       "md_p.h"
 #include       "md_u.h"
 
-int Detail(char *dev, int brief, int test)
+int Detail(char *dev, int brief, int export, int test, char *homehost)
 {
        /*
         * Print out details for an md array by using
@@ -58,6 +58,8 @@ int Detail(char *dev, int brief, int test)
 
        void *super = NULL;
        int rv = test ? 4 : 1;
+       int avail_disks = 0;
+       char *avail;
 
        if (fd < 0) {
                fprintf(stderr, Name ": cannot open %s: %s\n",
@@ -128,11 +130,25 @@ int Detail(char *dev, int brief, int test)
 
        /* Ok, we have some info to print... */
        c = map_num(pers, array.level);
-       if (brief) 
-               printf("ARRAY %s level=%s num-devices=%d", dev, c?c:"-unknown-",array.raid_disks );
+
+       if (export) {
+               if (c)
+                       printf("MD_LEVEL=%s\n", c);
+               printf("MD_DEVICES=%d\n", array.raid_disks);
+               printf("MD_METADATA=%d.%d\n", array.major_version,
+                      array.minor_version);
+               if (super)
+                       st->ss->export_super(super);
+               goto out;
+       }
+
+       if (brief)
+               printf("ARRAY %s level=%s metadata=%d.%d num-devices=%d", dev,
+                      c?c:"-unknown-",
+                      array.major_version, array.minor_version,
+                      array.raid_disks );
        else {
                mdu_bitmap_file_t bmf;
-               unsigned long array_size;
                unsigned long long larray_size;
                struct mdstat_ent *ms = mdstat_read(0, 0);
                struct mdstat_ent *e;
@@ -143,17 +159,8 @@ int Detail(char *dev, int brief, int test)
                for (e=ms; e; e=e->next)
                        if (e->devnum == devnum)
                                break;
-#ifdef BLKGETSIZE64
-               if (ioctl(fd, BLKGETSIZE64, &larray_size)==0)
-                       ;
-               else
-#endif
-                       if (ioctl(fd, BLKGETSIZE, &array_size)==0) {
-                               larray_size = array_size;
-                               larray_size <<= 9;
-                       }
-               
-               else larray_size = 0;
+               if (!get_dev_size(fd, NULL, &larray_size))
+                       larray_size = 0;
 
                printf("%s:\n", dev);
                printf("        Version : %02d.%02d.%02d\n",
@@ -168,11 +175,14 @@ int Detail(char *dev, int brief, int test)
                            (larray_size >= 0xFFFFFFFFULL|| array.size == 0)) {
                                unsigned long long dsize = get_component_size(fd);
                                if (dsize > 0)
-                                       printf("    Device Size : %llu%s\n", dsize, human_size((long long)array.size<<10));
+                                       printf("  Used Dev Size : %llu%s\n",
+                                              dsize,
+                                        human_size((long long)array.size<<10));
                                else
-                                       printf("    Device Size : unknown\n");
+                                       printf("  Used Dev Size : unknown\n");
                        } else
-                               printf("    Device Size : %d%s\n", array.size, human_size((long long)array.size<<10));
+                               printf("  Used Dev Size : %d%s\n", array.size,
+                                      human_size((long long)array.size<<10));
                }
                printf("   Raid Devices : %d\n", array.raid_disks);
                printf("  Total Devices : %d\n", array.nr_disks);
@@ -190,11 +200,12 @@ int Detail(char *dev, int brief, int test)
                        printf("  Intent Bitmap : Internal\n\n");
                atime = array.utime;
                printf("    Update Time : %.24s\n", ctime(&atime));
-               printf("          State : %s%s%s\n",
+               printf("          State : %s%s%s%s\n",
                       (array.state&(1<<MD_SB_CLEAN))?"clean":"active",
                       array.active_disks < array.raid_disks? ", degraded":"",
                       (!e || e->percent < 0) ? "" :
-                       (e->resync) ? ", resyncing": ", recovering");
+                       (e->resync) ? ", resyncing": ", recovering",
+                      larray_size ? "": ", Not Started");
                printf(" Active Devices : %d\n", array.active_disks);
                printf("Working Devices : %d\n", array.working_disks);
                printf(" Failed Devices : %d\n", array.failed_disks);
@@ -222,7 +233,7 @@ int Detail(char *dev, int brief, int test)
                        break;
                default: break;
                }
-       
+
                if (e && e->percent >= 0) {
                        printf(" Re%s Status : %d%% complete\n",
                               (super && info.reshape_active)? "shape":"build",
@@ -267,7 +278,7 @@ This is pretty boring
                } else if (e && e->percent >= 0)
                        printf("\n");
                if (super && st)
-                       st->ss->detail_super(super);
+                       st->ss->detail_super(super, homehost);
 
                printf("    Number   Major   Minor   RaidDevice State\n");
        }
@@ -290,12 +301,13 @@ This is pretty boring
                }
                if (disk.major == 0 && disk.minor == 0)
                        continue;
-               if (disk.raid_disk >= 0 && disk.raid_disk < array.raid_disks) 
+               if (disk.raid_disk >= 0 && disk.raid_disk < array.raid_disks)
                        disks[disk.raid_disk] = disk;
                else if (next < max_disks)
                        disks[next++] = disk;
        }
 
+       avail = calloc(array.raid_disks, 1);
        for (d= 0; d < max_disks; d++) {
                char *dv;
                mdu_disk_info_t disk = disks[d];
@@ -307,13 +319,13 @@ This is pretty boring
                if (!brief) {
                        if (d == array.raid_disks) printf("\n");
                        if (disk.raid_disk < 0)
-                               printf("   %5d   %5d    %5d        -     ", 
+                               printf("   %5d   %5d    %5d        -     ",
                                       disk.number, disk.major, disk.minor);
                        else
-                               printf("   %5d   %5d    %5d    %5d     ", 
+                               printf("   %5d   %5d    %5d    %5d     ",
                                       disk.number, disk.major, disk.minor, disk.raid_disk);
-                       if (disk.state & (1<<MD_DISK_FAULTY)) { 
-                               printf(" faulty"); 
+                       if (disk.state & (1<<MD_DISK_FAULTY)) {
+                               printf(" faulty");
                                if (disk.raid_disk < array.raid_disks &&
                                    disk.raid_disk >= 0)
                                        failed++;
@@ -342,10 +354,13 @@ This is pretty boring
                        }
                }
                if (disk.state == 0) spares++;
-               if (test && d < array.raid_disks && disk.state & (1<<MD_DISK_FAULTY)) {
-                       if ((rv & 1) && (array.level ==4 || array.level == 5))
-                               rv |= 2;
+               if (test && d < array.raid_disks
+                   && !(disk.state & (1<<MD_DISK_SYNC)))
                        rv |= 1;
+               if (d < array.raid_disks
+                   && (disk.state & (1<<MD_DISK_SYNC))) {
+                       avail_disks ++;
+                       avail[d] = 1;
                }
                if ((dv=map_dev(disk.major, disk.minor, 0))) {
                        if (brief) {
@@ -366,7 +381,12 @@ This is pretty boring
 
        if (brief > 1 && devices) printf("\n   devices=%s", devices);
        if (brief) printf("\n");
-       if (test && (rv&2)) rv &= ~1;
+       if (test &&
+           !enough(array.level, array.raid_disks, array.layout,
+                   1, avail, avail_disks))
+               rv = 2;
+
+out:
        close(fd);
        return rv;
 }