X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=Detail.c;h=ed100fa1bbba104507884cd6c8e86d5ce1571877;hb=9bbcc5f7c4140244abc4d427fe107b9d5c33c257;hp=882ec07835a5bc0529f336e26c2e0a81c601c06c;hpb=b578481ca382959da894ebdd91c5e5f45d50374d;p=thirdparty%2Fmdadm.git diff --git a/Detail.c b/Detail.c index 882ec078..ed100fa1 100644 --- a/Detail.c +++ b/Detail.c @@ -1,7 +1,7 @@ /* * mdadm - manage Linux "md" devices aka RAID arrays. * - * Copyright (C) 2001-2002 Neil Brown + * Copyright (C) 2001-2006 Neil Brown * * * 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,22 @@ int Detail(char *dev, int brief, int test) /* Ok, we have some info to print... */ c = map_num(pers, array.level); - if (brief) + + 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 num-devices=%d", dev, c?c:"-unknown-",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 +156,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 +172,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 +197,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<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); @@ -267,7 +275,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"); } @@ -296,6 +304,7 @@ This is pretty boring 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]; @@ -342,10 +351,13 @@ This is pretty boring } } if (disk.state == 0) spares++; - if (test && d < array.raid_disks && disk.state & (1< 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; }