cluster: RHEL56 - GFS2: Dinode #33129 (0x8169) has bad height Found 1, Expected >= 2

Bob Peterson rpeterso at fedoraproject.org
Sat Apr 10 04:54:28 UTC 2010


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=7b9e48f534a1b3aa0ff2138b9038379bf3d33ab7
Commit:        7b9e48f534a1b3aa0ff2138b9038379bf3d33ab7
Parent:        efc08c2e2456e59cc5098ec89071343f2d72757c
Author:        Bob Peterson <bob at ganesha.peterson>
AuthorDate:    Fri Feb 19 07:52:37 2010 -0600
Committer:     Bob Peterson <rpeterso at redhat.com>
CommitterDate: Fri Apr 9 23:45:34 2010 -0500

GFS2: Dinode #33129 (0x8169) has bad height Found 1, Expected >= 2

Basically, commit 9b8c81d1 allowed gfs2 to have dinode
sizes (via truncate, etc.) that are bigger than the
metadata tree would suggest.  Therefore, the check for
an invalid height size needed to be removed from pass1.

rhbz#455300
---
 gfs2/fsck/initialize.c |    2 ++
 gfs2/fsck/pass1.c      |   19 -------------------
 gfs2/fsck/util.c       |   31 -------------------------------
 3 files changed, 2 insertions(+), 50 deletions(-)

diff --git a/gfs2/fsck/initialize.c b/gfs2/fsck/initialize.c
index 2687bdb..64685ed 100644
--- a/gfs2/fsck/initialize.c
+++ b/gfs2/fsck/initialize.c
@@ -228,6 +228,8 @@ static void check_rgrp_integrity(struct gfs2_sbd *sdp, struct rgrp_list *rgd,
 				continue;
 			}
 			for (y = 0; y < GFS2_NBBY; y++) {
+				if (fsck_abort) /* if asked to abort */
+					return;
 				state = (*byte >>
 					 (GFS2_BIT_SIZE * y)) & GFS2_BIT_MASK;
 				if (state == GFS2_BLKST_USED)
diff --git a/gfs2/fsck/pass1.c b/gfs2/fsck/pass1.c
index cc3ca9f..0b8ca09 100644
--- a/gfs2/fsck/pass1.c
+++ b/gfs2/fsck/pass1.c
@@ -1026,25 +1026,6 @@ static int handle_di(struct gfs2_sbd *sdp, struct gfs2_buffer_head *bh)
 		return -1;
 	}
 
-	/* FIXME: fix height and depth here - wasn't implemented in
-	 * old fsck either, so no biggy... */
-	if (ip->i_di.di_height < compute_height(sdp, ip->i_di.di_size)){
-		log_warn( _("Dinode #%" PRIu64 " (0x%" PRIx64 ") has bad height  "
-			    "Found %u, Expected >= %u\n"), ip->i_di.di_num.no_addr, 
-				 ip->i_di.di_num.no_addr, ip->i_di.di_height,
-				 compute_height(sdp, ip->i_di.di_size));
-			/* once implemented, remove continue statement */
-		log_warn( _("Marking inode invalid\n"));
-		if(gfs2_blockmap_set(bl, block, gfs2_meta_inval)) {
-			stack;
-			fsck_inode_put(&ip);
-			return -1;
-		}
-		gfs2_set_bitmap(sdp, block, GFS2_BLKST_FREE);
-		fsck_inode_put(&ip);
-		return 0;
-	}
-
 	if (S_ISDIR(ip->i_di.di_mode) &&
 	    (ip->i_di.di_flags & GFS2_DIF_EXHASH)) {
 		if (((1 << ip->i_di.di_depth) * sizeof(uint64_t)) != ip->i_di.di_size){
diff --git a/gfs2/fsck/util.c b/gfs2/fsck/util.c
index 3154979..924ef45 100644
--- a/gfs2/fsck/util.c
+++ b/gfs2/fsck/util.c
@@ -29,37 +29,6 @@
 
 const char *reftypes[3] = {"data", "metadata", "extended attribute"};
 
-/**
- * compute_height
- * @sdp:
- * @sz:
- *
- */
-int compute_height(struct gfs2_sbd *sdp, uint64_t sz)
-{
-	unsigned int height;
-	uint64_t space, old_space;
-	unsigned int bsize = sdp->sd_sb.sb_bsize;
-	
-	if (sz <= (bsize - sizeof(struct gfs2_dinode)))
-		return 0;
-	
-	height = 1;
-	space = sdp->sd_diptrs * bsize;
-	
-	while (sz > space) {
-		old_space = space;
-		
-		height++;
-		space *= sdp->sd_inptrs;
-		
-		if (space / sdp->sd_inptrs != old_space ||
-			space % sdp->sd_inptrs != 0)
-			break;
-	}
-	return height;
-}
-
 void big_file_comfort(struct gfs2_inode *ip, uint64_t blks_checked)
 {
 	static struct timeval tv;


More information about the cluster-commits mailing list