|
|
1.1 ! root 1: #ifndef lint ! 2: static char *sccsid = "@(#)dumpfs.c 2.6 (Berkeley) 9/25/83"; ! 3: #endif ! 4: ! 5: #include <sys/param.h> ! 6: #include <sys/inode.h> ! 7: #include <sys/fs.h> ! 8: ! 9: #include <stdio.h> ! 10: #include <fstab.h> ! 11: ! 12: /* ! 13: * dumpfs ! 14: */ ! 15: ! 16: union { ! 17: struct fs fs; ! 18: char pad[MAXBSIZE]; ! 19: } fsun; ! 20: #define afs fsun.fs ! 21: ! 22: union { ! 23: struct cg cg; ! 24: char pad[MAXBSIZE]; ! 25: } cgun; ! 26: #define acg cgun.cg ! 27: ! 28: main(argc, argv) ! 29: char **argv; ! 30: { ! 31: register struct fstab *fs; ! 32: ! 33: argc--, argv++; ! 34: if (argc < 1) { ! 35: fprintf(stderr, "usage: dumpfs fs ...\n"); ! 36: exit(1); ! 37: } ! 38: for (; argc > 0; argv++, argc--) { ! 39: fs = getfsfile(*argv); ! 40: if (fs == 0) ! 41: dumpfs(*argv); ! 42: else ! 43: dumpfs(fs->fs_spec); ! 44: } ! 45: } ! 46: ! 47: dumpfs(name) ! 48: char *name; ! 49: { ! 50: int c, i, j, k, size; ! 51: ! 52: close(0); ! 53: if (open(name, 0) != 0) { ! 54: perror(name); ! 55: return; ! 56: } ! 57: lseek(0, SBLOCK * DEV_BSIZE, 0); ! 58: if (read(0, &afs, SBSIZE) != SBSIZE) { ! 59: perror(name); ! 60: return; ! 61: } ! 62: printf("magic\t%x\ttime\t%s", afs.fs_magic, ctime(&afs.fs_time)); ! 63: printf("sblkno\t%d\tcblkno\t%d\tiblkno\t%d\tdblkno\t%d\n", ! 64: afs.fs_sblkno, afs.fs_cblkno, afs.fs_iblkno, afs.fs_dblkno); ! 65: printf("sbsize\t%d\tcgsize\t%d\tcgoffset %d\tcgmask\t0x%08x\n", ! 66: afs.fs_sbsize, afs.fs_cgsize, afs.fs_cgoffset, afs.fs_cgmask); ! 67: printf("ncg\t%d\tsize\t%d\tblocks\t%d\n", ! 68: afs.fs_ncg, afs.fs_size, afs.fs_dsize); ! 69: printf("bsize\t%d\tshift\t%d\tmask\t0x%08x\n", ! 70: afs.fs_bsize, afs.fs_bshift, afs.fs_bmask); ! 71: printf("fsize\t%d\tshift\t%d\tmask\t0x%08x\n", ! 72: afs.fs_fsize, afs.fs_fshift, afs.fs_fmask); ! 73: printf("frag\t%d\tshift\t%d\tfsbtodb\t%d\n", ! 74: afs.fs_frag, afs.fs_fragshift, afs.fs_fsbtodb); ! 75: printf("minfree\t%d%%\tmaxbpg\t%d\n", ! 76: afs.fs_minfree, afs.fs_maxbpg); ! 77: printf("maxcontig %d\trotdelay %dms\trps\t%d\n", ! 78: afs.fs_maxcontig, afs.fs_rotdelay, afs.fs_rps); ! 79: printf("csaddr\t%d\tcssize\t%d\tshift\t%d\tmask\t0x%08x\n", ! 80: afs.fs_csaddr, afs.fs_cssize, afs.fs_csshift, afs.fs_csmask); ! 81: printf("ntrak\t%d\tnsect\t%d\tspc\t%d\tncyl\t%d\n", ! 82: afs.fs_ntrak, afs.fs_nsect, afs.fs_spc, afs.fs_ncyl); ! 83: printf("cpg\t%d\tbpg\t%d\tfpg\t%d\tipg\t%d\n", ! 84: afs.fs_cpg, afs.fs_fpg / afs.fs_frag, afs.fs_fpg, afs.fs_ipg); ! 85: printf("nindir\t%d\tinopb\t%d\tnspf\t%d\n", ! 86: afs.fs_nindir, afs.fs_inopb, afs.fs_nspf); ! 87: printf("nbfree\t%d\tndir\t%d\tnifree\t%d\tnffree\t%d\n", ! 88: afs.fs_cstotal.cs_nbfree, afs.fs_cstotal.cs_ndir, ! 89: afs.fs_cstotal.cs_nifree, afs.fs_cstotal.cs_nffree); ! 90: printf("cgrotor\t%d\tfmod\t%d\tronly\t%d\n", ! 91: afs.fs_cgrotor, afs.fs_fmod, afs.fs_ronly); ! 92: if (afs.fs_cpc != 0) ! 93: printf("blocks available in each rotational position"); ! 94: else ! 95: printf("insufficient space to maintain rotational tables\n"); ! 96: for (c = 0; c < afs.fs_cpc; c++) { ! 97: printf("\ncylinder number %d:", c); ! 98: for (i = 0; i < NRPOS; i++) { ! 99: if (afs.fs_postbl[c][i] == -1) ! 100: continue; ! 101: printf("\n position %d:\t", i); ! 102: for (j = afs.fs_postbl[c][i], k = 1; ; ! 103: j += afs.fs_rotbl[j], k++) { ! 104: printf("%5d", j); ! 105: if (k % 12 == 0) ! 106: printf("\n\t\t"); ! 107: if (afs.fs_rotbl[j] == 0) ! 108: break; ! 109: } ! 110: } ! 111: } ! 112: printf("\ncs[].cs_(nbfree,ndir,nifree,nffree):\n\t"); ! 113: for (i = 0, j = 0; i < afs.fs_cssize; i += afs.fs_bsize, j++) { ! 114: size = afs.fs_cssize - i < afs.fs_bsize ? ! 115: afs.fs_cssize - i : afs.fs_bsize; ! 116: afs.fs_csp[j] = (struct csum *)calloc(1, size); ! 117: lseek(0, fsbtodb(&afs, (afs.fs_csaddr + j * afs.fs_frag)) * ! 118: DEV_BSIZE, 0); ! 119: if (read(0, afs.fs_csp[j], size) != size) { ! 120: perror(name); ! 121: return; ! 122: } ! 123: } ! 124: for (i = 0; i < afs.fs_ncg; i++) { ! 125: struct csum *cs = &afs.fs_cs(&afs, i); ! 126: if (i && i % 4 == 0) ! 127: printf("\n\t"); ! 128: printf("(%d,%d,%d,%d) ", ! 129: cs->cs_nbfree, cs->cs_ndir, cs->cs_nifree, cs->cs_nffree); ! 130: } ! 131: printf("\n"); ! 132: if (afs.fs_ncyl % afs.fs_cpg) { ! 133: printf("cylinders in last group %d\n", ! 134: i = afs.fs_ncyl % afs.fs_cpg); ! 135: printf("blocks in last group %d\n", ! 136: i * afs.fs_spc / NSPB(&afs)); ! 137: } ! 138: printf("\n"); ! 139: for (i = 0; i < afs.fs_ncg; i++) ! 140: dumpcg(name, i); ! 141: close(0); ! 142: }; ! 143: ! 144: dumpcg(name, c) ! 145: char *name; ! 146: int c; ! 147: { ! 148: int i,j; ! 149: ! 150: printf("\ncg %d:\n", c); ! 151: lseek(0, fsbtodb(&afs, cgtod(&afs, c)) * DEV_BSIZE, 0); ! 152: i = lseek(0, 0, 1); ! 153: if (read(0, (char *)&acg, afs.fs_bsize) != afs.fs_bsize) { ! 154: printf("dumpfs: %s: error reading cg\n", name); ! 155: return; ! 156: } ! 157: printf("magic\t%x\ttell\t%x\ttime\t%s", ! 158: acg.cg_magic, i, ctime(&acg.cg_time)); ! 159: printf("cgx\t%d\tncyl\t%d\tniblk\t%d\tndblk\t%d\n", ! 160: acg.cg_cgx, acg.cg_ncyl, acg.cg_niblk, acg.cg_ndblk); ! 161: printf("nbfree\t%d\tndir\t%d\tnifree\t%d\tnffree\t%d\n", ! 162: acg.cg_cs.cs_nbfree, acg.cg_cs.cs_ndir, ! 163: acg.cg_cs.cs_nifree, acg.cg_cs.cs_nffree); ! 164: printf("rotor\t%d\tirotor\t%d\tfrotor\t%d\nfrsum", ! 165: acg.cg_rotor, acg.cg_irotor, acg.cg_frotor); ! 166: for (i = 1, j = 0; i < afs.fs_frag; i++) { ! 167: printf("\t%d", acg.cg_frsum[i]); ! 168: j += i * acg.cg_frsum[i]; ! 169: } ! 170: printf("\nsum of frsum: %d\niused:\t", j); ! 171: pbits(acg.cg_iused, afs.fs_ipg); ! 172: printf("free:\t"); ! 173: pbits(acg.cg_free, afs.fs_fpg); ! 174: printf("b:\n"); ! 175: for (i = 0; i < afs.fs_cpg; i++) { ! 176: printf(" c%d:\t(%d)\t", i, acg.cg_btot[i]); ! 177: for (j = 0; j < NRPOS; j++) ! 178: printf(" %d", acg.cg_b[i][j]); ! 179: printf("\n"); ! 180: } ! 181: }; ! 182: ! 183: pbits(cp, max) ! 184: register char *cp; ! 185: int max; ! 186: { ! 187: register int i; ! 188: int count = 0, j; ! 189: ! 190: for (i = 0; i < max; i++) ! 191: if (isset(cp, i)) { ! 192: if (count) ! 193: printf(",%s", count %9 == 8 ? "\n\t" : " "); ! 194: count++; ! 195: printf("%d", i); ! 196: j = i; ! 197: while ((i+1)<max && isset(cp, i+1)) ! 198: i++; ! 199: if (i != j) ! 200: printf("-%d", i); ! 201: } ! 202: printf("\n"); ! 203: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.