1 1.58 riastrad /* $NetBSD: pass5.c,v 1.58 2023/07/04 20:40:53 riastradh Exp $ */ 2 1.13 cgd 3 1.1 cgd /* 4 1.6 mycroft * Copyright (c) 1980, 1986, 1993 5 1.6 mycroft * The Regents of the University of California. All rights reserved. 6 1.1 cgd * 7 1.1 cgd * Redistribution and use in source and binary forms, with or without 8 1.1 cgd * modification, are permitted provided that the following conditions 9 1.1 cgd * are met: 10 1.1 cgd * 1. Redistributions of source code must retain the above copyright 11 1.1 cgd * notice, this list of conditions and the following disclaimer. 12 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 13 1.1 cgd * notice, this list of conditions and the following disclaimer in the 14 1.1 cgd * documentation and/or other materials provided with the distribution. 15 1.37 agc * 3. Neither the name of the University nor the names of its contributors 16 1.1 cgd * may be used to endorse or promote products derived from this software 17 1.1 cgd * without specific prior written permission. 18 1.1 cgd * 19 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 1.1 cgd * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 1.1 cgd * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 1.1 cgd * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 1.1 cgd * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 1.1 cgd * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 1.1 cgd * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 1.1 cgd * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 1.1 cgd * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 1.1 cgd * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 1.1 cgd * SUCH DAMAGE. 30 1.1 cgd */ 31 1.1 cgd 32 1.17 lukem #include <sys/cdefs.h> 33 1.1 cgd #ifndef lint 34 1.13 cgd #if 0 35 1.18 lukem static char sccsid[] = "@(#)pass5.c 8.9 (Berkeley) 4/28/95"; 36 1.13 cgd #else 37 1.58 riastrad __RCSID("$NetBSD: pass5.c,v 1.58 2023/07/04 20:40:53 riastradh Exp $"); 38 1.13 cgd #endif 39 1.1 cgd #endif /* not lint */ 40 1.1 cgd 41 1.1 cgd #include <sys/param.h> 42 1.5 cgd #include <sys/time.h> 43 1.18 lukem 44 1.6 mycroft #include <ufs/ufs/dinode.h> 45 1.6 mycroft #include <ufs/ffs/fs.h> 46 1.19 bouyer #include <ufs/ffs/ffs_extern.h> 47 1.19 bouyer #include <ufs/ufs/ufs_bswap.h> 48 1.18 lukem 49 1.18 lukem #include <err.h> 50 1.1 cgd #include <string.h> 51 1.50 dholland #include <stdlib.h> 52 1.15 christos 53 1.16 christos #include "fsutil.h" 54 1.1 cgd #include "fsck.h" 55 1.10 cgd #include "extern.h" 56 1.1 cgd 57 1.45 xtraeme void print_bmap(u_char *,u_int32_t); 58 1.19 bouyer 59 1.10 cgd void 60 1.34 fvdl pass5(void) 61 1.1 cgd { 62 1.56 chs int blk, frags, basesize, sumsize, mapsize, cssize; 63 1.57 chs uint32_t inomapsize, blkmapsize; 64 1.56 chs uint32_t c; 65 1.19 bouyer struct fs *fs = sblock; 66 1.32 fvdl daddr_t dbase, dmax; 67 1.32 fvdl daddr_t d; 68 1.57 chs uint32_t i; 69 1.57 chs int32_t j; 70 1.57 chs int k; 71 1.57 chs ino_t inum; 72 1.1 cgd struct csum *cs; 73 1.34 fvdl struct csum_total cstotal; 74 1.26 thorpej struct inodesc idesc[4]; 75 1.1 cgd char buf[MAXBSIZE]; 76 1.17 lukem struct cg *newcg = (struct cg *)buf; 77 1.39 dbj struct ocg *ocg = (struct ocg *)buf; 78 1.38 itojun struct cg *cg = cgrp, *ncg; 79 1.34 fvdl struct inostat *info; 80 1.38 itojun u_int32_t ncgsize; 81 1.1 cgd 82 1.51 dholland inoinfo(UFS_WINO)->ino_state = USTATE; 83 1.7 mycroft memset(newcg, 0, (size_t)fs->fs_cgsize); 84 1.1 cgd newcg->cg_niblk = fs->fs_ipg; 85 1.12 mycroft if (cvtlevel >= 3) { 86 1.6 mycroft if (fs->fs_maxcontig < 2 && fs->fs_contigsumsize > 0) { 87 1.6 mycroft if (preen) 88 1.6 mycroft pwarn("DELETING CLUSTERING MAPS\n"); 89 1.6 mycroft if (preen || reply("DELETE CLUSTERING MAPS")) { 90 1.6 mycroft fs->fs_contigsumsize = 0; 91 1.6 mycroft doinglevel1 = 1; 92 1.6 mycroft sbdirty(); 93 1.6 mycroft } 94 1.6 mycroft } 95 1.6 mycroft if (fs->fs_maxcontig > 1) { 96 1.46 christos const char *doit = NULL; 97 1.6 mycroft 98 1.6 mycroft if (fs->fs_contigsumsize < 1) { 99 1.6 mycroft doit = "CREAT"; 100 1.6 mycroft } else if (fs->fs_contigsumsize < fs->fs_maxcontig && 101 1.6 mycroft fs->fs_contigsumsize < FS_MAXCONTIG) { 102 1.6 mycroft doit = "EXPAND"; 103 1.6 mycroft } 104 1.6 mycroft if (doit) { 105 1.6 mycroft i = fs->fs_contigsumsize; 106 1.6 mycroft fs->fs_contigsumsize = 107 1.6 mycroft MIN(fs->fs_maxcontig, FS_MAXCONTIG); 108 1.49 christos if (CGSIZE(fs) > (uint32_t)fs->fs_bsize) { 109 1.6 mycroft pwarn("CANNOT %s CLUSTER MAPS\n", doit); 110 1.6 mycroft fs->fs_contigsumsize = i; 111 1.6 mycroft } else if (preen || 112 1.6 mycroft reply("CREATE CLUSTER MAPS")) { 113 1.6 mycroft if (preen) 114 1.6 mycroft pwarn("%sING CLUSTER MAPS\n", 115 1.6 mycroft doit); 116 1.53 dholland ncgsize = ffs_fragroundup(fs, CGSIZE(fs)); 117 1.38 itojun ncg = realloc(cgrp, ncgsize); 118 1.38 itojun if (ncg == NULL) 119 1.48 christos errexit( 120 1.21 fvdl "cannot reallocate cg space"); 121 1.38 itojun cg = cgrp = ncg; 122 1.38 itojun fs->fs_cgsize = ncgsize; 123 1.6 mycroft doinglevel1 = 1; 124 1.6 mycroft sbdirty(); 125 1.6 mycroft } 126 1.6 mycroft } 127 1.6 mycroft } 128 1.6 mycroft } 129 1.34 fvdl basesize = &newcg->cg_space[0] - (u_char *)(&newcg->cg_firstfield); 130 1.36 fvdl cssize = (u_char *)&cstotal.cs_spare[0] - (u_char *)&cstotal.cs_ndir; 131 1.39 dbj sumsize = 0; 132 1.34 fvdl if (is_ufs2) { 133 1.34 fvdl newcg->cg_iusedoff = basesize; 134 1.34 fvdl } else { 135 1.34 fvdl /* 136 1.34 fvdl * We reserve the space for the old rotation summary 137 1.34 fvdl * tables for the benefit of old kernels, but do not 138 1.34 fvdl * maintain them in modern kernels. In time, they can 139 1.34 fvdl * go away. 140 1.34 fvdl */ 141 1.34 fvdl newcg->cg_old_btotoff = basesize; 142 1.34 fvdl newcg->cg_old_boff = newcg->cg_old_btotoff + 143 1.34 fvdl fs->fs_old_cpg * sizeof(int32_t); 144 1.34 fvdl newcg->cg_iusedoff = newcg->cg_old_boff + 145 1.34 fvdl fs->fs_old_cpg * fs->fs_old_nrpos * sizeof(u_int16_t); 146 1.34 fvdl memset(&newcg->cg_space[0], 0, newcg->cg_iusedoff - basesize); 147 1.34 fvdl } 148 1.34 fvdl inomapsize = howmany(fs->fs_ipg, CHAR_BIT); 149 1.34 fvdl newcg->cg_freeoff = newcg->cg_iusedoff + inomapsize; 150 1.34 fvdl blkmapsize = howmany(fs->fs_fpg, CHAR_BIT); 151 1.34 fvdl newcg->cg_nextfreeoff = newcg->cg_freeoff + blkmapsize; 152 1.34 fvdl if (fs->fs_contigsumsize > 0) { 153 1.34 fvdl newcg->cg_clustersumoff = newcg->cg_nextfreeoff - 154 1.34 fvdl sizeof(u_int32_t); 155 1.39 dbj if (isappleufs) { 156 1.39 dbj /* Apple PR2216969 gives rationale for this change. 157 1.39 dbj * I believe they were mistaken, but we need to 158 1.39 dbj * duplicate it for compatibility. -- dbj (at) NetBSD.org 159 1.39 dbj */ 160 1.39 dbj newcg->cg_clustersumoff += sizeof(u_int32_t); 161 1.39 dbj } 162 1.34 fvdl newcg->cg_clustersumoff = 163 1.34 fvdl roundup(newcg->cg_clustersumoff, sizeof(u_int32_t)); 164 1.34 fvdl newcg->cg_clusteroff = newcg->cg_clustersumoff + 165 1.34 fvdl (fs->fs_contigsumsize + 1) * sizeof(u_int32_t); 166 1.34 fvdl newcg->cg_nextfreeoff = newcg->cg_clusteroff + 167 1.54 dholland howmany(ffs_fragstoblks(fs, fs->fs_fpg), CHAR_BIT); 168 1.1 cgd } 169 1.34 fvdl newcg->cg_magic = CG_MAGIC; 170 1.34 fvdl mapsize = newcg->cg_nextfreeoff - newcg->cg_iusedoff; 171 1.39 dbj if (!is_ufs2 && ((fs->fs_old_flags & FS_FLAGS_UPDATED) == 0)) { 172 1.39 dbj switch ((int)fs->fs_old_postblformat) { 173 1.39 dbj 174 1.39 dbj case FS_42POSTBLFMT: 175 1.39 dbj basesize = (char *)(&ocg->cg_btot[0]) - 176 1.39 dbj (char *)(&ocg->cg_firstfield); 177 1.39 dbj sumsize = &ocg->cg_iused[0] - (u_int8_t *)(&ocg->cg_btot[0]); 178 1.39 dbj mapsize = &ocg->cg_free[howmany(fs->fs_fpg, NBBY)] - 179 1.39 dbj (u_char *)&ocg->cg_iused[0]; 180 1.39 dbj blkmapsize = howmany(fs->fs_fpg, NBBY); 181 1.39 dbj inomapsize = &ocg->cg_free[0] - (u_char *)&ocg->cg_iused[0]; 182 1.39 dbj ocg->cg_magic = CG_MAGIC; 183 1.39 dbj newcg->cg_magic = 0; 184 1.39 dbj break; 185 1.39 dbj 186 1.39 dbj case FS_DYNAMICPOSTBLFMT: 187 1.39 dbj sumsize = newcg->cg_iusedoff - newcg->cg_old_btotoff; 188 1.39 dbj break; 189 1.39 dbj 190 1.39 dbj default: 191 1.48 christos errexit("UNKNOWN ROTATIONAL TABLE FORMAT %d", 192 1.39 dbj fs->fs_old_postblformat); 193 1.39 dbj } 194 1.39 dbj } 195 1.7 mycroft memset(&idesc[0], 0, sizeof idesc); 196 1.26 thorpej for (i = 0; i < 4; i++) { 197 1.1 cgd idesc[i].id_type = ADDR; 198 1.34 fvdl if (!is_ufs2 && doinglevel2) 199 1.6 mycroft idesc[i].id_fix = FIX; 200 1.6 mycroft } 201 1.34 fvdl memset(&cstotal, 0, sizeof(struct csum_total)); 202 1.54 dholland dmax = ffs_blknum(fs, fs->fs_size + fs->fs_frag - 1); 203 1.34 fvdl for (d = fs->fs_size; d < dmax; d++) 204 1.34 fvdl setbmap(d); 205 1.1 cgd for (c = 0; c < fs->fs_ncg; c++) { 206 1.29 lukem if (got_siginfo) { 207 1.29 lukem fprintf(stderr, 208 1.29 lukem "%s: phase 5: cyl group %d of %d (%d%%)\n", 209 1.29 lukem cdevname(), c, fs->fs_ncg, 210 1.29 lukem c * 100 / fs->fs_ncg); 211 1.29 lukem got_siginfo = 0; 212 1.29 lukem } 213 1.43 christos #ifdef PROGRESS 214 1.42 christos progress_bar(cdevname(), preen ? NULL : "phase 5", 215 1.42 christos c, fs->fs_ncg); 216 1.43 christos #endif /* PROGRESS */ 217 1.1 cgd getblk(&cgblk, cgtod(fs, c), fs->fs_cgsize); 218 1.19 bouyer memcpy(cg, cgblk.b_un.b_cg, fs->fs_cgsize); 219 1.19 bouyer if((doswap && !needswap) || (!doswap && needswap)) 220 1.34 fvdl ffs_cg_swap(cgblk.b_un.b_cg, cg, sblock); 221 1.39 dbj if (!doinglevel1 && !cg_chkmagic(cg, 0)) 222 1.21 fvdl pfatal("CG %d: PASS5: BAD MAGIC NUMBER\n", c); 223 1.19 bouyer if(doswap) 224 1.19 bouyer cgdirty(); 225 1.26 thorpej /* 226 1.26 thorpej * While we have the disk head where we want it, 227 1.26 thorpej * write back the superblock to the spare at this 228 1.26 thorpej * cylinder group. 229 1.26 thorpej */ 230 1.55 chs if ((cvtlevel && sblk.b_dirty) || doswap || doing2ea || doing2noea) { 231 1.26 thorpej bwrite(fswritefd, sblk.b_un.b_buf, 232 1.52 dholland FFS_FSBTODB(sblock, cgsblock(sblock, c)), 233 1.26 thorpej sblock->fs_sbsize); 234 1.26 thorpej } else { 235 1.55 chs int alt_ufs2ea = 0; 236 1.55 chs 237 1.26 thorpej /* 238 1.26 thorpej * Read in the current alternate superblock, 239 1.26 thorpej * and compare it to the master. If it's 240 1.26 thorpej * wrong, fix it up. 241 1.26 thorpej */ 242 1.26 thorpej getblk(&asblk, cgsblock(sblock, c), sblock->fs_sbsize); 243 1.26 thorpej if (asblk.b_errs) 244 1.26 thorpej pfatal("CG %d: UNABLE TO READ ALTERNATE " 245 1.26 thorpej "SUPERBLK\n", c); 246 1.26 thorpej else { 247 1.26 thorpej memmove(altsblock, asblk.b_un.b_fs, 248 1.26 thorpej sblock->fs_sbsize); 249 1.26 thorpej if (needswap) 250 1.27 lukem ffs_sb_swap(asblk.b_un.b_fs, altsblock); 251 1.55 chs if (altsblock->fs_magic == FS_UFS2EA_MAGIC) { 252 1.55 chs altsblock->fs_magic = FS_UFS2_MAGIC; 253 1.55 chs alt_ufs2ea = 1; 254 1.55 chs } 255 1.26 thorpej } 256 1.39 dbj sb_oldfscompat_write(sblock, sblocksave); 257 1.55 chs if ((asblk.b_errs || cmpsblks(sblock, altsblock) || 258 1.55 chs is_ufs2ea != alt_ufs2ea) && 259 1.55 chs dofix(&idesc[3], 260 1.26 thorpej "ALTERNATE SUPERBLK(S) ARE INCORRECT")) { 261 1.26 thorpej bwrite(fswritefd, sblk.b_un.b_buf, 262 1.52 dholland FFS_FSBTODB(sblock, cgsblock(sblock, c)), 263 1.26 thorpej sblock->fs_sbsize); 264 1.26 thorpej } 265 1.39 dbj sb_oldfscompat_read(sblock, 0); 266 1.26 thorpej } 267 1.1 cgd dbase = cgbase(fs, c); 268 1.1 cgd dmax = dbase + fs->fs_fpg; 269 1.1 cgd if (dmax > fs->fs_size) 270 1.1 cgd dmax = fs->fs_size; 271 1.39 dbj if (is_ufs2 || (fs->fs_old_flags & FS_FLAGS_UPDATED)) 272 1.39 dbj newcg->cg_time = cg->cg_time; 273 1.34 fvdl newcg->cg_old_time = cg->cg_old_time; 274 1.1 cgd newcg->cg_cgx = c; 275 1.1 cgd newcg->cg_ndblk = dmax - dbase; 276 1.34 fvdl if (!is_ufs2) { 277 1.39 dbj if (c == fs->fs_ncg - 1) { 278 1.39 dbj /* Avoid fighting old fsck for this value. Its never used 279 1.39 dbj * outside of this check anyway. 280 1.39 dbj */ 281 1.39 dbj if ((fs->fs_old_flags & FS_FLAGS_UPDATED) == 0) 282 1.39 dbj newcg->cg_old_ncyl = fs->fs_old_ncyl % fs->fs_old_cpg; 283 1.39 dbj else 284 1.39 dbj newcg->cg_old_ncyl = howmany(newcg->cg_ndblk, 285 1.39 dbj fs->fs_fpg / fs->fs_old_cpg); 286 1.39 dbj } else 287 1.34 fvdl newcg->cg_old_ncyl = fs->fs_old_cpg; 288 1.34 fvdl newcg->cg_old_niblk = fs->fs_ipg; 289 1.34 fvdl newcg->cg_niblk = 0; 290 1.34 fvdl } 291 1.6 mycroft if (fs->fs_contigsumsize > 0) 292 1.6 mycroft newcg->cg_nclusterblks = newcg->cg_ndblk / fs->fs_frag; 293 1.1 cgd newcg->cg_cs.cs_ndir = 0; 294 1.1 cgd newcg->cg_cs.cs_nffree = 0; 295 1.1 cgd newcg->cg_cs.cs_nbfree = 0; 296 1.1 cgd newcg->cg_cs.cs_nifree = fs->fs_ipg; 297 1.56 chs if (cg->cg_rotor < newcg->cg_ndblk) 298 1.1 cgd newcg->cg_rotor = cg->cg_rotor; 299 1.1 cgd else 300 1.1 cgd newcg->cg_rotor = 0; 301 1.56 chs if (cg->cg_frotor < newcg->cg_ndblk) 302 1.1 cgd newcg->cg_frotor = cg->cg_frotor; 303 1.1 cgd else 304 1.1 cgd newcg->cg_frotor = 0; 305 1.56 chs if (cg->cg_irotor < fs->fs_ipg) 306 1.1 cgd newcg->cg_irotor = cg->cg_irotor; 307 1.1 cgd else 308 1.1 cgd newcg->cg_irotor = 0; 309 1.34 fvdl if (!is_ufs2) { 310 1.34 fvdl newcg->cg_initediblk = 0; 311 1.34 fvdl } else { 312 1.49 christos if ((unsigned)cg->cg_initediblk > (unsigned)fs->fs_ipg) 313 1.34 fvdl newcg->cg_initediblk = fs->fs_ipg; 314 1.34 fvdl else 315 1.34 fvdl newcg->cg_initediblk = cg->cg_initediblk; 316 1.34 fvdl } 317 1.7 mycroft memset(&newcg->cg_frsum[0], 0, sizeof newcg->cg_frsum); 318 1.39 dbj memset(&old_cg_blktot(newcg, 0)[0], 0, (size_t)(sumsize)); 319 1.34 fvdl memset(cg_inosused(newcg, 0), 0, (size_t)(mapsize)); 320 1.39 dbj if (!is_ufs2 && ((fs->fs_old_flags & FS_FLAGS_UPDATED) == 0) && 321 1.39 dbj fs->fs_old_postblformat == FS_42POSTBLFMT) 322 1.39 dbj ocg->cg_magic = CG_MAGIC; 323 1.57 chs inum = fs->fs_ipg * c; 324 1.57 chs for (i = 0; i < fs->fs_ipg; inum++, i++) { 325 1.57 chs info = inoinfo(inum); 326 1.34 fvdl switch (info->ino_state) { 327 1.1 cgd 328 1.1 cgd case USTATE: 329 1.1 cgd break; 330 1.1 cgd 331 1.1 cgd case DSTATE: 332 1.1 cgd case DCLEAR: 333 1.1 cgd case DFOUND: 334 1.1 cgd newcg->cg_cs.cs_ndir++; 335 1.1 cgd /* fall through */ 336 1.1 cgd 337 1.1 cgd case FSTATE: 338 1.1 cgd case FCLEAR: 339 1.1 cgd newcg->cg_cs.cs_nifree--; 340 1.19 bouyer setbit(cg_inosused(newcg, 0), i); 341 1.1 cgd break; 342 1.1 cgd 343 1.1 cgd default: 344 1.57 chs if (inum < UFS_ROOTINO) 345 1.1 cgd break; 346 1.57 chs errexit("BAD STATE %d FOR INODE I=%ju", 347 1.57 chs info->ino_state, (uintmax_t)inum); 348 1.1 cgd } 349 1.1 cgd } 350 1.1 cgd if (c == 0) 351 1.57 chs for (i = 0; i < UFS_ROOTINO; i++) { 352 1.19 bouyer setbit(cg_inosused(newcg, 0), i); 353 1.1 cgd newcg->cg_cs.cs_nifree--; 354 1.1 cgd } 355 1.1 cgd for (i = 0, d = dbase; 356 1.1 cgd d < dmax; 357 1.1 cgd d += fs->fs_frag, i += fs->fs_frag) { 358 1.1 cgd frags = 0; 359 1.1 cgd for (j = 0; j < fs->fs_frag; j++) { 360 1.1 cgd if (testbmap(d + j)) 361 1.1 cgd continue; 362 1.19 bouyer setbit(cg_blksfree(newcg, 0), i + j); 363 1.1 cgd frags++; 364 1.1 cgd } 365 1.1 cgd if (frags == fs->fs_frag) { 366 1.1 cgd newcg->cg_cs.cs_nbfree++; 367 1.39 dbj if (sumsize) { 368 1.39 dbj j = old_cbtocylno(fs, i); 369 1.39 dbj old_cg_blktot(newcg, 0)[j]++; 370 1.39 dbj old_cg_blks(fs, newcg, j, 0)[old_cbtorpos(fs, i)]++; 371 1.39 dbj } 372 1.6 mycroft if (fs->fs_contigsumsize > 0) 373 1.19 bouyer setbit(cg_clustersfree(newcg, 0), 374 1.54 dholland ffs_fragstoblks(fs, i)); 375 1.1 cgd } else if (frags > 0) { 376 1.1 cgd newcg->cg_cs.cs_nffree += frags; 377 1.19 bouyer blk = blkmap(fs, cg_blksfree(newcg, 0), i); 378 1.19 bouyer ffs_fragacct(fs, blk, newcg->cg_frsum, 1, 0); 379 1.6 mycroft } 380 1.6 mycroft } 381 1.6 mycroft if (fs->fs_contigsumsize > 0) { 382 1.19 bouyer int32_t *sump = cg_clustersum(newcg, 0); 383 1.19 bouyer u_char *mapp = cg_clustersfree(newcg, 0); 384 1.6 mycroft int map = *mapp++; 385 1.6 mycroft int bit = 1; 386 1.6 mycroft int run = 0; 387 1.6 mycroft 388 1.6 mycroft for (i = 0; i < newcg->cg_nclusterblks; i++) { 389 1.6 mycroft if ((map & bit) != 0) { 390 1.6 mycroft run++; 391 1.6 mycroft } else if (run != 0) { 392 1.6 mycroft if (run > fs->fs_contigsumsize) 393 1.6 mycroft run = fs->fs_contigsumsize; 394 1.6 mycroft sump[run]++; 395 1.6 mycroft run = 0; 396 1.6 mycroft } 397 1.6 mycroft if ((i & (NBBY - 1)) != (NBBY - 1)) { 398 1.6 mycroft bit <<= 1; 399 1.6 mycroft } else { 400 1.6 mycroft map = *mapp++; 401 1.6 mycroft bit = 1; 402 1.6 mycroft } 403 1.6 mycroft } 404 1.6 mycroft if (run != 0) { 405 1.6 mycroft if (run > fs->fs_contigsumsize) 406 1.6 mycroft run = fs->fs_contigsumsize; 407 1.6 mycroft sump[run]++; 408 1.1 cgd } 409 1.1 cgd } 410 1.1 cgd cstotal.cs_nffree += newcg->cg_cs.cs_nffree; 411 1.1 cgd cstotal.cs_nbfree += newcg->cg_cs.cs_nbfree; 412 1.1 cgd cstotal.cs_nifree += newcg->cg_cs.cs_nifree; 413 1.1 cgd cstotal.cs_ndir += newcg->cg_cs.cs_ndir; 414 1.1 cgd cs = &fs->fs_cs(fs, c); 415 1.20 ross if (memcmp(&newcg->cg_cs, cs, sizeof *cs) != 0) { 416 1.40 dbj if (debug) { 417 1.40 dbj printf("cg %d: nffree: %d/%d nbfree %d/%d" 418 1.40 dbj " nifree %d/%d ndir %d/%d\n", 419 1.40 dbj c, cs->cs_nffree,newcg->cg_cs.cs_nffree, 420 1.40 dbj cs->cs_nbfree,newcg->cg_cs.cs_nbfree, 421 1.40 dbj cs->cs_nifree,newcg->cg_cs.cs_nifree, 422 1.40 dbj cs->cs_ndir,newcg->cg_cs.cs_ndir); 423 1.40 dbj } 424 1.19 bouyer if (dofix(&idesc[0], "FREE BLK COUNT(S) WRONG IN SUPERBLK")) { 425 1.34 fvdl memmove(cs, &newcg->cg_cs, sizeof *cs); 426 1.34 fvdl sbdirty(); 427 1.19 bouyer } else 428 1.19 bouyer markclean = 0; 429 1.20 ross } 430 1.6 mycroft if (doinglevel1) { 431 1.18 lukem memmove(cg, newcg, (size_t)fs->fs_cgsize); 432 1.1 cgd cgdirty(); 433 1.1 cgd continue; 434 1.1 cgd } 435 1.39 dbj if ((memcmp(newcg, cg, basesize) != 0) || 436 1.39 dbj (memcmp(&old_cg_blktot(newcg, 0)[0], 437 1.39 dbj &old_cg_blktot(cg, 0)[0], sumsize) != 0)) { 438 1.34 fvdl if (dofix(&idesc[2], "SUMMARY INFORMATION BAD")) { 439 1.34 fvdl memmove(cg, newcg, (size_t)basesize); 440 1.39 dbj memmove(&old_cg_blktot(cg, 0)[0], 441 1.39 dbj &old_cg_blktot(newcg, 0)[0], (size_t)sumsize); 442 1.34 fvdl cgdirty(); 443 1.21 fvdl } else 444 1.21 fvdl markclean = 0; 445 1.20 ross } 446 1.21 fvdl if (usedsoftdep) { 447 1.21 fvdl for (i = 0; i < inomapsize; i++) { 448 1.21 fvdl j = cg_inosused(newcg, 0)[i]; 449 1.21 fvdl if ((cg_inosused(cg, 0)[i] & j) == j) 450 1.21 fvdl continue; 451 1.21 fvdl for (k = 0; k < NBBY; k++) { 452 1.21 fvdl if ((j & (1 << k)) == 0) 453 1.21 fvdl continue; 454 1.21 fvdl if (cg_inosused(cg, 0)[i] & (1 << k)) 455 1.21 fvdl continue; 456 1.57 chs pwarn("ALLOCATED INODE %u " 457 1.23 bouyer "MARKED FREE\n", 458 1.21 fvdl c * fs->fs_ipg + i * 8 + k); 459 1.21 fvdl } 460 1.21 fvdl } 461 1.21 fvdl for (i = 0; i < blkmapsize; i++) { 462 1.21 fvdl j = cg_blksfree(cg, 0)[i]; 463 1.21 fvdl if ((cg_blksfree(newcg, 0)[i] & j) == j) 464 1.21 fvdl continue; 465 1.21 fvdl for (k = 0; k < NBBY; k++) { 466 1.21 fvdl if ((j & (1 << k)) == 0) 467 1.21 fvdl continue; 468 1.21 fvdl if (cg_inosused(cg, 0)[i] & (1 << k)) 469 1.21 fvdl continue; 470 1.57 chs pwarn("ALLOCATED FRAG %u " 471 1.24 mycroft "MARKED FREE\n", 472 1.21 fvdl c * fs->fs_fpg + i * 8 + k); 473 1.21 fvdl } 474 1.21 fvdl } 475 1.21 fvdl } 476 1.21 fvdl if (memcmp(cg_inosused(newcg, 0), cg_inosused(cg, 0), mapsize) 477 1.21 fvdl != 0 && dofix(&idesc[1], "BLK(S) MISSING IN BIT MAPS")) { 478 1.21 fvdl memmove(cg_inosused(cg, 0), cg_inosused(newcg, 0), 479 1.21 fvdl (size_t)mapsize); 480 1.21 fvdl cgdirty(); 481 1.21 fvdl } 482 1.1 cgd } 483 1.36 fvdl if (memcmp(&cstotal, &fs->fs_cstotal, cssize) != 0) { 484 1.40 dbj if (debug) { 485 1.40 dbj printf("total: nffree: %lld/%lld nbfree %lld/%lld" 486 1.40 dbj " nifree %lld/%lld ndir %lld/%lld\n", 487 1.41 ragge (long long int)fs->fs_cstotal.cs_nffree, 488 1.41 ragge (long long int)cstotal.cs_nffree, 489 1.41 ragge (long long int)fs->fs_cstotal.cs_nbfree, 490 1.41 ragge (long long int)cstotal.cs_nbfree, 491 1.41 ragge (long long int)fs->fs_cstotal.cs_nifree, 492 1.41 ragge (long long int)cstotal.cs_nifree, 493 1.41 ragge (long long int)fs->fs_cstotal.cs_ndir, 494 1.41 ragge (long long int)cstotal.cs_ndir); 495 1.40 dbj } 496 1.26 thorpej if (dofix(&idesc[0], "FREE BLK COUNT(S) WRONG IN SUPERBLK")) { 497 1.36 fvdl memmove(&fs->fs_cstotal, &cstotal, sizeof cstotal); 498 1.26 thorpej fs->fs_ronly = 0; 499 1.26 thorpej fs->fs_fmod = 0; 500 1.26 thorpej sbdirty(); 501 1.19 bouyer } else 502 1.19 bouyer markclean = 0; 503 1.20 ross } 504 1.43 christos #ifdef PROGRESS 505 1.47 apb if (!preen) 506 1.42 christos progress_done(); 507 1.43 christos #endif /* PROGRESS */ 508 1.19 bouyer } 509 1.19 bouyer 510 1.58 riastrad void 511 1.49 christos print_bmap(u_char *map, uint32_t size) 512 1.19 bouyer { 513 1.49 christos uint32_t i, j; 514 1.19 bouyer 515 1.19 bouyer i = 0; 516 1.19 bouyer while (i < size) { 517 1.19 bouyer printf("%u: ",i); 518 1.19 bouyer for (j = 0; j < 16; j++, i++) 519 1.19 bouyer printf("%2x ", (u_int)map[i] & 0xff); 520 1.19 bouyer printf("\n"); 521 1.1 cgd } 522 1.1 cgd } 523