[Cluster-devel] [fsck.gfs2 v2 PATCH 02/40] fsck.gfs2: Convert block_type to bitmap_type after pass1 and 5

Bob Peterson rpeterso at redhat.com
Fri May 6 17:38:55 UTC 2016


This patch changes all the passes that happen after pass1 and 5
from using block_type to using bitmap_type. This is a step toward
eliminating the blockmap after pass1 and pass5 are complete.

Signed-off-by: Bob Peterson <rpeterso at redhat.com>
---
 gfs2/fsck/lost_n_found.c |  4 ++--
 gfs2/fsck/metawalk.c     | 12 ++++++------
 gfs2/fsck/pass1b.c       |  6 +++---
 gfs2/fsck/pass2.c        |  6 +++---
 gfs2/fsck/pass3.c        |  8 ++++----
 gfs2/fsck/pass4.c        |  2 +-
 gfs2/fsck/util.c         |  2 +-
 gfs2/fsck/util.h         |  8 ++++++++
 8 files changed, 28 insertions(+), 20 deletions(-)

diff --git a/gfs2/fsck/lost_n_found.c b/gfs2/fsck/lost_n_found.c
index ba3ae1d..4816b3c 100644
--- a/gfs2/fsck/lost_n_found.c
+++ b/gfs2/fsck/lost_n_found.c
@@ -131,14 +131,14 @@ void make_sure_lf_exists(struct gfs2_inode *ip)
 	   them in sync so that pass4 can detect and fix any descrepancies. */
 	set_di_nlink(sdp->md.rooti);
 
