cluster: RHEL56 - fsck.gfs2: use gfs2_meta_inval vs. gfs2_inval_inode

Bob Peterson rpeterso at fedoraproject.org
Sat Apr 10 04:53:40 UTC 2010


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=d770495f365c8ded3ecc3e83a67fdc02b7dceb4d
Commit:        d770495f365c8ded3ecc3e83a67fdc02b7dceb4d
Parent:        ae16ca4e3c1a4dfdecafb124947fd43c836de8c5
Author:        Bob Peterson <bob at ganesha.peterson>
AuthorDate:    Mon Jan 25 10:21:16 2010 -0600
Committer:     Bob Peterson <rpeterso at redhat.com>
CommitterDate: Fri Apr 9 23:37:26 2010 -0500

fsck.gfs2: use gfs2_meta_inval vs. gfs2_inval_inode

This patch removes the vestigial gfs2_journal_blk and reuses it
for a new gfs2_inode_invalid.  This allows the code to keep better
track of invalid inodes rather than other invalid metadata.  For
invalid inodes, there may be cases where we want to invalidate its
metadata list.  We can't do that for other kinds of metadata like
invalid eattrs.

rhbz#455300
---
 gfs2/fsck/pass1.c      |    2 +-
 gfs2/fsck/pass1b.c     |   33 ++++++++++++++++-----------------
 gfs2/fsck/pass2.c      |   12 ++++++------
 gfs2/fsck/pass5.c      |    2 +-
 gfs2/libgfs2/libgfs2.h |    2 +-
 5 files changed, 25 insertions(+), 26 deletions(-)

diff --git a/gfs2/fsck/pass1.c b/gfs2/fsck/pass1.c
index 61aecb2..bfa247d 100644
--- a/gfs2/fsck/pass1.c
+++ b/gfs2/fsck/pass1.c
@@ -781,7 +781,7 @@ static int handle_di(struct gfs2_sbd *sdp, struct gfs2_buffer_head *bh,
 		break;
 	default:
 		if (fsck_blockmap_set(ip, block, _("invalid mode"),
-				      gfs2_meta_inval)) {
+				      gfs2_inode_invalid)) {
 			stack;
 			fsck_inode_put(&ip);
 			return -1;
diff --git a/gfs2/fsck/pass1b.c b/gfs2/fsck/pass1b.c
index 0d030f0..a78a7a5 100644
--- a/gfs2/fsck/pass1b.c
+++ b/gfs2/fsck/pass1b.c
@@ -181,7 +181,8 @@ static int clear_dup_metalist(struct gfs2_inode *ip, uint64_t block,
 		/* Setting the block to invalid means the inode is
 		 * cleared in pass2 */
 		fsck_blockmap_set(ip, ip->i_di.di_num.no_addr,
-				  _("inode with duplicate"), gfs2_meta_inval);
+				  _("inode with duplicate"),
+				  gfs2_inode_invalid);
 	}
 	return 0;
 }
@@ -435,7 +436,7 @@ static int handle_dup_blk(struct gfs2_sbd *sbp, struct duptree *b)
 				   is cleared in pass2 */
 				fsck_blockmap_set(ip, ip->i_di.di_num.no_addr,
 						 _("inode with bad duplicate"),
-						 gfs2_meta_inval);
+						 gfs2_inode_invalid);
 				fsck_inode_put(&ip);
 			} else {
 				log_warn( _("The bad inode was not cleared."));
@@ -480,7 +481,7 @@ static int handle_dup_blk(struct gfs2_sbd *sbp, struct duptree *b)
 			check_metatree(ip, &clear_dup_fxns);
 
 		fsck_blockmap_set(ip, ip->i_di.di_num.no_addr,
-				  _("inode with duplicate"), gfs2_meta_inval);
+				  _("bad"), gfs2_inode_invalid);
 		fsck_inode_put(&ip); /* out, brelse, free */
 		dh.ref_inode_count--;
 		if(dh.ref_inode_count == 1)
@@ -527,20 +528,18 @@ int pass1b(struct gfs2_sbd *sbp)
 		log_debug( _("Scanning block %" PRIu64 " (0x%" PRIx64 ") for inodes\n"),
 				  i, i);
 		q = block_type(i);
