* [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.