All of lore.kernel.org
 help / color / mirror / Atom feed
* [Cluster-devel] edit: Fix up block type recognition
@ 2011-12-21 15:21 Steven Whitehouse
  2011-12-22 18:02 ` Bob Peterson
  0 siblings, 1 reply; 2+ messages in thread
From: Steven Whitehouse @ 2011-12-21 15:21 UTC (permalink / raw)
  To: cluster-devel.redhat.com

From 2e7894812a418bb017e5650400a86a10d354daec Mon Sep 17 00:00:00 2001
From: Steven Whitehouse <swhiteho@redhat.com>
Date: Wed, 21 Dec 2011 15:17:44 +0000
Subject: [PATCH] edit: Fix up block type recognition

The code was only using a single byte of the block type field
for some reason. This fixes it to read and correctly convert
the whole field. Also, the same is done for the mh_magic field
in get_block_type() too.

Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>

diff --git a/gfs2/edit/hexedit.c b/gfs2/edit/hexedit.c
index 052be4c..5416900 100644
--- a/gfs2/edit/hexedit.c
+++ b/gfs2/edit/hexedit.c
@@ -989,17 +989,14 @@ static void print_usage(void)
 /* returns: metatype if block is a GFS2 structure block type                */
 /*          0 if block is not a GFS2 structure                              */
 /* ------------------------------------------------------------------------ */
-static int get_block_type(struct gfs2_buffer_head *lbh)
+static uint32_t get_block_type(const struct gfs2_buffer_head *lbh)
 {
-	int ret_type = 0;
-	char *lpBuffer = lbh->b_data;
+	const struct gfs2_meta_header *mh = lbh->iov.iov_base;
 
-	if (*(lpBuffer+0)==0x01 && *(lpBuffer+1)==0x16 &&
-	    *(lpBuffer+2)==0x19 && *(lpBuffer+3)==0x70 &&
-	    *(lpBuffer+4)==0x00 && *(lpBuffer+5)==0x00 &&
-	    *(lpBuffer+6)==0x00) /* If magic number appears at the start */
-		ret_type = *(lpBuffer+7);
-	return ret_type;
+	if (be32_to_cpu(mh->mh_magic) == GFS2_MAGIC)
+		return be32_to_cpu(mh->mh_type);
+
+	return 0;
 }
 
 /* ------------------------------------------------------------------------ */
@@ -1009,6 +1006,7 @@ static int get_block_type(struct gfs2_buffer_head *lbh)
 /* ------------------------------------------------------------------------ */
 int display_block_type(int from_restore)
 {
+	const struct gfs2_meta_header *mh;
 	int ret_type = 0; /* return type */
 
 	/* first, print out the kind of GFS2 block this is */
@@ -1036,9 +1034,9 @@ int display_block_type(int from_restore)
 		ret_type = GFS2_METATYPE_RG;
 		struct_len = sbd.gfs1 ? sizeof(struct gfs_rgrp) :
 			sizeof(struct gfs2_rgrp);
-	}
-	else if ((ret_type = get_block_type(bh))) {
-		switch (*(bh->b_data + 7)) {
+	} else {
+		ret_type = get_block_type(bh);
+		switch (ret_type) {
 		case GFS2_METATYPE_SB:   /* 1 */
 			print_gfs2("(superblock)");
 			if (sbd.gfs1)
@@ -1103,13 +1101,18 @@ int display_block_type(int from_restore)
 			print_gfs2("(quota change)");
 			struct_len = sizeof(struct gfs2_quota_change);
 			break;
+		case 0:
+			struct_len = sbd.bsize;
+			break;
 		default:
 			print_gfs2("(wtf?)");
 			struct_len = sbd.bsize;
 			break;
 		}
-	} else
-		struct_len = sbd.bsize;
+	}
+	
+
+	mh = bh->iov.iov_base;
 	eol(0);
 	if (from_restore)
 		return ret_type;
@@ -1120,8 +1123,8 @@ int display_block_type(int from_restore)
 		rgd = gfs2_blk2rgrpd(&sbd, block);
 		if (rgd) {
 			gfs2_rgrp_read(&sbd, rgd);
-			if ((*(bh->b_data + 7) == GFS2_METATYPE_RG) ||
-			    (*(bh->b_data + 7) == GFS2_METATYPE_RB))
+			if ((be32_to_cpu(mh->mh_type) == GFS2_METATYPE_RG) ||
+			    (be32_to_cpu(mh->mh_type) == GFS2_METATYPE_RB))
 				type = 4;
 			else
 				type = gfs2_get_bitmap(&sbd, block, rgd);
@@ -1136,7 +1139,7 @@ int display_block_type(int from_restore)
 			   sbd.bsize / screen_chunk_size + 1 : sbd.bsize /
 			   screen_chunk_size, allocdesc[sbd.gfs1][type]);
 		/*eol(9);*/
-		if ((*(bh->b_data + 7) == GFS2_METATYPE_RG)) {
+		if ((be32_to_cpu(mh->mh_type) == GFS2_METATYPE_RG)) {
 			int ptroffset = edit_row[dmode] * 16 + edit_col[dmode];
 
 			if (ptroffset >= struct_len || pgnum) {
@@ -1154,7 +1157,7 @@ int display_block_type(int from_restore)
 						   allocdesc[sbd.gfs1][btype]);
 				}
 			}
-		} else if ((*(bh->b_data + 7) == GFS2_METATYPE_RB)) {
+		} else if ((be32_to_cpu(mh->mh_type) == GFS2_METATYPE_RB)) {
 			int ptroffset = edit_row[dmode] * 16 + edit_col[dmode];
 
 			if (ptroffset >= struct_len || pgnum) {
@@ -2927,7 +2930,7 @@ static void interactive_mode(void)
 void gfs_log_header_in(struct gfs_log_header *head,
 		       struct gfs2_buffer_head *lbh)
 {
-	struct gfs_log_header *str = (struct gfs_log_header *)lbh->b_data;
+	struct gfs_log_header *str = lbh->iov.iov_base;
 
 	gfs2_meta_header_in(&head->lh_header, lbh);
 
-- 
1.7.4.4





^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [Cluster-devel] edit: Fix up block type recognition
  2011-12-21 15:21 [Cluster-devel] edit: Fix up block type recognition Steven Whitehouse
@ 2011-12-22 18:02 ` Bob Peterson
  0 siblings, 0 replies; 2+ messages in thread
From: Bob Peterson @ 2011-12-22 18:02 UTC (permalink / raw)
  To: cluster-devel.redhat.com

----- Original Message -----
| >From 2e7894812a418bb017e5650400a86a10d354daec Mon Sep 17 00:00:00
| >2001
| From: Steven Whitehouse <swhiteho@redhat.com>
| Date: Wed, 21 Dec 2011 15:17:44 +0000
| Subject: [PATCH] edit: Fix up block type recognition
| 
| The code was only using a single byte of the block type field
| for some reason. This fixes it to read and correctly convert
| the whole field. Also, the same is done for the mh_magic field
| in get_block_type() too.
| 
| Signed-off-by: Steven Whitehouse <swhiteho@redhat.com>
| 
Hi,

ACKed by Bob Peterson <rpeterso@redhat.com>

Regards,

Bob Peterson
Red Hat File Systems



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2011-12-22 18:02 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-12-21 15:21 [Cluster-devel] edit: Fix up block type recognition Steven Whitehouse
2011-12-22 18:02 ` Bob Peterson

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.