|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1980 Regents of the University of California. ! 3: * All rights reserved. The Berkeley software License Agreement ! 4: * specifies the terms and conditions for redistribution. ! 5: */ ! 6: ! 7: #ifndef lint ! 8: static char sccsid[] = "@(#)pass5.c 5.5 (Berkeley) 5/7/88"; ! 9: #endif not lint ! 10: ! 11: #include <sys/param.h> ! 12: #include <sys/inode.h> ! 13: #include <sys/fs.h> ! 14: #include "fsck.h" ! 15: ! 16: pass5() ! 17: { ! 18: int c, blk, frags, basesize, sumsize, mapsize, savednrpos; ! 19: register struct fs *fs = &sblock; ! 20: register struct cg *cg = &cgrp; ! 21: daddr_t dbase, dmax; ! 22: register daddr_t d; ! 23: register long i, j; ! 24: struct csum *cs; ! 25: time_t now; ! 26: struct csum cstotal; ! 27: struct inodesc idesc; ! 28: char buf[MAXBSIZE]; ! 29: register struct cg *newcg = (struct cg *)buf; ! 30: struct ocg *ocg = (struct ocg *)buf; ! 31: ! 32: bzero((char *)newcg, fs->fs_cgsize); ! 33: newcg->cg_niblk = fs->fs_ipg; ! 34: switch (fs->fs_postblformat) { ! 35: ! 36: case FS_42POSTBLFMT: ! 37: basesize = (char *)(&ocg->cg_btot[0]) - (char *)(&ocg->cg_link); ! 38: sumsize = &ocg->cg_iused[0] - (char *)(&ocg->cg_btot[0]); ! 39: mapsize = &ocg->cg_free[howmany(fs->fs_fpg, NBBY)] - ! 40: (u_char *)&ocg->cg_iused[0]; ! 41: ocg->cg_magic = CG_MAGIC; ! 42: savednrpos = fs->fs_nrpos; ! 43: fs->fs_nrpos = 8; ! 44: break; ! 45: ! 46: case FS_DYNAMICPOSTBLFMT: ! 47: newcg->cg_btotoff = ! 48: &newcg->cg_space[0] - (u_char *)(&newcg->cg_link); ! 49: newcg->cg_boff = ! 50: newcg->cg_btotoff + fs->fs_cpg * sizeof(long); ! 51: newcg->cg_iusedoff = newcg->cg_boff + ! 52: fs->fs_cpg * fs->fs_nrpos * sizeof(short); ! 53: newcg->cg_freeoff = ! 54: newcg->cg_iusedoff + howmany(fs->fs_ipg, NBBY); ! 55: newcg->cg_nextfreeoff = newcg->cg_freeoff + ! 56: howmany(fs->fs_cpg * fs->fs_spc / NSPF(fs), ! 57: NBBY); ! 58: newcg->cg_magic = CG_MAGIC; ! 59: basesize = &newcg->cg_space[0] - (u_char *)(&newcg->cg_link); ! 60: sumsize = newcg->cg_iusedoff - newcg->cg_btotoff; ! 61: mapsize = newcg->cg_nextfreeoff - newcg->cg_iusedoff; ! 62: break; ! 63: ! 64: default: ! 65: errexit("UNKNOWN ROTATIONAL TABLE FORMAT %d\n", ! 66: fs->fs_postblformat); ! 67: } ! 68: bzero((char *)&idesc, sizeof(struct inodesc)); ! 69: idesc.id_type = ADDR; ! 70: bzero((char *)&cstotal, sizeof(struct csum)); ! 71: (void)time(&now); ! 72: for (i = fs->fs_size; i < fragroundup(fs, fs->fs_size); i++) ! 73: setbmap(i); ! 74: for (c = 0; c < fs->fs_ncg; c++) { ! 75: getblk(&cgblk, cgtod(fs, c), fs->fs_cgsize); ! 76: if (!cg_chkmagic(cg)) ! 77: pfatal("CG %d: BAD MAGIC NUMBER\n", c); ! 78: dbase = cgbase(fs, c); ! 79: dmax = dbase + fs->fs_fpg; ! 80: if (dmax > fs->fs_size) ! 81: dmax = fs->fs_size; ! 82: if (now > cg->cg_time) ! 83: newcg->cg_time = cg->cg_time; ! 84: else ! 85: newcg->cg_time = now; ! 86: newcg->cg_cgx = c; ! 87: if (c == fs->fs_ncg - 1) ! 88: newcg->cg_ncyl = fs->fs_ncyl % fs->fs_cpg; ! 89: else ! 90: newcg->cg_ncyl = fs->fs_cpg; ! 91: newcg->cg_ndblk = dmax - dbase; ! 92: newcg->cg_cs.cs_ndir = 0; ! 93: newcg->cg_cs.cs_nffree = 0; ! 94: newcg->cg_cs.cs_nbfree = 0; ! 95: newcg->cg_cs.cs_nifree = fs->fs_ipg; ! 96: if (cg->cg_rotor < newcg->cg_ndblk) ! 97: newcg->cg_rotor = cg->cg_rotor; ! 98: else ! 99: newcg->cg_rotor = 0; ! 100: if (cg->cg_frotor < newcg->cg_ndblk) ! 101: newcg->cg_frotor = cg->cg_frotor; ! 102: else ! 103: newcg->cg_frotor = 0; ! 104: if (cg->cg_irotor < newcg->cg_niblk) ! 105: newcg->cg_irotor = cg->cg_irotor; ! 106: else ! 107: newcg->cg_irotor = 0; ! 108: bzero((char *)&newcg->cg_frsum[0], sizeof newcg->cg_frsum); ! 109: bzero((char *)&cg_blktot(newcg)[0], sumsize + mapsize); ! 110: if (fs->fs_postblformat == FS_42POSTBLFMT) ! 111: ocg->cg_magic = CG_MAGIC; ! 112: j = fs->fs_ipg * c; ! 113: for (i = 0; i < fs->fs_ipg; j++, i++) { ! 114: switch (statemap[j]) { ! 115: ! 116: case USTATE: ! 117: break; ! 118: ! 119: case DSTATE: ! 120: case DCLEAR: ! 121: case DFOUND: ! 122: newcg->cg_cs.cs_ndir++; ! 123: /* fall through */ ! 124: ! 125: case FSTATE: ! 126: case FCLEAR: ! 127: newcg->cg_cs.cs_nifree--; ! 128: setbit(cg_inosused(newcg), i); ! 129: break; ! 130: ! 131: default: ! 132: if (j < ROOTINO) ! 133: break; ! 134: errexit("BAD STATE %d FOR INODE I=%d", ! 135: statemap[j], j); ! 136: } ! 137: } ! 138: if (c == 0) ! 139: for (i = 0; i < ROOTINO; i++) { ! 140: setbit(cg_inosused(newcg), i); ! 141: newcg->cg_cs.cs_nifree--; ! 142: } ! 143: for (i = 0, d = dbase; ! 144: d < dmax; ! 145: d += fs->fs_frag, i += fs->fs_frag) { ! 146: frags = 0; ! 147: for (j = 0; j < fs->fs_frag; j++) { ! 148: if (getbmap(d + j)) ! 149: continue; ! 150: setbit(cg_blksfree(newcg), i + j); ! 151: frags++; ! 152: } ! 153: if (frags == fs->fs_frag) { ! 154: newcg->cg_cs.cs_nbfree++; ! 155: j = cbtocylno(fs, i); ! 156: cg_blktot(newcg)[j]++; ! 157: cg_blks(fs, newcg, j)[cbtorpos(fs, i)]++; ! 158: } else if (frags > 0) { ! 159: newcg->cg_cs.cs_nffree += frags; ! 160: blk = blkmap(fs, cg_blksfree(newcg), i); ! 161: fragacct(fs, blk, newcg->cg_frsum, 1); ! 162: } ! 163: } ! 164: cstotal.cs_nffree += newcg->cg_cs.cs_nffree; ! 165: cstotal.cs_nbfree += newcg->cg_cs.cs_nbfree; ! 166: cstotal.cs_nifree += newcg->cg_cs.cs_nifree; ! 167: cstotal.cs_ndir += newcg->cg_cs.cs_ndir; ! 168: cs = &fs->fs_cs(fs, c); ! 169: if (bcmp((char *)&newcg->cg_cs, (char *)cs, sizeof *cs) != 0 && ! 170: dofix(&idesc, "FREE BLK COUNT(S) WRONG IN SUPERBLK")) { ! 171: bcopy((char *)&newcg->cg_cs, (char *)cs, sizeof *cs); ! 172: sbdirty(); ! 173: } ! 174: if (cvtflag) { ! 175: bcopy((char *)newcg, (char *)cg, fs->fs_cgsize); ! 176: cgdirty(); ! 177: continue; ! 178: } ! 179: if (bcmp(cg_inosused(newcg), ! 180: cg_inosused(cg), mapsize) != 0 && ! 181: dofix(&idesc, "BLK(S) MISSING IN BIT MAPS")) { ! 182: bcopy(cg_inosused(newcg), cg_inosused(cg), mapsize); ! 183: cgdirty(); ! 184: } ! 185: if ((bcmp((char *)newcg, (char *)cg, basesize) != 0 || ! 186: bcmp((char *)&cg_blktot(newcg)[0], ! 187: (char *)&cg_blktot(cg)[0], sumsize) != 0) && ! 188: dofix(&idesc, "SUMMARY INFORMATION BAD")) { ! 189: bcopy((char *)newcg, (char *)cg, basesize); ! 190: bcopy((char *)&cg_blktot(newcg)[0], ! 191: (char *)&cg_blktot(cg)[0], sumsize); ! 192: cgdirty(); ! 193: } ! 194: } ! 195: if (fs->fs_postblformat == FS_42POSTBLFMT) ! 196: fs->fs_nrpos = savednrpos; ! 197: if (bcmp((char *)&cstotal, (char *)&fs->fs_cstotal, sizeof *cs) != 0 ! 198: && dofix(&idesc, "FREE BLK COUNT(S) WRONG IN SUPERBLK")) { ! 199: bcopy((char *)&cstotal, (char *)&fs->fs_cstotal, sizeof *cs); ! 200: fs->fs_ronly = 0; ! 201: fs->fs_fmod = 0; ! 202: sbdirty(); ! 203: } ! 204: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.