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;