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.1 (Berkeley) 06/05/85"; 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, sumsize, mapsize; 19 daddr_t dbase, dmax, d; 20 register long i, j; 21 struct csum *cs; 22 time_t now; 23 struct csum cstotal; 24 struct inodesc idesc; 25 char buf[MAXBSIZE]; 26 register struct cg *newcg = (struct cg *)buf; 27 28 bzero((char *)newcg, sblock.fs_cgsize); 29 newcg->cg_magic = CG_MAGIC; 30 bzero((char *)&idesc, sizeof(struct inodesc)); 31 idesc.id_type = ADDR; 32 bzero((char *)&cstotal, sizeof(struct csum)); 33 sumsize = cgrp.cg_iused - (char *)(&cgrp); 34 mapsize = &cgrp.cg_free[howmany(sblock.fs_fpg, NBBY)] - 35 (u_char *)cgrp.cg_iused; 36 (void)time(&now); 37 for (c = 0; c < sblock.fs_ncg; c++) { 38 getblk(&cgblk, cgtod(&sblock, c), sblock.fs_cgsize); 39 if (cgrp.cg_magic != CG_MAGIC) 40 pfatal("CG %d: BAD MAGIC NUMBER\n", c); 41 dbase = cgbase(&sblock, c); 42 dmax = dbase + sblock.fs_fpg; 43 if (dmax > sblock.fs_size) 44 dmax = sblock.fs_size; 45 if (now > cgrp.cg_time) 46 newcg->cg_time = cgrp.cg_time; 47 else 48 newcg->cg_time = now; 49 newcg->cg_cgx = c; 50 if (c == sblock.fs_ncg - 1) 51 newcg->cg_ncyl = sblock.fs_ncyl % sblock.fs_cpg; 52 else 53 newcg->cg_ncyl = sblock.fs_cpg; 54 newcg->cg_niblk = sblock.fs_ipg; 55 newcg->cg_ndblk = dmax - dbase; 56 newcg->cg_cs.cs_ndir = 0; 57 newcg->cg_cs.cs_nffree = 0; 58 newcg->cg_cs.cs_nbfree = 0; 59 newcg->cg_cs.cs_nifree = sblock.fs_ipg; 60 if (cgrp.cg_rotor < newcg->cg_ndblk) 61 newcg->cg_rotor = cgrp.cg_rotor; 62 else 63 newcg->cg_rotor = 0; 64 if (cgrp.cg_frotor < newcg->cg_ndblk) 65 newcg->cg_frotor = cgrp.cg_frotor; 66 else 67 newcg->cg_frotor = 0; 68 if (cgrp.cg_irotor < newcg->cg_niblk) 69 newcg->cg_irotor = cgrp.cg_irotor; 70 else 71 newcg->cg_irotor = 0; 72 bzero((char *)newcg->cg_frsum, sizeof newcg->cg_frsum); 73 bzero((char *)newcg->cg_btot, sizeof newcg->cg_btot); 74 bzero((char *)newcg->cg_b, sizeof newcg->cg_b); 75 bzero((char *)newcg->cg_free, howmany(sblock.fs_fpg, NBBY)); 76 bzero((char *)newcg->cg_iused, howmany(sblock.fs_ipg, NBBY)); 77 j = sblock.fs_ipg * c; 78 for (i = 0; i < sblock.fs_ipg; j++, i++) { 79 switch (statemap[j]) { 80 81 case USTATE: 82 break; 83 84 case DSTATE: 85 case DCLEAR: 86 case DFOUND: 87 newcg->cg_cs.cs_ndir++; 88 /* fall through */ 89 90 case FSTATE: 91 case FCLEAR: 92 newcg->cg_cs.cs_nifree--; 93 setbit(newcg->cg_iused, i); 94 break; 95 } 96 } 97 if (c == 0) 98 for (i = 0; i < ROOTINO; i++) { 99 setbit(newcg->cg_iused, i); 100 newcg->cg_cs.cs_nifree--; 101 } 102 for (i = 0, d = dbase; 103 d <= dmax - sblock.fs_frag; 104 d += sblock.fs_frag, i += sblock.fs_frag) { 105 frags = 0; 106 for (j = 0; j < sblock.fs_frag; j++) { 107 if (getbmap(d + j)) 108 continue; 109 setbit(newcg->cg_free, i + j); 110 frags++; 111 } 112 if (frags == sblock.fs_frag) { 113 newcg->cg_cs.cs_nbfree++; 114 j = cbtocylno(&sblock, i); 115 newcg->cg_btot[j]++; 116 newcg->cg_b[j][cbtorpos(&sblock, i)]++; 117 } else if (frags > 0) { 118 newcg->cg_cs.cs_nffree += frags; 119 blk = blkmap(&sblock, newcg->cg_free, i); 120 fragacct(&sblock, blk, newcg->cg_frsum, 1); 121 } 122 } 123 for (frags = d; d < dmax; d++) { 124 if (getbmap(d)) 125 continue; 126 setbit(newcg->cg_free, d - dbase); 127 newcg->cg_cs.cs_nffree++; 128 } 129 if (frags != d) { 130 blk = blkmap(&sblock, newcg->cg_free, (frags - dbase)); 131 fragacct(&sblock, blk, newcg->cg_frsum, 1); 132 } 133 cstotal.cs_nffree += newcg->cg_cs.cs_nffree; 134 cstotal.cs_nbfree += newcg->cg_cs.cs_nbfree; 135 cstotal.cs_nifree += newcg->cg_cs.cs_nifree; 136 cstotal.cs_ndir += newcg->cg_cs.cs_ndir; 137 if (bcmp(newcg->cg_iused, cgrp.cg_iused, mapsize) != 0 && 138 dofix(&idesc, "BLK(S) MISSING IN BIT MAPS")) { 139 bcopy(newcg->cg_iused, cgrp.cg_iused, mapsize); 140 cgdirty(); 141 } 142 if (bcmp((char *)newcg, (char *)&cgrp, sumsize) != 0 && 143 dofix(&idesc, "SUMMARY INFORMATION BAD")) { 144 bcopy((char *)newcg, (char *)&cgrp, sumsize); 145 cgdirty(); 146 } 147 cs = &sblock.fs_cs(&sblock, c); 148 if (bcmp((char *)&newcg->cg_cs, (char *)cs, sizeof *cs) != 0 && 149 dofix(&idesc, "FREE BLK COUNT(S) WRONG IN SUPERBLK")) { 150 bcopy((char *)&newcg->cg_cs, (char *)cs, sizeof *cs); 151 sbdirty(); 152 } 153 } 154 if (bcmp((char *)&cstotal, (char *)&sblock.fs_cstotal, sizeof *cs) != 0 155 && dofix(&idesc, "FREE BLK COUNT(S) WRONG IN SUPERBLK")) { 156 bcopy((char *)&cstotal, (char *)&sblock.fs_cstotal, sizeof *cs); 157 sblock.fs_ronly = 0; 158 sblock.fs_fmod = 0; 159 sbdirty(); 160 } 161 } 162