[Cluster-devel] edit: Hook up gfs2_edit to use new metadata info from libgfs2

Steven Whitehouse swhiteho at redhat.com
Thu Dec 22 16:57:08 UTC 2011


>From 6115d0f689fe6b06e2469623fed1476684dd140c Mon Sep 17 00:00:00 2001
From: Steven Whitehouse <swhiteho at redhat.com>
Date: Thu, 22 Dec 2011 16:41:13 +0000
Subject: [PATCH] edit: Hook up gfs2_edit to use new metadata info from
 libgfs2

This is really intended as a demo. It is left as an exercise for
the reader to make this work for gfs1 metadata too. However that
should be a fairly trivial thing to do.

Signed-off-by: Steven Whitehouse <swhiteho at redhat.com>
---
 gfs2/edit/hexedit.c |  497 +++-----------------------------------------------
 1 files changed, 30 insertions(+), 467 deletions(-)

diff --git a/gfs2/edit/hexedit.c b/gfs2/edit/hexedit.c
index 5416900..73fb39f 100644
--- a/gfs2/edit/hexedit.c
+++ b/gfs2/edit/hexedit.c
@@ -85,435 +85,6 @@ int display(int identify_only);
 		}						\
 	} while(0)
 
-/* -------------------------------------------------------------------------
- * superblock
- * ------------------------------------------------------------------------- */
-const int fieldsize_sb[] = {
-	sizeof(sb.sb_header.mh_magic),
-	sizeof(sb.sb_header.mh_type),
-	sizeof(sb.sb_header.__pad0),
-	sizeof(sb.sb_header.mh_format),
-	sizeof(sb.sb_header.__pad1),
-	sizeof(sb.sb_fs_format),
-	sizeof(sb.sb_multihost_format),
-	sizeof(sb.__pad0),
-	sizeof(sb.sb_bsize),
-	sizeof(sb.sb_bsize_shift),
-	sizeof(sb.__pad1),
-	sizeof(sb.sb_master_dir.no_formal_ino),
-	sizeof(sb.sb_master_dir.no_addr),
-	sizeof(sb.__pad2.no_formal_ino),
-	sizeof(sb.__pad2.no_addr),
-	sizeof(sb.sb_root_dir.no_formal_ino),
-	sizeof(sb.sb_root_dir.no_addr),
-	sizeof(sb.sb_lockproto),
-	sizeof(sb.sb_locktable),
-	sizeof(sb.__pad3.no_formal_ino),
-	sizeof(sb.__pad3.no_addr),
-	sizeof(sb.__pad4.no_formal_ino),
-	sizeof(sb.__pad4.no_addr),
-	sizeof(sb.sb_uuid),
-	-1
-};
-
-const char *fieldnames_sb[] = {
-	"mh_magic",
-	"mh_type",
-	"mh.__pad0",
-	"mh_format",
-	"mh.__pad1",
-	"sb_fs_format",
-	"sb_multihost_format",
-	"__pad0",
-	"sb_bsize",
-	"sb_bsize_shift",
-	"__pad1",
-	"master.no_formal_ino",
-	"master.no_addr",
-	"__pad2.no_formal_ino",
-	"__pad2.no_addr",
-	"root.no_formal_ino",
-	"root.no_addr",
-	"sb_lockproto",
-	"sb_locktable",
-	"__pad3.no_formal_ino",
-	"__pad3.no_addr",
-	"__pad4.no_formal_ino",
-	"__pad4.no_addr",
-	"sb_uuid",
-};
-
-/* This determines which field the cursor is located in */
-static int which_field_sb(int off)
-{
-	int i, tot;
-
-	tot = 0;
-	for (i = 0; fieldsize_sb[i] != -1; i++) {
-		tot += fieldsize_sb[i];
-		if (off < tot)
-			return i;
-	}
-	return -1;
-}
-
-static const char *which_fieldname_sb(int off)
-{
-	int w = which_field_sb(off);
-	if (w < 0)
-		return NULL;
-	return fieldnames_sb[w];
-}
-
-/* -------------------------------------------------------------------------
- * rgrp
- * ------------------------------------------------------------------------- */
-const int fieldsize_rgrp[] = {
-	sizeof(lrgrp->rg_header.mh_magic),
-	sizeof(lrgrp->rg_header.mh_type),
-	sizeof(lrgrp->rg_header.__pad0),
-	sizeof(lrgrp->rg_header.mh_format),
-	sizeof(lrgrp->rg_header.__pad1),
-	sizeof(lrgrp->rg_flags),
-	sizeof(lrgrp->rg_free),
-	sizeof(lrgrp->rg_dinodes),
-	sizeof(lrgrp->__pad),
-	sizeof(lrgrp->rg_igeneration),
-	sizeof(lrgrp->rg_reserved),
-	-1
-};
-
-const char *fieldnames_rgrp[] = {
-	"mh_magic",
-	"mh_type",
-	"mh.__pad0",
-	"mh_format",
-	"mh.__pad1",
-	"rg_flags",
-	"rg_free",
-	"rg_dinodes",
-	"__pad",
-	"rg_igeneration",
-	"rg_reserved",
-};
-
-static int which_field_rgrp(int off)
-{
-	int i, tot;
-
-	tot = 0;
-	for (i = 0; fieldsize_rgrp[i] != -1; i++) {
-		tot += fieldsize_rgrp[i];
-		if (off < tot)
-			return i;
-	}
-	return -1;
-}
-
-static const char *which_fieldname_rgrp(int off)
-{
-	int w = which_field_rgrp(off);
-	if (w < 0)
-		return NULL;
-	return fieldnames_rgrp[w];
-}
-
-/* -------------------------------------------------------------------------
- * metaheader
- * ------------------------------------------------------------------------- */
-const int fieldsize_mh[] = {
-	sizeof(lmh->mh_magic),
-	sizeof(lmh->mh_type),
-	sizeof(lmh->__pad0),
-	sizeof(lmh->mh_format),
-	sizeof(lmh->__pad1),
-	-1
-};
-
-const char *fieldnames_mh[] = {
-	"mh_magic",
-	"mh_type",
-	"mh.__pad0",
-	"mh_format",
-	"mh.__pad1",
-};
-
-static int which_field_mh(int off)
-{
-	int i, tot;
-
-	tot = 0;
-	for (i = 0; fieldsize_mh[i] != -1; i++) {
-		tot += fieldsize_mh[i];
-		if (off < tot)
-			return i;
-	}
-	return -1;
-}
-
-static const char *which_fieldname_mh(int off)
-{
-	int w = which_field_mh(off);
-	if (w < 0)
-		return NULL;
-	return fieldnames_mh[w];
-}
-
-/* -------------------------------------------------------------------------
- * dinode
- * ------------------------------------------------------------------------- */
-const int fieldsize_di[] = {
-	sizeof(ldi->di_header.mh_magic),
-	sizeof(ldi->di_header.mh_type),
-	sizeof(ldi->di_header.__pad0),
-	sizeof(ldi->di_header.mh_format),
-	sizeof(ldi->di_header.__pad1),
-	sizeof(ldi->di_num.no_formal_ino),
-	sizeof(ldi->di_num.no_addr),
-	sizeof(ldi->di_mode),
-	sizeof(ldi->di_uid),
-	sizeof(ldi->di_gid),
-	sizeof(ldi->di_nlink),
-	sizeof(ldi->di_size),
-	sizeof(ldi->di_blocks),
-	sizeof(ldi->di_atime),
-	sizeof(ldi->di_mtime),
-	sizeof(ldi->di_ctime),
-	sizeof(ldi->di_major),
-	sizeof(ldi->di_minor),
-	sizeof(ldi->di_goal_meta),
-	sizeof(ldi->di_goal_data),
-	sizeof(ldi->di_generation),
-	sizeof(ldi->di_flags),
-	sizeof(ldi->di_payload_format),
-	sizeof(ldi->__pad1),
-	sizeof(ldi->di_height),
-	sizeof(ldi->__pad2),
-	sizeof(ldi->__pad3),
-	sizeof(ldi->di_depth),
-	sizeof(ldi->di_entries),
-	sizeof(ldi->__pad4.no_formal_ino),
-	sizeof(ldi->__pad4.no_addr),
-	sizeof(ldi->di_eattr),
-	sizeof(ldi->di_atime_nsec),
-	sizeof(ldi->di_mtime_nsec),
-	sizeof(ldi->di_ctime_nsec),
-	sizeof(ldi->di_reserved),
-	-1
-};
-
-const char *fieldnames_di[] = {
-	"mh_magic",
-	"mh_type",
-	"mh.__pad0",
-	"mh_format",
-	"mh.__pad1",
-	"no_formal_ino",
-	"no_addr",
-	"di_mode",
-	"di_uid",
-	"di_gid",
-	"di_nlink",
-	"di_size",
-	"di_blocks",
-	"di_atime",
-	"di_mtime",
-	"di_ctime",
-	"di_major",
-	"di_minor",
-	"di_goal_meta",
-	"di_goal_data",
-	"di_generation",
-	"di_flags",
-	"di_payload_format",
-	"__pad1",
-	"di_height",
-	"__pad2",
-	"__pad3",
-	"di_depth",
-	"di_entries",
-	"__pad4.no_formal_ino",
-	"__pad4.no_addr",
-	"di_eattr",
-	"di_atime_nsec",
-	"di_mtime_nsec",
-	"di_ctime_nsec",
-	"di_reserved",
-};
-
-static int which_field_di(int off)
-{
-	int i, tot;
-
-	tot = 0;
-	for (i = 0; fieldsize_di[i] != -1; i++) {
-		tot += fieldsize_di[i];
-		if (off < tot)
-			return i;
-	}
-	return -1;
-}
-
-static const char *which_fieldname_di(int off)
-{
-	int w = which_field_di(off);
-	if (w < 0)
-		return NULL;
-	return fieldnames_di[w];
-}
-
-/* -------------------------------------------------------------------------
- * directory leaf
- * ------------------------------------------------------------------------- */
-const int fieldsize_lf[] = {
-	sizeof(lleaf->lf_header.mh_magic),
-	sizeof(lleaf->lf_header.mh_type),
-	sizeof(lleaf->lf_header.__pad0),
-	sizeof(lleaf->lf_header.mh_format),
-	sizeof(lleaf->lf_header.__pad1),
-	sizeof(lleaf->lf_depth),
-	sizeof(lleaf->lf_entries),
-	sizeof(lleaf->lf_dirent_format),
-	sizeof(lleaf->lf_next),
-	sizeof(lleaf->lf_reserved),
-	-1
-};
-
-const char *fieldnames_lf[] = {
-	"mh_magic",
-	"mh_type",
-	"mh.__pad0",
-	"mh_format",
-	"mh.__pad1",
-	"lf_depth",
-	"lf_entries",
-	"lf_dirent_format",
-	"lf_next",
-	"lf_reserved",
-};
-
-static int which_field_lf(int off)
-{
-	int i, tot;
-
-	tot = 0;
-	for (i = 0; fieldsize_lf[i] != -1; i++) {
-		tot += fieldsize_lf[i];
-		if (off < tot)
-			return i;
-	}
-	return -1;
-}
-
-static const char *which_fieldname_lf(int off)
-{
-	int w = which_field_lf(off);
-	if (w < 0)
-		return NULL;
-	return fieldnames_lf[w];
-}
-
-/* -------------------------------------------------------------------------
- * log header
- * ------------------------------------------------------------------------- */
-const int fieldsize_lh[] = {
-	sizeof(llh->lh_header.mh_magic),
-	sizeof(llh->lh_header.mh_type),
-	sizeof(llh->lh_header.__pad0),
-	sizeof(llh->lh_header.mh_format),
-	sizeof(llh->lh_header.__pad1),
-	sizeof(llh->lh_sequence),
-	sizeof(llh->lh_flags),
-	sizeof(llh->lh_tail),
-	sizeof(llh->lh_blkno),
-	sizeof(llh->lh_hash),
-	-1
-};
-
-const char *fieldnames_lh[] = {
-	"mh_magic",
-	"mh_type",
-	"mh.__pad0",
-	"mh_format",
-	"mh.__pad1",
-	"lh_sequence",
-	"lh_flags",
-	"lh_tail",
-	"lh_blkno",
-	"lh_hash",
-};
-
-static int which_field_lh(int off)
-{
-	int i, tot;
-
-	tot = 0;
-	for (i = 0; fieldsize_lh[i] != -1; i++) {
-		tot += fieldsize_lh[i];
-		if (off < tot)
-			return i;
-	}
-	return -1;
-}
-
-static const char *which_fieldname_lh(int off)
-{
-	int w = which_field_lh(off);
-	if (w < 0)
-		return NULL;
-	return fieldnames_lh[w];
-}
-
-/* -------------------------------------------------------------------------
- * log descriptor
- * ------------------------------------------------------------------------- */
-const int fieldsize_ld[] = {
-	sizeof(lld->ld_header.mh_magic),
-	sizeof(lld->ld_header.mh_type),
-	sizeof(lld->ld_header.__pad0),
-	sizeof(lld->ld_header.mh_format),
-	sizeof(lld->ld_header.__pad1),
-	sizeof(lld->ld_type),
-	sizeof(lld->ld_length),
-	sizeof(lld->ld_data1),
-	sizeof(lld->ld_data2),
-	sizeof(lld->ld_reserved),
-	-1
-};
-
-const char *fieldnames_ld[] = {
-	"mh_magic",
-	"mh_type",
-	"mh.__pad0",
-	"mh_format",
-	"mh.__pad1",
-	"ld_type",
-	"ld_length",
-	"ld_data1",
-	"ld_data2",
-	"ld_reserved",
-};
-
-static int which_field_ld(int off)
-{
-	int i, tot;
-
-	tot = 0;
-	for (i = 0; fieldsize_ld[i] != -1; i++) {
-		tot += fieldsize_ld[i];
-		if (off < tot)
-			return i;
-	}
-	return -1;
-}
-
-static const char *which_fieldname_ld(int off)
-{
-	int w = which_field_ld(off);
-	if (w < 0)
-		return NULL;
-	return fieldnames_ld[w];
-}
 
 /* -------------------------------------------------------------------------
  * field-related functions:
@@ -1235,6 +806,20 @@ int display_block_type(int from_restore)
 	return ret_type;
 }
 
+static const struct lgfs2_metadata *find_mtype(uint32_t mtype)
+{
+	const struct lgfs2_metadata *m = lgfs2_metadata;
+	unsigned n = 0;
+
+	do {
+		if (m->gfs2 && m->mh_type == mtype)
+			return m;
+		n++;
+	} while (n < lgfs2_metadata_size);
+
+	return NULL;
+}
+
 /* ------------------------------------------------------------------------ */
 /* hexdump - hex dump the filesystem block to the screen                    */
 /* ------------------------------------------------------------------------ */
