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.
 	 */