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

Bob Peterson rpeterso at fedoraproject.org
Tue Jan 26 21:20:54 UTC 2010


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=7bd37e30f2dd4a54283ac57f0df003840fe010d7
Commit:        7bd37e30f2dd4a54283ac57f0df003840fe010d7
Parent:        de4850b3764331085a4657c57fd518b3586d5b6c
Author:        Bob Peterson <bob at ganesha.peterson>
AuthorDate:    Mon Jan 25 10:21:16 2010 -0600
Committer:     Bob Peterson <rpeterso at redhat.com>
CommitterDate: Tue Jan 26 14:39:31 2010 -0600

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 4382ad9..b7ee6d5 100644
--- a/gfs2/fsck/pass1.c
+++ b/gfs2/fsck/pass1.c
@@ -766,7 +766,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 16b5ee5..1180d98 100644
--- a/gfs2/fsck/pass1b.c
+++ b/gfs2/fsck/pass1b.c
@@ -166,7 +166,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;
 }
@@ -420,7 +421,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."));
@@ -465,7 +466,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)
@@ -512,20 +513,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 a0c5f88..ee29893 100644
--- a/gfs2/fsck/pass2.c
+++ b/gfs2/fsck/pass2.c
@@ -222,7 +222,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;
 	}
@@ -251,7 +251,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 */
@@ -282,7 +282,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"));
 
@@ -549,7 +549,7 @@ static 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;
@@ -738,8 +738,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 ff6c181..07b0559 100644
--- a/gfs2/fsck/pass5.c
+++ b/gfs2/fsck/pass5.c
@@ -15,6 +15,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]++;
@@ -36,7 +37,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 7091a37..6d1a89f 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