@@ -1342,45 +927,20 @@ static int hexdump(uint64_t startaddr, int len)
 		}
 		print_gfs2("] ");
 		if (print_field >= 0) {
-			switch (get_block_type(bh)) {
-			case GFS2_METATYPE_SB:   /* 1 */
-				print_gfs2(which_fieldname_sb(print_field));
-				break;
-			case GFS2_METATYPE_RG:   /* 2 */
-				print_gfs2(which_fieldname_rgrp(print_field));
-				break;
-			case GFS2_METATYPE_RB:   /* 3 */
-				print_gfs2(which_fieldname_mh(print_field));
-				break;
-			case GFS2_METATYPE_DI:   /* 4 */
-				print_gfs2(which_fieldname_di(print_field));
-				break;
-			case GFS2_METATYPE_IN:   /* 5 */
-				print_gfs2(which_fieldname_mh(print_field));
-				break;
-			case GFS2_METATYPE_LF:   /* 6 */
-				print_gfs2(which_fieldname_lf(print_field));
-				break;
-			case GFS2_METATYPE_JD:
-				print_gfs2(which_fieldname_mh(print_field));
-				break;
-			case GFS2_METATYPE_LH:
-				print_gfs2(which_fieldname_lh(print_field));
-				break;
-			case GFS2_METATYPE_LD:
-				print_gfs2(which_fieldname_ld(print_field));
-				break;
-			case GFS2_METATYPE_EA:
-				break;
-			case GFS2_METATYPE_ED:
-				break;
-			case GFS2_METATYPE_LB:
-				break;
-			case GFS2_METATYPE_QC:
-				break;
-			default:
-				break;
+			const struct lgfs2_metadata *m = find_mtype(get_block_type(bh));
+			if (m) {
+				const struct lgfs2_metafield *f;
+				unsigned n;
+				for (n = 0; n < m->nfields; n++) {
+					f = &m->fields[n];
+					if (print_field >= f->offset &&
+					    print_field < (f->offset + f->length)) {
+						print_gfs2(m->fields[n].name);
+						break;
+					}
+				}
 			}
+
 		}
 		if (cursor_line) {
 			if (((*(bh->b_data + 7) == GFS2_METATYPE_IN) ||
@@ -3546,6 +3106,9 @@ int main(int argc, char *argv[])
 {
 	int i, j, fd;
 
+	if (lgfs2_selfcheck())
+		return EXIT_FAILURE;
+
 	indirect = malloc(sizeof(struct iinfo));
 	if (!indirect)
 		die("Out of memory.");
-- 
1.7.4.4






More information about the Cluster-devel mailing list