-	q = block_type(lf_dip->i_di.di_num.no_addr);
+	q = bitmap_type(sdp, lf_dip->i_di.di_num.no_addr);
 	if (q != GFS2_BLKST_DINODE) {
 		lf_was_created = 1;
 		/* This is a new lost+found directory, so set its block type
 		   and increment link counts for the directories */
 		/* FIXME: i'd feel better about this if fs_mkdir returned
 		   whether it created a new directory or just found an old one,
-		   and we used that instead of the block_type to run this */
+		   and we used that instead of the bitmap_type to run this */
 		fsck_blockmap_set(ip, lf_dip->i_di.di_num.no_addr,
 				  _("lost+found dinode"), GFS2_BLKST_DINODE);
 		dirtree_insert(lf_dip->i_di.di_num);
diff --git a/gfs2/fsck/metawalk.c b/gfs2/fsck/metawalk.c
index 8fcaea3..f401f2c 100644
--- a/gfs2/fsck/metawalk.c
+++ b/gfs2/fsck/metawalk.c
@@ -1045,7 +1045,7 @@ static int delete_block_if_notdup(struct gfs2_inode *ip, uint64_t block,
 	if (!valid_block(ip->i_sbd, block))
 		return meta_error;
 
-	q = block_type(block);
+	q = bitmap_type(ip->i_sbd, block);
 	if (q == GFS2_BLKST_FREE) {
 		log_info( _("%s block %lld (0x%llx), part of inode "
 			    "%lld (0x%llx), was already free.\n"),
@@ -1774,7 +1774,7 @@ int remove_dentry_from_dir(struct gfs2_sbd *sdp, uint64_t dir,
 	remove_dentry_fxns.private = &dentryblock;
 	remove_dentry_fxns.check_dentry = remove_dentry;
 
-	q = block_type(dir);
+	q = bitmap_type(sdp, dir);
 	if (q != GFS2_BLKST_DINODE) {
 		log_info( _("Parent block is not an inode...ignoring\n"));
 		return 1;
@@ -1825,7 +1825,7 @@ static int del_eattr_generic(struct gfs2_inode *ip, uint64_t block,
 	uint8_t q;
 
 	if (valid_block(ip->i_sbd, block)) {
-		q = block_type(block);
+		q = bitmap_type(ip->i_sbd, block);
 		if (q == GFS2_BLKST_FREE)
 			was_free = 1;
 		ret = delete_block_if_notdup(ip, block, NULL, eatype,
@@ -1925,7 +1925,7 @@ static int alloc_metalist(struct gfs2_inode *ip, uint64_t block,
 	*is_valid = 1;
 	*was_duplicate = 0;
 	*bh = bread(ip->i_sbd, block);
-	q = block_type(block);
+	q = bitmap_type(ip->i_sbd, block);
 	if (q == GFS2_BLKST_FREE) {
 		log_debug(_("%s reference to new metadata block "
 			    "%lld (0x%llx) is now marked as indirect.\n"),
@@ -1947,7 +1947,7 @@ static int alloc_data(struct gfs2_inode *ip, uint64_t metablock,
 	/* No need to range_check here--if it was added, it's in range. */
 	/* We can't check the bitmap here because this function is called
 	   after the bitmap has been set but before the blockmap has. */
-	q = block_type(block);
+	q = bitmap_type(ip->i_sbd, block);
 	if (q == GFS2_BLKST_FREE) {
 		log_debug(_("%s reference to new data block "
 			    "%lld (0x%llx) is now marked as data.\n"),
@@ -1965,7 +1965,7 @@ static int alloc_leaf(struct gfs2_inode *ip, uint64_t block, void *private)
 	/* No need to range_check here--if it was added, it's in range. */
 	/* We can't check the bitmap here because this function is called
 	   after the bitmap has been set but before the blockmap has. */
-	q = block_type(block);
+	q = bitmap_type(ip->i_sbd, block);
 	if (q == GFS2_BLKST_FREE)
 		fsck_blockmap_set(ip, block, _("newly allocated leaf"),
 				  ip->i_sbd->gfs1 ? GFS2_BLKST_DINODE :
diff --git a/gfs2/fsck/pass1b.c b/gfs2/fsck/pass1b.c
index 16c0aec..66dd0a8 100644
--- a/gfs2/fsck/pass1b.c
+++ b/gfs2/fsck/pass1b.c
@@ -216,7 +216,7 @@ static void resolve_dup_references(struct gfs2_sbd *sdp, struct duptree *dt,
 			return;
 
 		this_ref = get_ref_type(id);
-		q = block_type(id->block_no);
+		q = bitmap_type(sdp, id->block_no);
 		if (inval)
 			log_warn( _("Invalid "));
 		/* FIXME: If we already found an acceptable reference to this
@@ -525,7 +525,7 @@ static void resolve_last_reference(struct gfs2_sbd *sdp, struct duptree *dt,
 	if (dt->dup_flags & DUPFLAG_REF1_IS_DUPL)
 		clone_dup_ref_in_inode(ip, dt);
 
-	q = block_type(id->block_no);
+	q = bitmap_type(sdp, id->block_no);
 	if (q == GFS2_BLKST_UNLINKED) {
 		log_debug( _("The remaining reference inode %lld (0x%llx) is "
 			     "marked invalid: Marking the block as free.\n"),
@@ -883,7 +883,7 @@ int pass1b(struct gfs2_sbd *sdp)
 				    "duplicates.\n"), dups_found);
 			break;
 		}
-		q = block_type(i);
+		q = bitmap_type(sdp, i);
 
 		if (q == GFS2_BLKST_FREE || q == GFS2_BLKST_USED)
 			continue;
diff --git a/gfs2/fsck/pass2.c b/gfs2/fsck/pass2.c
index 11777eb..afee8dc 100644
--- a/gfs2/fsck/pass2.c
+++ b/gfs2/fsck/pass2.c
@@ -506,7 +506,7 @@ static int basic_dentry_checks(struct gfs2_inode *ip, struct gfs2_dirent *dent,
 			 tmp_name);
 	}
 
-	*q = block_type(entry->no_addr);
+	*q = bitmap_type(sdp, entry->no_addr);
 	/* Get the status of the directory inode */
 	/**
 	 * 1. Blocks marked "invalid" were invalidated due to duplicate
@@ -1720,7 +1720,7 @@ static int check_system_dir(struct gfs2_inode *sysinode, const char *dirname,
 	}
 
 	iblock = sysinode->i_di.di_num.no_addr;
-	ds.q = block_type(iblock);
+	ds.q = bitmap_type(sysinode->i_sbd, iblock);
 
 	pass2_fxns.private = (void *) &ds;
 	if (ds.q == GFS2_BLKST_UNLINKED) {
@@ -1998,7 +1998,7 @@ int pass2(struct gfs2_sbd *sdp)
 		if (is_system_dir(sdp, dirblk))
 			continue;
 
-		q = block_type(dirblk);
+		q = bitmap_type(sdp, dirblk);
 		if (q != GFS2_BLKST_DINODE)
 			continue;
 
diff --git a/gfs2/fsck/pass3.c b/gfs2/fsck/pass3.c
index 054953f..7732178 100644
--- a/gfs2/fsck/pass3.c
+++ b/gfs2/fsck/pass3.c
@@ -75,7 +75,7 @@ static struct dir_info *mark_and_return_parent(struct gfs2_sbd *sdp,
 		return NULL;
 
 	if (di->dotdot_parent.no_addr == di->treewalk_parent) {
-		q_dotdot = block_type(di->dotdot_parent.no_addr);
+		q_dotdot = bitmap_type(sdp, di->dotdot_parent.no_addr);
 		if (q_dotdot != GFS2_BLKST_DINODE) {
 			log_err( _("Orphaned directory at block %llu (0x%llx) "
 				   "moved to lost+found\n"),
@@ -95,9 +95,9 @@ static struct dir_info *mark_and_return_parent(struct gfs2_sbd *sdp,
 		    (unsigned long long)di->dotdot_parent.no_addr,
 		    (unsigned long long)di->treewalk_parent,
 		    (unsigned long long)di->treewalk_parent);
-	q_dotdot = block_type(di->dotdot_parent.no_addr);
+	q_dotdot = bitmap_type(sdp, di->dotdot_parent.no_addr);
 	dt_dotdot = dirtree_find(di->dotdot_parent.no_addr);
-	q_treewalk = block_type(di->treewalk_parent);
+	q_treewalk = bitmap_type(sdp, di->treewalk_parent);
 	dt_treewalk = dirtree_find(di->treewalk_parent);
 	/* if the dotdot entry isn't a directory, but the
 	 * treewalk is, treewalk is correct - if the treewalk
@@ -249,7 +249,7 @@ int pass3(struct gfs2_sbd *sdp)
 				di = tdi;
 				continue;
 			}
-			q = block_type(di->dinode.no_addr);
+			q = bitmap_type(sdp, di->dinode.no_addr);
 			if (q == GFS2_BLKST_UNLINKED) {
 				log_err( _("Found unlinked directory "
 					   "containing bad block at block %llu"
diff --git a/gfs2/fsck/pass4.c b/gfs2/fsck/pass4.c
index 850a2fe..c3fb30a 100644
--- a/gfs2/fsck/pass4.c
+++ b/gfs2/fsck/pass4.c
@@ -70,7 +70,7 @@ static int scan_inode_list(struct gfs2_sbd *sdp) {
 			log_err( _("Found unlinked inode at %llu (0x%llx)\n"),
 				(unsigned long long)ii->di_num.no_addr,
 				(unsigned long long)ii->di_num.no_addr);
-			q = block_type(ii->di_num.no_addr);
+			q = bitmap_type(sdp, ii->di_num.no_addr);
 			if (q == GFS2_BLKST_UNLINKED) {
 				log_err( _("Unlinked inode %llu (0x%llx) contains "
 					"bad blocks\n"),
diff --git a/gfs2/fsck/util.c b/gfs2/fsck/util.c
index 84402fc..44a41ba 100644
--- a/gfs2/fsck/util.c
+++ b/gfs2/fsck/util.c
@@ -372,7 +372,7 @@ int add_duplicate_ref(struct gfs2_inode *ip, uint64_t block,
 			return meta_error;
 		}
 		id->block_no = ip->i_di.di_num.no_addr;
-		q = block_type(ip->i_di.di_num.no_addr);
+		q = bitmap_type(ip->i_sbd, ip->i_di.di_num.no_addr);
 		/* If it's an invalid dinode, put it first on the invalid
 		   inode reference list otherwise put it on the normal list. */
 		if (!inode_valid || q == GFS2_BLKST_UNLINKED)
diff --git a/gfs2/fsck/util.h b/gfs2/fsck/util.h
index 62f8ca6..7d842e2 100644
--- a/gfs2/fsck/util.h
+++ b/gfs2/fsck/util.h
@@ -59,6 +59,14 @@ static inline uint8_t block_type(uint64_t bblock)
 	return btype;
 }
 
+static inline uint8_t bitmap_type(struct gfs2_sbd *sdp, uint64_t bblock)
+{
+	struct rgrp_tree *rgd;
+
+	rgd = gfs2_blk2rgrpd(sdp, bblock);
+	return lgfs2_get_bitmap(sdp, bblock, rgd);
+}
+
 static const inline char *block_type_string(uint8_t q)
 {
 	const char *blktyp[] = {"free", "data", "other", "inode", "invalid"};
-- 
2.5.5




More information about the Cluster-devel mailing list