X-Git-Url: http://git.ipfire.org/?p=thirdparty%2Fmdadm.git;a=blobdiff_plain;f=Detail.c;h=5028ae29c40346c0991c4e33a3deb1f1d04a1077;hp=026c3b3de91cd8893da28872d5176f68d10e2da0;hb=dd0781e50555c32ff2f808ec46f4b03a5693ea47;hpb=52826846282e9e224e05dde6d2e4cb38d1fefec7 diff --git a/Detail.c b/Detail.c index 026c3b3d..5028ae29 100644 --- a/Detail.c +++ b/Detail.c @@ -1,7 +1,7 @@ /* - * mdctl - manage Linux "md" devices aka RAID arrays. + * mdadm - manage Linux "md" devices aka RAID arrays. * - * Copyright (C) 2001 Neil Brown + * Copyright (C) 2001-2002 Neil Brown * * * This program is free software; you can redistribute it and/or modify @@ -27,11 +27,11 @@ * Australia */ -#include "mdctl.h" +#include "mdadm.h" #include "md_p.h" #include "md_u.h" -int Detail(char *dev) +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 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,88 +78,156 @@ int Detail(char *dev) 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... */ - printf("%s:\n", dev); - printf(" Version : %02d.%02d.%02d\n", - array.major_version, array.minor_version, array.patch_version); - atime = array.ctime; - printf(" Creation Time : %.24s\n", ctime(&atime)); c = map_num(pers, array.level); - printf(" Raid Level : %s\n", c?c:"-unknown-"); - printf(" Size : %d\n", array.size); - printf(" Raid Disks : %d\n", array.raid_disks); - printf(" Total Disks : %d\n", array.nr_disks); - printf("Preferred Minor : %d\n", array.md_minor); - printf(" Persistance : Superblock is %spersistant\n", - array.not_persistent?"not ":""); - printf("\n"); - atime = array.utime; - printf(" Update Time : %.24s\n", ctime(&atime)); - printf(" State : %s, %serrors\n", - (array.state&(1<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; + + printf("%s:\n", dev); + printf(" Version : %02d.%02d.%02d\n", + array.major_version, array.minor_version, array.patch_version); + atime = array.ctime; + printf(" Creation Time : %.24s\n", ctime(&atime)); + printf(" Raid Level : %s\n", c?c:"-unknown-"); + if (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 Devices : %d\n", array.raid_disks); + printf(" Total Devices : %d\n", array.nr_disks); + printf("Preferred Minor : %d\n", array.md_minor); + 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%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); + printf(" Layout : %s\n", c?c:"-unknown-"); + } + switch (array.level) { + case 0: + case 4: + case 5: + printf(" Chunk Size : %dK\n", array.chunk_size/1024); + break; + case -1: + printf(" Rounding : %dK\n", array.chunk_size/1024); + break; + default: break; + } - printf("\n"); - printf(" Number Major Minor RaidDisk State\n"); - for (d= 0; dpercent >= 0) + printf(" Rebuild Status : %d%% complete\n\n", e->percent); + free_mdstat(ms); + + printf(" Number Major Minor RaidDevice State\n"); + } + for (d= 0; d= array.raid_disks && + disk.major == 0 && + disk.minor == 0) + continue; + if (!brief) { + printf(" %5d %5d %5d %5d ", + disk.number, disk.major, disk.minor, disk.raid_disk); + if (disk.state & (1<=0 && - load_super(fd, &super) ==0 && - super.ctime == array.ctime && - super.level == array.level) - have_super = 1; - } + if (brief) { + if (devices) { + devices = realloc(devices, + strlen(devices)+1+strlen(dv)+1); + strcat(strcat(devices,","),dv); + } else + devices = strdup(dv); + } else + printf(" %s", dv); + if (!have_super && (disk.state & (1<=0 && + load_super(fd, &super) ==0 && + (unsigned long)super.ctime == (unsigned long)array.ctime && + (unsigned int)super.level == (unsigned int)array.level) + have_super = 1; + } } - printf("\n"); + if (!brief) printf("\n"); } + if (spares && brief) printf(" spares=%d", spares); if (have_super) { + if (brief) printf(" UUID="); + else printf(" UUID : "); if (super.minor_version >= 90) - printf(" UUID : %08x:%08x:%08x:%08x\n", super.set_uuid0, super.set_uuid1, - super.set_uuid2, super.set_uuid3); - else - printf(" UUID : %08x\n", super.set_uuid0); + printf("%08x:%08x:%08x:%08x", super.set_uuid0, super.set_uuid1, + super.set_uuid2, super.set_uuid3); + else + printf("%08x", super.set_uuid0); + if (!brief) + printf("\n Events : %d.%d\n", super.events_hi, super.events_lo); } - return 0; + if (brief && devices) printf("\n devices=%s", devices); + if (brief) printf("\n"); + if (test && (rv&2)) rv &= ~1; + return rv; }