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