FAQ Search Today's Posts Mark Forums Read
» Video Reviews

» Linux Archive

Linux-archive is a website aiming to archive linux email lists and to make them easily accessible for linux users/developers.


» Sponsor

» Partners

» Sponsor

Go Back   Linux Archive > Redhat > Cluster Development

 
 
LinkBack Thread Tools
 
Old 12-21-2011, 02:21 PM
Steven Whitehouse
 
Default edit: Fix up block type recognition

>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
 
Old 12-22-2011, 05:02 PM
Bob Peterson
 
Default edit: Fix up block type recognition

----- 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
 

Thread Tools




All times are GMT. The time now is 12:18 AM.

VBulletin, Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Content Relevant URLs by vBSEO ©2007, Crawlability, Inc.
Copyright 2007 - 2008, www.linux-archive.org