pass5.c (19702) | pass5.c (23675) |
---|---|
1/* 2 * Copyright (c) 1980, 1986, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 18 unchanged lines hidden (view full) --- 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34#ifndef lint | 1/* 2 * Copyright (c) 1980, 1986, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 18 unchanged lines hidden (view full) --- 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34#ifndef lint |
35static const char sccsid[] = "@(#)pass5.c 8.2 (Berkeley) 2/2/94"; | 35static const char sccsid[] = "@(#)pass5.c 8.9 (Berkeley) 4/28/95"; |
36#endif /* not lint */ 37 38#include <sys/param.h> 39#include <sys/time.h> | 36#endif /* not lint */ 37 38#include <sys/param.h> 39#include <sys/time.h> |
40 |
|
40#include <ufs/ufs/dinode.h> 41#include <ufs/ffs/fs.h> 42#include <stdio.h> | 41#include <ufs/ufs/dinode.h> 42#include <ufs/ffs/fs.h> 43#include <stdio.h> |
44#include <err.h> |
|
43#include <string.h> | 45#include <string.h> |
46 |
|
44#include "fsck.h" 45 46void 47pass5() 48{ | 47#include "fsck.h" 48 49void 50pass5() 51{ |
49 int c, blk, frags, basesize, sumsize, mapsize, savednrpos = 0; 50 register struct fs *fs = &sblock; 51 register struct cg *cg = &cgrp; 52 daddr_t dbase, dmax; 53 register daddr_t d; 54 register long i, j; | 52 int c, blk, frags, basesize, sumsize, mapsize, savednrpos; 53 struct fs *fs = &sblock; 54 struct cg *cg = &cgrp; 55 ufs_daddr_t dbase, dmax; 56 ufs_daddr_t d; 57 long i, j; |
55 struct csum *cs; 56 struct csum cstotal; 57 struct inodesc idesc[3]; 58 char buf[MAXBSIZE]; 59 register struct cg *newcg = (struct cg *)buf; 60 struct ocg *ocg = (struct ocg *)buf; 61 | 58 struct csum *cs; 59 struct csum cstotal; 60 struct inodesc idesc[3]; 61 char buf[MAXBSIZE]; 62 register struct cg *newcg = (struct cg *)buf; 63 struct ocg *ocg = (struct ocg *)buf; 64 |
62 bzero((char *)newcg, (size_t)fs->fs_cgsize); | 65 statemap[WINO] = USTATE; 66 memset(newcg, 0, (size_t)fs->fs_cgsize); |
63 newcg->cg_niblk = fs->fs_ipg; | 67 newcg->cg_niblk = fs->fs_ipg; |
64 if (cvtlevel > 3) { | 68 if (cvtlevel >= 3) { |
65 if (fs->fs_maxcontig < 2 && fs->fs_contigsumsize > 0) { 66 if (preen) 67 pwarn("DELETING CLUSTERING MAPS\n"); 68 if (preen || reply("DELETE CLUSTERING MAPS")) { 69 fs->fs_contigsumsize = 0; 70 doinglevel1 = 1; 71 sbdirty(); 72 } --- 25 unchanged lines hidden (view full) --- 98 sbdirty(); 99 } 100 } 101 } 102 } 103 switch ((int)fs->fs_postblformat) { 104 105 case FS_42POSTBLFMT: | 69 if (fs->fs_maxcontig < 2 && fs->fs_contigsumsize > 0) { 70 if (preen) 71 pwarn("DELETING CLUSTERING MAPS\n"); 72 if (preen || reply("DELETE CLUSTERING MAPS")) { 73 fs->fs_contigsumsize = 0; 74 doinglevel1 = 1; 75 sbdirty(); 76 } --- 25 unchanged lines hidden (view full) --- 102 sbdirty(); 103 } 104 } 105 } 106 } 107 switch ((int)fs->fs_postblformat) { 108 109 case FS_42POSTBLFMT: |
106 basesize = (char *)(&ocg->cg_btot[0]) - (char *)(&ocg->cg_link); 107 sumsize = &ocg->cg_iused[0] - (char *)(&ocg->cg_btot[0]); | 110 basesize = (char *)(&ocg->cg_btot[0]) - 111 (char *)(&ocg->cg_firstfield); 112 sumsize = &ocg->cg_iused[0] - (u_int8_t *)(&ocg->cg_btot[0]); |
108 mapsize = &ocg->cg_free[howmany(fs->fs_fpg, NBBY)] - 109 (u_char *)&ocg->cg_iused[0]; 110 ocg->cg_magic = CG_MAGIC; 111 savednrpos = fs->fs_nrpos; 112 fs->fs_nrpos = 8; 113 break; 114 115 case FS_DYNAMICPOSTBLFMT: 116 newcg->cg_btotoff = | 113 mapsize = &ocg->cg_free[howmany(fs->fs_fpg, NBBY)] - 114 (u_char *)&ocg->cg_iused[0]; 115 ocg->cg_magic = CG_MAGIC; 116 savednrpos = fs->fs_nrpos; 117 fs->fs_nrpos = 8; 118 break; 119 120 case FS_DYNAMICPOSTBLFMT: 121 newcg->cg_btotoff = |
117 &newcg->cg_space[0] - (u_char *)(&newcg->cg_link); | 122 &newcg->cg_space[0] - (u_char *)(&newcg->cg_firstfield); |
118 newcg->cg_boff = 119 newcg->cg_btotoff + fs->fs_cpg * sizeof(long); 120 newcg->cg_iusedoff = newcg->cg_boff + 121 fs->fs_cpg * fs->fs_nrpos * sizeof(short); 122 newcg->cg_freeoff = 123 newcg->cg_iusedoff + howmany(fs->fs_ipg, NBBY); 124 if (fs->fs_contigsumsize <= 0) { 125 newcg->cg_nextfreeoff = newcg->cg_freeoff + --- 5 unchanged lines hidden (view full) --- 131 newcg->cg_clustersumoff = 132 roundup(newcg->cg_clustersumoff, sizeof(long)); 133 newcg->cg_clusteroff = newcg->cg_clustersumoff + 134 (fs->fs_contigsumsize + 1) * sizeof(long); 135 newcg->cg_nextfreeoff = newcg->cg_clusteroff + 136 howmany(fs->fs_cpg * fs->fs_spc / NSPB(fs), NBBY); 137 } 138 newcg->cg_magic = CG_MAGIC; | 123 newcg->cg_boff = 124 newcg->cg_btotoff + fs->fs_cpg * sizeof(long); 125 newcg->cg_iusedoff = newcg->cg_boff + 126 fs->fs_cpg * fs->fs_nrpos * sizeof(short); 127 newcg->cg_freeoff = 128 newcg->cg_iusedoff + howmany(fs->fs_ipg, NBBY); 129 if (fs->fs_contigsumsize <= 0) { 130 newcg->cg_nextfreeoff = newcg->cg_freeoff + --- 5 unchanged lines hidden (view full) --- 136 newcg->cg_clustersumoff = 137 roundup(newcg->cg_clustersumoff, sizeof(long)); 138 newcg->cg_clusteroff = newcg->cg_clustersumoff + 139 (fs->fs_contigsumsize + 1) * sizeof(long); 140 newcg->cg_nextfreeoff = newcg->cg_clusteroff + 141 howmany(fs->fs_cpg * fs->fs_spc / NSPB(fs), NBBY); 142 } 143 newcg->cg_magic = CG_MAGIC; |
139 basesize = &newcg->cg_space[0] - (u_char *)(&newcg->cg_link); | 144 basesize = &newcg->cg_space[0] - 145 (u_char *)(&newcg->cg_firstfield); |
140 sumsize = newcg->cg_iusedoff - newcg->cg_btotoff; 141 mapsize = newcg->cg_nextfreeoff - newcg->cg_iusedoff; 142 break; 143 144 default: | 146 sumsize = newcg->cg_iusedoff - newcg->cg_btotoff; 147 mapsize = newcg->cg_nextfreeoff - newcg->cg_iusedoff; 148 break; 149 150 default: |
145 errexit("UNKNOWN ROTATIONAL TABLE FORMAT %d\n", | 151 sumsize = 0; /* keep lint happy */ 152 errx(EEXIT, "UNKNOWN ROTATIONAL TABLE FORMAT %d", |
146 fs->fs_postblformat); 147 } | 153 fs->fs_postblformat); 154 } |
148 bzero((char *)&idesc[0], sizeof idesc); | 155 memset(&idesc[0], 0, sizeof idesc); |
149 for (i = 0; i < 3; i++) { 150 idesc[i].id_type = ADDR; 151 if (doinglevel2) 152 idesc[i].id_fix = FIX; 153 } | 156 for (i = 0; i < 3; i++) { 157 idesc[i].id_type = ADDR; 158 if (doinglevel2) 159 idesc[i].id_fix = FIX; 160 } |
154 bzero((char *)&cstotal, sizeof(struct csum)); | 161 memset(&cstotal, 0, sizeof(struct csum)); |
155 j = blknum(fs, fs->fs_size + fs->fs_frag - 1); 156 for (i = fs->fs_size; i < j; i++) 157 setbmap(i); 158 for (c = 0; c < fs->fs_ncg; c++) { 159 getblk(&cgblk, cgtod(fs, c), fs->fs_cgsize); 160 if (!cg_chkmagic(cg)) 161 pfatal("CG %d: BAD MAGIC NUMBER\n", c); 162 dbase = cgbase(fs, c); --- 20 unchanged lines hidden (view full) --- 183 if (cg->cg_frotor < newcg->cg_ndblk) 184 newcg->cg_frotor = cg->cg_frotor; 185 else 186 newcg->cg_frotor = 0; 187 if (cg->cg_irotor < newcg->cg_niblk) 188 newcg->cg_irotor = cg->cg_irotor; 189 else 190 newcg->cg_irotor = 0; | 162 j = blknum(fs, fs->fs_size + fs->fs_frag - 1); 163 for (i = fs->fs_size; i < j; i++) 164 setbmap(i); 165 for (c = 0; c < fs->fs_ncg; c++) { 166 getblk(&cgblk, cgtod(fs, c), fs->fs_cgsize); 167 if (!cg_chkmagic(cg)) 168 pfatal("CG %d: BAD MAGIC NUMBER\n", c); 169 dbase = cgbase(fs, c); --- 20 unchanged lines hidden (view full) --- 190 if (cg->cg_frotor < newcg->cg_ndblk) 191 newcg->cg_frotor = cg->cg_frotor; 192 else 193 newcg->cg_frotor = 0; 194 if (cg->cg_irotor < newcg->cg_niblk) 195 newcg->cg_irotor = cg->cg_irotor; 196 else 197 newcg->cg_irotor = 0; |
191 bzero((char *)&newcg->cg_frsum[0], sizeof newcg->cg_frsum); 192 bzero((char *)&cg_blktot(newcg)[0], | 198 memset(&newcg->cg_frsum[0], 0, sizeof newcg->cg_frsum); 199 memset(&cg_blktot(newcg)[0], 0, |
193 (size_t)(sumsize + mapsize)); 194 if (fs->fs_postblformat == FS_42POSTBLFMT) 195 ocg->cg_magic = CG_MAGIC; 196 j = fs->fs_ipg * c; 197 for (i = 0; i < fs->fs_ipg; j++, i++) { 198 switch (statemap[j]) { 199 200 case USTATE: --- 9 unchanged lines hidden (view full) --- 210 case FCLEAR: 211 newcg->cg_cs.cs_nifree--; 212 setbit(cg_inosused(newcg), i); 213 break; 214 215 default: 216 if (j < ROOTINO) 217 break; | 200 (size_t)(sumsize + mapsize)); 201 if (fs->fs_postblformat == FS_42POSTBLFMT) 202 ocg->cg_magic = CG_MAGIC; 203 j = fs->fs_ipg * c; 204 for (i = 0; i < fs->fs_ipg; j++, i++) { 205 switch (statemap[j]) { 206 207 case USTATE: --- 9 unchanged lines hidden (view full) --- 217 case FCLEAR: 218 newcg->cg_cs.cs_nifree--; 219 setbit(cg_inosused(newcg), i); 220 break; 221 222 default: 223 if (j < ROOTINO) 224 break; |
218 errexit("BAD STATE %d FOR INODE I=%d", | 225 errx(EEXIT, "BAD STATE %d FOR INODE I=%d", |
219 statemap[j], j); 220 } 221 } 222 if (c == 0) 223 for (i = 0; i < ROOTINO; i++) { 224 setbit(cg_inosused(newcg), i); 225 newcg->cg_cs.cs_nifree--; 226 } --- 17 unchanged lines hidden (view full) --- 244 i / fs->fs_frag); 245 } else if (frags > 0) { 246 newcg->cg_cs.cs_nffree += frags; 247 blk = blkmap(fs, cg_blksfree(newcg), i); 248 ffs_fragacct(fs, blk, newcg->cg_frsum, 1); 249 } 250 } 251 if (fs->fs_contigsumsize > 0) { | 226 statemap[j], j); 227 } 228 } 229 if (c == 0) 230 for (i = 0; i < ROOTINO; i++) { 231 setbit(cg_inosused(newcg), i); 232 newcg->cg_cs.cs_nifree--; 233 } --- 17 unchanged lines hidden (view full) --- 251 i / fs->fs_frag); 252 } else if (frags > 0) { 253 newcg->cg_cs.cs_nffree += frags; 254 blk = blkmap(fs, cg_blksfree(newcg), i); 255 ffs_fragacct(fs, blk, newcg->cg_frsum, 1); 256 } 257 } 258 if (fs->fs_contigsumsize > 0) { |
252 long *sump = cg_clustersum(newcg); | 259 int32_t *sump = cg_clustersum(newcg); |
253 u_char *mapp = cg_clustersfree(newcg); 254 int map = *mapp++; 255 int bit = 1; 256 int run = 0; 257 258 for (i = 0; i < newcg->cg_nclusterblks; i++) { 259 if ((map & bit) != 0) { 260 run++; --- 16 unchanged lines hidden (view full) --- 277 sump[run]++; 278 } 279 } 280 cstotal.cs_nffree += newcg->cg_cs.cs_nffree; 281 cstotal.cs_nbfree += newcg->cg_cs.cs_nbfree; 282 cstotal.cs_nifree += newcg->cg_cs.cs_nifree; 283 cstotal.cs_ndir += newcg->cg_cs.cs_ndir; 284 cs = &fs->fs_cs(fs, c); | 260 u_char *mapp = cg_clustersfree(newcg); 261 int map = *mapp++; 262 int bit = 1; 263 int run = 0; 264 265 for (i = 0; i < newcg->cg_nclusterblks; i++) { 266 if ((map & bit) != 0) { 267 run++; --- 16 unchanged lines hidden (view full) --- 284 sump[run]++; 285 } 286 } 287 cstotal.cs_nffree += newcg->cg_cs.cs_nffree; 288 cstotal.cs_nbfree += newcg->cg_cs.cs_nbfree; 289 cstotal.cs_nifree += newcg->cg_cs.cs_nifree; 290 cstotal.cs_ndir += newcg->cg_cs.cs_ndir; 291 cs = &fs->fs_cs(fs, c); |
285 if (bcmp((char *)&newcg->cg_cs, (char *)cs, sizeof *cs) != 0 && | 292 if (memcmp(&newcg->cg_cs, cs, sizeof *cs) != 0 && |
286 dofix(&idesc[0], "FREE BLK COUNT(S) WRONG IN SUPERBLK")) { | 293 dofix(&idesc[0], "FREE BLK COUNT(S) WRONG IN SUPERBLK")) { |
287 bcopy((char *)&newcg->cg_cs, (char *)cs, sizeof *cs); | 294 memmove(cs, &newcg->cg_cs, sizeof *cs); |
288 sbdirty(); 289 } 290 if (doinglevel1) { | 295 sbdirty(); 296 } 297 if (doinglevel1) { |
291 bcopy((char *)newcg, (char *)cg, (size_t)fs->fs_cgsize); | 298 memmove(cg, newcg, (size_t)fs->fs_cgsize); |
292 cgdirty(); 293 continue; 294 } | 299 cgdirty(); 300 continue; 301 } |
295 if (bcmp(cg_inosused(newcg), | 302 if (memcmp(cg_inosused(newcg), |
296 cg_inosused(cg), mapsize) != 0 && 297 dofix(&idesc[1], "BLK(S) MISSING IN BIT MAPS")) { | 303 cg_inosused(cg), mapsize) != 0 && 304 dofix(&idesc[1], "BLK(S) MISSING IN BIT MAPS")) { |
298 bcopy(cg_inosused(newcg), cg_inosused(cg), | 305 memmove(cg_inosused(cg), cg_inosused(newcg), |
299 (size_t)mapsize); 300 cgdirty(); 301 } | 306 (size_t)mapsize); 307 cgdirty(); 308 } |
302 if ((bcmp((char *)newcg, (char *)cg, basesize) != 0 || 303 bcmp((char *)&cg_blktot(newcg)[0], 304 (char *)&cg_blktot(cg)[0], sumsize) != 0) && | 309 if ((memcmp(newcg, cg, basesize) != 0 || 310 memcmp(&cg_blktot(newcg)[0], 311 &cg_blktot(cg)[0], sumsize) != 0) && |
305 dofix(&idesc[2], "SUMMARY INFORMATION BAD")) { | 312 dofix(&idesc[2], "SUMMARY INFORMATION BAD")) { |
306 bcopy((char *)newcg, (char *)cg, (size_t)basesize); 307 bcopy((char *)&cg_blktot(newcg)[0], 308 (char *)&cg_blktot(cg)[0], (size_t)sumsize); | 313 memmove(cg, newcg, (size_t)basesize); 314 memmove(&cg_blktot(cg)[0], 315 &cg_blktot(newcg)[0], (size_t)sumsize); |
309 cgdirty(); 310 } 311 } 312 if (fs->fs_postblformat == FS_42POSTBLFMT) 313 fs->fs_nrpos = savednrpos; | 316 cgdirty(); 317 } 318 } 319 if (fs->fs_postblformat == FS_42POSTBLFMT) 320 fs->fs_nrpos = savednrpos; |
314 if (bcmp((char *)&cstotal, (char *)&fs->fs_cstotal, sizeof *cs) != 0 | 321 if (memcmp(&cstotal, &fs->fs_cstotal, sizeof *cs) != 0 |
315 && dofix(&idesc[0], "FREE BLK COUNT(S) WRONG IN SUPERBLK")) { | 322 && dofix(&idesc[0], "FREE BLK COUNT(S) WRONG IN SUPERBLK")) { |
316 bcopy((char *)&cstotal, (char *)&fs->fs_cstotal, sizeof *cs); | 323 memmove(&fs->fs_cstotal, &cstotal, sizeof *cs); |
317 fs->fs_ronly = 0; 318 sbdirty(); 319 } 320 if (fs->fs_fmod != 0) { 321 pwarn("MODIFIED FLAG SET IN SUPERBLOCK"); 322 if (preen) 323 printf(" (FIXED)\n"); 324 if (preen || reply("FIX") == 1) { --- 14 unchanged lines hidden --- | 324 fs->fs_ronly = 0; 325 sbdirty(); 326 } 327 if (fs->fs_fmod != 0) { 328 pwarn("MODIFIED FLAG SET IN SUPERBLOCK"); 329 if (preen) 330 printf(" (FIXED)\n"); 331 if (preen || reply("FIX") == 1) { --- 14 unchanged lines hidden --- |