-		if((q == gfs2_inode_dir) ||
-		   (q == gfs2_inode_file) ||
-		   (q == gfs2_inode_lnk) ||
-		   (q == gfs2_inode_blk) ||
-		   (q == gfs2_inode_chr) ||
-		   (q == gfs2_inode_fifo) ||
-		   (q == gfs2_inode_sock)) {
-			for (n = osi_first(&dup_blocks); n; n = osi_next(n)) {
-				b = (struct duptree *)n;
-				if(find_block_ref(sbp, i, b)) {
-					stack;
-					rc = FSCK_ERROR;
-					goto out;
-				}
+
+		if (q < gfs2_inode_dir)
+			continue;
+		if (q > gfs2_inode_sock)
+			continue;
+
+		for (n = osi_first(&dup_blocks); n; n = osi_next(n)) {
+			b = (struct duptree *)n;
+			if(find_block_ref(sbp, i, b)) {
+				stack;
+				rc = FSCK_ERROR;
+				goto out;
 			}
 		}
 		if(q == gfs2_inode_dir) {
diff --git a/gfs2/fsck/pass2.c b/gfs2/fsck/pass2.c
index 6201baa..480715d 100644
--- a/gfs2/fsck/pass2.c
+++ b/gfs2/fsck/pass2.c
@@ -235,7 +235,7 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
 		}
 		fsck_blockmap_set(ip, ip->i_di.di_num.no_addr,
 				  _("corrupt directory entry"),
-				  gfs2_meta_inval);
+				  gfs2_inode_invalid);
 		log_err( _("Bad directory entry deleted.\n"));
 		return 1;
 	}
@@ -264,7 +264,7 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
 
 	q = block_type(entryblock);
 	/* Get the status of the directory inode */
-	if(q == gfs2_bad_block) {
+	if(q == gfs2_inode_invalid || q == gfs2_bad_block) {
 		/* This entry's inode has bad blocks in it */
 
 		/* Handle bad blocks */
@@ -295,7 +295,7 @@ static int check_dentry(struct gfs2_inode *ip, struct gfs2_dirent *dent,
 			 (unsigned long long)entryblock,
 			 (unsigned long long)ip->i_di.di_num.no_addr,
 			 (unsigned long long)ip->i_di.di_num.no_addr,
-			 q, q == gfs2_meta_inval ?
+			 q, q == gfs2_inode_invalid ?
 			 _("previously marked invalid") :
 			 _("is not an inode"));
 
@@ -562,7 +562,7 @@ int check_system_dir(struct gfs2_inode *sysinode, const char *dirname,
 	}
 	if (error > 0)
 		fsck_blockmap_set(sysinode, iblock, dirname,
-				  gfs2_meta_inval);
+				  gfs2_inode_invalid);
 
 	if(check_inode_eattr(sysinode, &pass2_fxns)) {
 		stack;
@@ -751,8 +751,8 @@ int pass2(struct gfs2_sbd *sbp)
 				   (unsigned long long)dirblk);
 			/* Can't use fsck_blockmap_set here because we don't
 			   have an inode in memory. */
-			gfs2_blockmap_set(bl, dirblk, gfs2_meta_inval);
-			check_n_fix_bitmap(sbp, dirblk, gfs2_meta_inval);
+			gfs2_blockmap_set(bl, dirblk, gfs2_inode_invalid);
+			check_n_fix_bitmap(sbp, dirblk, gfs2_inode_invalid);
 		}
 		ip = fsck_load_inode(sbp, dirblk);
 		if(!ds.dotdir) {
diff --git a/gfs2/fsck/pass5.c b/gfs2/fsck/pass5.c
index 98eefdb..43cd28d 100644
--- a/gfs2/fsck/pass5.c
+++ b/gfs2/fsck/pass5.c
@@ -28,6 +28,7 @@ static int convert_mark(uint8_t q, uint32_t *count)
 	switch(q) {
 
 	case gfs2_meta_inval:
+	case gfs2_inode_invalid:
 		/* Convert invalid metadata to free blocks */
 	case gfs2_block_free:
 		count[0]++;
@@ -49,7 +50,6 @@ static int convert_mark(uint8_t q, uint32_t *count)
 
 	case gfs2_indir_blk:
 	case gfs2_leaf_blk:
-	case gfs2_journal_blk:
 	case gfs2_meta_other:
 	case gfs2_meta_eattr:
 		count[2]++;
diff --git a/gfs2/libgfs2/libgfs2.h b/gfs2/libgfs2/libgfs2.h
index 6324449..5514067 100644
--- a/gfs2/libgfs2/libgfs2.h
+++ b/gfs2/libgfs2/libgfs2.h
@@ -277,7 +277,7 @@ enum gfs2_mark_block {
 	gfs2_inode_fifo    = (0x8),
 	gfs2_inode_sock    = (0x9),
 
-	gfs2_journal_blk   = (0xa),
+	gfs2_inode_invalid = (0xa),
 	gfs2_meta_inval    = (0xb),
 	gfs2_leaf_blk      = (0xc),
 	gfs2_meta_other    = (0xd),


More information about the cluster-commits mailing list