[Cluster-devel] [gfs2-utils PATCH 23/47] fsck.gfs2: separate function to calculate metadata block header size

Bob Peterson rpeterso at redhat.com
Tue May 14 16:21:46 UTC 2013


This patch creates a new function hdr_size that calculates the size
of a GFS2 metadata header depending on the height and type of block.

rhbz#902920
---
 gfs2/fsck/metawalk.c | 44 +++++++++++++++++++++++---------------------
 1 file changed, 23 insertions(+), 21 deletions(-)

diff --git a/gfs2/fsck/metawalk.c b/gfs2/fsck/metawalk.c
index e985dbc..d1b12f1 100644
--- a/gfs2/fsck/metawalk.c
+++ b/gfs2/fsck/metawalk.c
@@ -1331,6 +1331,23 @@ static int check_data(struct gfs2_inode *ip, struct metawalk_fxns *pass,
 	return error;
 }
 
+static int hdr_size(struct gfs2_buffer_head *bh, int height)
+{
+	if (height > 1) {
+		if (gfs2_check_meta(bh, GFS2_METATYPE_IN))
+			return 0;
+		if (bh->sdp->gfs1)
+			return sizeof(struct gfs_indirect);
+		else
+			return sizeof(struct gfs2_meta_header);
+	}
+	/* if this isn't really a dinode, skip it */
+	if (gfs2_check_meta(bh, GFS2_METATYPE_DI))
+		return 0;
+
+	return sizeof(struct gfs2_dinode);
+}
+
 /**
  * check_metatree
  * @ip: inode structure in memory
@@ -1401,28 +1418,13 @@ int check_metatree(struct gfs2_inode *ip, struct metawalk_fxns *pass)
 		bh = osi_list_entry(list->next, struct gfs2_buffer_head,
 				    b_altlist);
 
-		if (height > 1) {
-			if (gfs2_check_meta(bh, GFS2_METATYPE_IN)) {
-				if (bh == ip->i_bh)
-					osi_list_del(&bh->b_altlist);
-				else
-					brelse(bh);
-				continue;
-			}
-			if (ip->i_sbd->gfs1)
-				head_size = sizeof(struct gfs_indirect);
+		head_size = hdr_size(bh, height);
+		if (!head_size) {
+			if (bh == ip->i_bh)
+				osi_list_del(&bh->b_altlist);
 			else
-				head_size = sizeof(struct gfs2_meta_header);
-		} else {
-			/* if this isn't really a dinode, skip it */
-			if (gfs2_check_meta(bh, GFS2_METATYPE_DI)) {
-				if (bh == ip->i_bh)
-					osi_list_del(&bh->b_altlist);
-				else
-					brelse(bh);
-				continue;
-			}
-			head_size = sizeof(struct gfs2_dinode);
+				brelse(bh);
+			continue;
 		}
 
 		if (pass->check_data)
-- 
1.7.11.7




More information about the Cluster-devel mailing list