Sophie

Sophie

distrib > Scientific%20Linux > 5x > x86_64 > by-pkgid > 9383e745e23602bc45f9c92184feea59 > files > 65

gfs2-utils-0.1.62-28.el5.src.rpm

commit 7b9e48f534a1b3aa0ff2138b9038379bf3d33ab7
Author: Bob Peterson <bob@ganesha.peterson>
Date:   Fri Feb 19 07:52:37 2010 -0600

    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

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;