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