/* Comile with -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 */ #ifdef LINUXSTATIC #include "lib.h" #else #include #include #include #include #include #include #include #include #include #endif #include "util.h" #define MAXDISKS 12 #define DEFSTRIPE 64 #define DEFWINDOW 128 const char *diskname[MAXDISKS], *progname="parityinfo"; int diskfd[MAXDISKS], request[MAXDISKS], reply[MAXDISKS]; off_t windowstart, windowend, windowcyl, stripecyl, raidstart=0, raidlen=0; int disks=0, diskstart, datasize=0, rotate=0, stripesize=DEFSTRIPE*1024, windowsize=DEFWINDOW*1024; void usage(int status) { fprintf(status? stderr:stdout, "Usage: %s [options] disks...\n" " --stripe " " Set stripe size in K (default: %i)\n" " --window " " Set I/O window size in K (default: %i)\n" " --start " " Skip to given output position in bytes (default: 0)\n" " --length " " Length of output (no default)\n" " --rotate " " Rotate parity disk position (default: 0)\n", progname, DEFSTRIPE, DEFWINDOW); exit(status); } void parseopts(int argc, char *argv[]) { int i, optparsing=1; if (argc) setprogname(argv[0]); if (argc<=1) usage(1); for (i=1; iraidlen) len=raidlen; if (winoffset+len > datasize) len=datasize-winoffset; printf("\nOutput position %lli (stripe %i)\n", raidstart, stripe); printf(" data disk=%i %s\n", disk, diskname[disk]); printf(" parity disk=%i %s\n", paritydisk, diskname[paritydisk]); printf(" data %lli (stripe %lli) [%i..%i]\n", windowstart+(windowoffset/stripecyl)*stripesize, windowstart/stripesize+(windowoffset/stripecyl), offset, offset+len-1); raidstart+=len; raidlen-=len; } int main(int argc, char *argv[]) { parseopts(argc, argv); windowcyl = windowsize * (disks-1); stripecyl = stripesize * (disks-1); printf("Length of stripe across all disks (except parity): " "%llu\n", stripecyl); printf("Number of disks: %i\n", disks); windowstart = (raidstart/windowcyl) * windowsize; getnextwindow(); while (raidlen) { off_t nextwindow = (raidstart/windowcyl) * windowsize; if (windowstart != nextwindow) { getnextwindow(); } printpartial(); } return 0; }