Mercurial > illumos > illumos-gate
changeset 6715:87cd547813a7
6660301 fsck does not fix the file system corruption related to information of rotational position.
6661844 panic from failed assertion in vm_machdep.c, line: 735
author | vsakar |
---|---|
date | Tue, 27 May 2008 00:17:01 -0700 |
parents | 20dfd2e95b2f |
children | 6af79b23c84d |
files | usr/src/cmd/fs.d/ufs/fsck/pass5.c usr/src/uts/common/fs/ufs/ufs_vnops.c |
diffstat | 2 files changed, 50 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/cmd/fs.d/ufs/fsck/pass5.c Mon May 26 20:49:33 2008 -0700 +++ b/usr/src/cmd/fs.d/ufs/fsck/pass5.c Tue May 27 00:17:01 2008 -0700 @@ -1,5 +1,5 @@ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -48,7 +48,8 @@ size_t basesize, sumsize, mapsize; int excessdirs; int inomapsize, blkmapsize; - int update_csums, bad_csum_sb, bad_csum_cg, update_bitmaps; + int update_csums, update_bitmaps; + int bad_csum_sb, bad_csum_cg, bad_cgblks_cg, bad_cgblktot_cg; struct fs *fs = &sblock; struct cg *cg = &cgrp; diskaddr_t dbase, dmax; @@ -71,7 +72,7 @@ if (fs->fs_postblformat != FS_DYNAMICPOSTBLFMT) { pfatal("UNSUPPORTED ROTATIONAL TABLE FORMAT %d\n", - fs->fs_postblformat); + fs->fs_postblformat); errexit("Program terminated."); /* NOTREACHED */ } @@ -94,7 +95,7 @@ newcg->cg_btotoff = basesize; newcg->cg_boff = newcg->cg_btotoff + fs->fs_cpg * sizeof (daddr32_t); newcg->cg_iusedoff = newcg->cg_boff + - fs->fs_cpg * fs->fs_nrpos * sizeof (uint16_t); + fs->fs_cpg * fs->fs_nrpos * sizeof (uint16_t); (void) memset(&newcg->cg_space[0], 0, newcg->cg_iusedoff - basesize); inomapsize = howmany(fs->fs_ipg, NBBY); @@ -289,7 +290,7 @@ if (preen) { update_csums = 1; (void) printf("CORRECTING BAD CG SUMMARIES" - " FOR CG %d\n", c); + " FOR CG %d\n", c); } else if (update_csums == -1) { update_csums = (reply( "CORRECT BAD CG SUMMARIES FOR CG %d", @@ -302,7 +303,7 @@ sizeof (*cs)); sbdirty(); (void) printf("CORRECTED SUPERBLOCK SUMMARIES FOR" - " CG %d\n", c); + " CG %d\n", c); } if (bad_csum_cg && (update_csums == 1)) { @@ -374,6 +375,47 @@ } } + bad_cgblks_cg = (memcmp((void *)&cg_blks(fs, cg, 0)[0], + (void *)&cg_blks(fs, newcg, 0)[0], + fs->fs_cpg * fs->fs_nrpos * sizeof (int32_t)) != 0); + + if (bad_cgblks_cg) { + if (!verbose) + (void) printf("ROTATIONAL POSITIONS " + "BLOCK COUNT WRONG "); + if (preen || update_bitmaps || reply("FIX") == 1) { + (void) memmove((void *)&cg_blks(fs, cg, 0)[0], + (void *)&cg_blks(fs, newcg, 0)[0], + fs->fs_cpg * fs->fs_nrpos * + sizeof (int32_t)); + cgdirty(); + if (preen || + (!verbose && update_bitmaps)) + (void) printf("(CORRECTED)\n"); + update_bitmaps = 1; + } + } + + bad_cgblktot_cg = (memcmp((void *)&cg_blktot(cg)[0], + (void *)&cg_blktot(newcg)[0], + fs->fs_cpg * sizeof (int32_t)) != 0); + + if (bad_cgblktot_cg) { + if (!verbose) + (void) printf("ROTATIONAL POSITIONS " + "BLOCK TOTAL WRONG "); + if (preen || update_bitmaps || reply("FIX") == 1) { + (void) memmove((void *)&cg_blktot(cg)[0], + (void *)&cg_blktot(newcg)[0], + fs->fs_cpg * sizeof (int32_t)); + cgdirty(); + if (preen || + (!verbose && update_bitmaps)) + (void) printf("(CORRECTED)\n"); + update_bitmaps = 1; + } + } + /* * Fixing one set of problems often shows up more in the * same cg. Just to make sure, go back and check it
--- a/usr/src/uts/common/fs/ufs/ufs_vnops.c Mon May 26 20:49:33 2008 -0700 +++ b/usr/src/uts/common/fs/ufs/ufs_vnops.c Tue May 27 00:17:01 2008 -0700 @@ -5577,6 +5577,7 @@ struct ulockfs *ulp; int error, sig; k_sigset_t smask; + caddr_t hint = *addrp; if (vp->v_flag & VNOMAP) { error = ENOSYS; @@ -5594,6 +5595,7 @@ } retry_map: + *addrp = hint; /* * If file is being locked, disallow mapping. */