X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=Detail.c;h=5028ae29c40346c0991c4e33a3deb1f1d04a1077;hp=532032140812ca0cf48d314f7590d59b01ac4a98;hb=dd0781e50555c32ff2f808ec46f4b03a5693ea47;hpb=e0d1903663dac9307a37646c26abf7991b0a9593 diff --git a/Detail.c b/Detail.c index 53203214..5028ae29 100644 --- a/Detail.c +++ b/Detail.c @@ -31,7 +31,7 @@ #include "md_p.h" #include "md_u.h" -int Detail(char *dev, int brief) +int Detail(char *dev, int brief, int test) { /* * Print out details for an md array by using @@ -44,27 +44,31 @@ int Detail(char *dev, int brief) int d; time_t atime; char *c; + char *devices = NULL; + int spares = 0; + struct stat stb; mdp_super_t super; int have_super = 0; + int rv = test ? 4 : 1; if (fd < 0) { fprintf(stderr, Name ": cannot open %s: %s\n", dev, strerror(errno)); - return 1; + return rv; } vers = md_get_version(fd); if (vers < 0) { fprintf(stderr, Name ": %s does not appear to be an md device\n", dev); close(fd); - return 1; + return rv; } if (vers < 9000) { fprintf(stderr, Name ": cannot get detail for md device %s: driver version too old.\n", dev); close(fd); - return 1; + return rv; } if (ioctl(fd, GET_ARRAY_INFO, &array)<0) { if (errno == ENODEV) @@ -74,22 +78,37 @@ int Detail(char *dev, int brief) fprintf(stderr, Name ": cannot get array detail for %s: %s\n", dev, strerror(errno)); close(fd); - return 1; + return rv; } + if (fstat(fd, &stb) != 0 && !S_ISBLK(stb.st_mode)) + stb.st_rdev = 0; + rv = 0; /* Ok, we have some info to print... */ c = map_num(pers, array.level); if (brief) - printf("ARRAY %s level=%s disks=%d", dev, c?c:"-unknown-",array.raid_disks ); + printf("ARRAY %s level=%s num-devices=%d", dev, c?c:"-unknown-",array.raid_disks ); else { unsigned long array_size; unsigned long long larray_size; + struct mdstat_ent *ms = mdstat_read(0); + struct mdstat_ent *e; + int devnum = array.md_minor; + if (MAJOR(stb.st_rdev) != MD_MAJOR) + devnum = -1 - devnum; + + 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<<9; + if (ioctl(fd, BLKGETSIZE, &array_size)==0) { + larray_size = array_size; + larray_size <<= 9; + } + else larray_size = 0; printf("%s:\n", dev); @@ -99,24 +118,25 @@ int Detail(char *dev, int brief) printf(" Creation Time : %.24s\n", ctime(&atime)); printf(" Raid Level : %s\n", c?c:"-unknown-"); if (larray_size) - printf(" Array Size : %ld%s\n", (long)(larray_size>>10), human_size(larray_size)); + printf(" Array Size : %llu%s\n", (larray_size>>10), human_size(larray_size)); if (array.level >= 1) printf(" Device Size : %d%s\n", array.size, human_size((long long)array.size<<10)); - printf(" Raid Disks : %d\n", array.raid_disks); - printf(" Total Disks : %d\n", array.nr_disks); + printf(" Raid Devices : %d\n", array.raid_disks); + printf(" Total Devices : %d\n", array.nr_disks); printf("Preferred Minor : %d\n", array.md_minor); - printf(" Persistance : Superblock is %spersistant\n", + printf(" Persistence : Superblock is %spersistent\n", array.not_persistent?"not ":""); printf("\n"); atime = array.utime; printf(" Update Time : %.24s\n", ctime(&atime)); - printf(" State : %s, %serrors\n", + printf(" State : %s%s%s\n", (array.state&(1<percent >= 0) ? ", recovering": ""); + printf(" Active Devices : %d\n", array.active_disks); + printf("Working Devices : %d\n", array.working_disks); + printf(" Failed Devices : %d\n", array.failed_disks); + printf(" Spare Devices : %d\n", array.spare_disks); printf("\n"); if (array.level == 5) { c = map_num(r5layout, array.layout); @@ -135,7 +155,12 @@ int Detail(char *dev, int brief) } printf("\n"); - printf(" Number Major Minor RaidDisk State\n"); + + if (e && e->percent >= 0) + printf(" Rebuild Status : %d%% complete\n\n", e->percent); + free_mdstat(ms); + + printf(" Number Major Minor RaidDevice State\n"); } for (d= 0; d=0 && load_super(fd, &super) ==0 && - super.ctime == array.ctime && - super.level == array.level) + (unsigned long)super.ctime == (unsigned long)array.ctime && + (unsigned int)super.level == (unsigned int)array.level) have_super = 1; } } if (!brief) printf("\n"); } + if (spares && brief) printf(" spares=%d", spares); if (have_super) { if (brief) printf(" UUID="); else printf(" UUID : "); @@ -183,8 +223,11 @@ int Detail(char *dev, int brief) super.set_uuid2, super.set_uuid3); else printf("%08x", super.set_uuid0); - if (!brief) printf("\n"); + if (!brief) + printf("\n Events : %d.%d\n", super.events_hi, super.events_lo); } + if (brief && devices) printf("\n devices=%s", devices); if (brief) printf("\n"); - return 0; + if (test && (rv&2)) rv &= ~1; + return rv; }