X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=Detail.c;h=5116ccac7e9bed70d1a6d096c974159ec1869eb2;hb=df65ac70ca82fb57bac603ac00d39698cb545164;hp=ab01cfb4b59092cfbd84c19808135ed995aa681a;hpb=0bd54da30eebdd8bd7fd17ea438638e3f7840a1c;p=thirdparty%2Fmdadm.git diff --git a/Detail.c b/Detail.c index ab01cfb4..5116ccac 100644 --- a/Detail.c +++ b/Detail.c @@ -122,12 +122,25 @@ int Detail(char *dev, int brief, int export, int test, char *homehost) disk.minor == 0) continue; if ((dv=map_dev(disk.major, disk.minor, 1))) { - if ((!st || !st->sb) && + /* some formats (imsm) have free-floating-spares + * with a uuid of uuid_match_any, they don't + * have very good info about the rest of the + * container, so keep searching when + * encountering such a device. Otherwise, stop + * after the first successful call to + * ->load_super. + */ + int free_spare = memcmp(uuid_match_any, + info.uuid, + sizeof(uuid_match_any)) == 0; + if ((!st || !st->sb || free_spare) && (array.raid_disks == 0 || (disk.state & (1<ss->free_super(st); int fd2 = dev_open(dv, O_RDONLY); if (fd2 >=0 && st && st->ss->load_super(st, fd2, NULL) == 0) { @@ -161,7 +174,7 @@ int Detail(char *dev, int brief, int export, int test, char *homehost) if (sra && sra->array.major_version < 0) printf("MD_METADATA=%s\n", sra->text_version); else - printf("MD_METADATA=%d.%02d\n", + printf("MD_METADATA=%d.%d\n", array.major_version, array.minor_version); } @@ -181,7 +194,12 @@ int Detail(char *dev, int brief, int export, int test, char *homehost) st->ss->export_detail_super(st); } else { struct map_ent *mp, *map = NULL; + char nbuf[64]; mp = map_by_devnum(&map, fd2devnum(fd)); + if (mp) { + __fname_from_uuid(mp->uuid, 0, nbuf, ':'); + printf("MD_UUID=%s\n", nbuf+5); + } if (mp && mp->path && strncmp(mp->path, "/dev/md/", 8) == 0) printf("MD_DEVNAME=%s\n", mp->path+8); @@ -189,16 +207,52 @@ int Detail(char *dev, int brief, int export, int test, char *homehost) goto out; } + disks = malloc(max_disks * sizeof(mdu_disk_info_t)); + for (d=0; d= 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 < array.raid_disks; d++) { + mdu_disk_info_t disk = disks[d]; + + if ((disk.state & (1< 1) { if (array.raid_disks) - printf("level=%s num-devices=%d", + printf(" level=%s num-devices=%d", c?c:"-unknown-", array.raid_disks ); else - printf("level=container num-devices=%d", + printf(" level=container num-devices=%d", array.nr_disks); } if (container) { @@ -208,7 +262,7 @@ int Detail(char *dev, int brief, int export, int test, char *homehost) if (sra && sra->array.major_version < 0) printf(" metadata=%s", sra->text_version); else - printf(" metadata=%d.%02d", + printf(" metadata=%d.%d", array.major_version, array.minor_version); } @@ -241,7 +295,7 @@ int Detail(char *dev, int brief, int export, int test, char *homehost) if (sra && sra->array.major_version < 0) printf(" Version : %s\n", sra->text_version); else - printf(" Version : %d.%02d\n", + printf(" Version : %d.%d\n", array.major_version, array.minor_version); } @@ -288,13 +342,23 @@ int Detail(char *dev, int brief, int export, int test, char *homehost) atime = array.utime; if (atime) printf(" Update Time : %.24s\n", ctime(&atime)); - if (array.raid_disks) + if (array.raid_disks) { + char *st; + if (avail_disks == array.raid_disks) + st = ""; + else if (!enough(array.level, array.raid_disks, + array.layout, 1, avail, avail_disks)) + st = ", FAILED"; + else + st = ", degraded"; + printf(" State : %s%s%s%s\n", (array.state&(1<percent < 0) ? "" : (e->resync) ? ", resyncing": ", recovering", larray_size ? "": ", Not Started"); + } if (array.raid_disks) printf(" Active Devices : %d\n", array.active_disks); printf("Working Devices : %d\n", array.working_disks); @@ -307,6 +371,10 @@ int Detail(char *dev, int brief, int export, int test, char *homehost) c = map_num(r5layout, array.layout); printf(" Layout : %s\n", c?c:"-unknown-"); } + if (array.level == 6) { + c = map_num(r6layout, array.layout); + printf(" Layout : %s\n", c?c:"-unknown-"); + } if (array.level == 10) { printf(" Layout :"); print_r10_layout(array.layout); @@ -341,7 +409,7 @@ int Detail(char *dev, int brief, int export, int test, char *homehost) #if 0 This is pretty boring printf(" Reshape pos'n : %llu%s\n", (unsigned long long) info.reshape_progress<<9, - human_size(info.reshape_progress<<9)); + human_size((unsigned long long)info.reshape_progress<<9)); #endif if (info.delta_disks > 0) printf(" Delta Devices : %d, (%d->%d)\n", @@ -360,6 +428,11 @@ This is pretty boring printf(" New Layout : %s\n", c?c:"-unknown-"); } + if (info.new_level == 6) { + char *c = map_num(r6layout, info.new_layout); + printf(" New Layout : %s\n", + c?c:"-unknown-"); + } if (info.new_level == 10) { printf(" New Layout : near=%d, %s=%d\n", info.new_layout&255, @@ -415,32 +488,7 @@ This is pretty boring else printf(" Number Major Minor RaidDevice\n"); } - disks = malloc(max_disks * sizeof(mdu_disk_info_t)); - for (d=0; d= 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]; @@ -493,11 +541,6 @@ This is pretty boring if (test && d < array.raid_disks && !(disk.state & (1<