[Cluster-devel] cluster/gfs2/edit hexedit.c hexedit.h

rpeterso at sourceware.org rpeterso at sourceware.org
Fri Oct 12 15:37:20 UTC 2007


CVSROOT:	/cvs/cluster
Module name:	cluster
Changes by:	rpeterso at sourceware.org	2007-10-12 15:37:19

Modified files:
	gfs2/edit      : hexedit.c hexedit.h 

Log message:
	Add the ability for gfs2_edit to print gfs1 journals.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/edit/hexedit.c.diff?cvsroot=cluster&r1=1.19&r2=1.20
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/edit/hexedit.h.diff?cvsroot=cluster&r1=1.10&r2=1.11

--- cluster/gfs2/edit/hexedit.c	2007/08/22 08:58:46	1.19
+++ cluster/gfs2/edit/hexedit.c	2007/10/12 15:37:19	1.20
@@ -423,8 +423,12 @@
 			struct_len = sizeof(struct gfs2_log_header);
 			break;
 		case GFS2_METATYPE_LD:
-			print_gfs2("(log descriptor)");
-			struct_len = sizeof(struct gfs2_log_descriptor);
+		 	print_gfs2("(log descriptor)");
+			if (gfs1)
+				struct_len = sizeof(struct gfs_log_descriptor);
+			else
+				struct_len =
+					sizeof(struct gfs2_log_descriptor);
 			break;
 		case GFS2_METATYPE_EA:
 			print_gfs2("(extended attr hdr)");
@@ -692,7 +696,7 @@
 	print_gfs2("Journal index entries found: %d.",
 		   di->i_di.di_size / sizeof(struct gfs_jindex));
 	eol(0);
-	lines_per_row[dmode] = 6;
+	lines_per_row[dmode] = 4;
 	for (print_entry_ndx=0; ; print_entry_ndx++) {
 		error = gfs2_readi(di, (void *)&buf,
 				   print_entry_ndx*sizeof(struct gfs_jindex),
@@ -1876,12 +1880,12 @@
 /* ------------------------------------------------------------------------ */
 void dump_journal(const char *journal)
 {
-	struct gfs2_buffer_head *jindex_bh, *j_bh;
+	struct gfs2_buffer_head *jindex_bh, *j_bh = NULL;
 	uint64_t jindex_block, jblock, j_size, jb;
 	int error, start_line, journal_num;
 	struct gfs2_dinode jdi;
 	char jbuf[bufsize];
-	struct gfs2_inode *j_inode;
+	struct gfs2_inode *j_inode = NULL;
 
 	start_line = line;
 	lines_per_row[dmode] = 1;
@@ -1890,31 +1894,66 @@
 	print_gfs2("Dumping journal #%d.", journal_num);
 	eol(0);
 	/* Figure out the block of the jindex file */
-	jindex_block = masterblock("jindex");
+	if (gfs1)
+		jindex_block = sbd1->sb_jindex_di.no_addr;
+	else
+		jindex_block = masterblock("jindex");
 	/* read in the block */
 	jindex_bh = bread(&sbd, jindex_block);
 	/* get the dinode data from it. */
 	gfs2_dinode_in(&di, jindex_bh->b_data); /* parse disk inode into structure */
 
-	do_dinode_extended(&di, jindex_bh->b_data); /* which parses the directory. */
+	if (!gfs1)
+		do_dinode_extended(&di, jindex_bh->b_data); /* parse dir. */
 	brelse(jindex_bh, not_updated);
 
-	jblock = indirect->ii[0].dirent[journal_num + 2].block;
-	j_bh = bread(&sbd, jblock);
-	j_inode = inode_get(&sbd, j_bh);
-	gfs2_dinode_in(&jdi, j_bh->b_data); /* parse disk inode into structure */
-	j_size = jdi.di_size;
+	if (gfs1) {
+		struct gfs2_inode *jiinode;
+		struct gfs_jindex ji;
+
+		jiinode = inode_get(&sbd, jindex_bh);
+		error = gfs2_readi(jiinode, (void *)&jbuf,
+				   journal_num * sizeof(struct gfs_jindex),
+				   sizeof(struct gfs_jindex));
+		if (!error)
+			return;
+		gfs_jindex_in(&ji, jbuf);
+		jblock = ji.ji_addr;
+		j_size = ji.ji_nsegment * 0x10;
+	} else {
+		jblock = indirect->ii[0].dirent[journal_num + 2].block;
+		j_bh = bread(&sbd, jblock);
+		j_inode = inode_get(&sbd, j_bh);
+		gfs2_dinode_in(&jdi, j_bh->b_data);/* parse dinode to struct */
+		j_size = jdi.di_size;
+	}
 
-	for (jb = 0; jb < j_size; jb += bufsize) {
-		error = gfs2_readi(j_inode, (void *)&jbuf, jb, bufsize);
+	for (jb = 0; jb < j_size; jb += (gfs1 ? 1:bufsize)) {
+		if (gfs1) {
+			if (j_bh)
+				brelse(j_bh, not_updated);
+			j_bh = bread(&sbd, jblock + jb);
+			memcpy(jbuf, j_bh->b_data, bufsize);
+		}
+		else
+			error = gfs2_readi(j_inode, (void *)&jbuf, jb,
+					   bufsize);
 		if (!error) /* end of file */
 			break;
 		if (get_block_type(jbuf) == GFS2_METATYPE_LD) {
 			uint64_t *b;
 			int i = 0;
 
-			print_gfs2("Block #%4llx: ", jb / bufsize);
-			b = (uint64_t *)(jbuf + sizeof(struct gfs2_log_descriptor));
+			print_gfs2("Block #%4llx: Log descriptor",
+				   jb / (gfs1 ? 1 : bufsize));
+			eol(0);
+			print_gfs2("             ");
+			if (gfs1)
+				b = (uint64_t *)(jbuf +
+					sizeof(struct gfs_log_descriptor));
+			else
+				b = (uint64_t *)(jbuf +
+					sizeof(struct gfs2_log_descriptor));
 			while (*b && (char *)b < (jbuf + bufsize)) {
 				if (!termlines ||
 				    (print_entry_ndx >= start_row[dmode] &&
@@ -1935,8 +1974,8 @@
 
 			gfs2_log_header_in(&lh, jbuf);
 			print_gfs2("Block #%4llx: Log header: Seq = 0x%x, tail = 0x%x, blk = 0x%x",
-				   jb / bufsize, lh.lh_sequence, lh.lh_tail,
-				   lh.lh_blkno);
+				   jb / (gfs1 ? 1 : bufsize),
+				   lh.lh_sequence, lh.lh_tail, lh.lh_blkno);
 			eol(0);
 		}
 	}
--- cluster/gfs2/edit/hexedit.h	2007/07/16 23:16:35	1.10
+++ cluster/gfs2/edit/hexedit.h	2007/10/12 15:37:19	1.11
@@ -171,6 +171,16 @@
         char ji_reserved[64];
 };
 
+struct gfs_log_descriptor {
+	struct gfs2_meta_header ld_header;
+
+	uint32_t ld_type;       /* GFS_LOG_DESC_... Type of this log chunk */
+	uint32_t ld_length;     /* Number of buffers in this chunk */
+	uint32_t ld_data1;      /* descriptor-specific field */
+	uint32_t ld_data2;      /* descriptor-specific field */
+	char ld_reserved[64];
+};
+
 EXTERN struct blkstack_info blockstack[BLOCK_STACK_SIZE];
 EXTERN struct iinfo *indirect; /* more than the most indirect
 			       pointers possible for any given 4K block */
@@ -226,7 +236,6 @@
 	__LINE__, __FILE__); \
 }
 
-#define pa(struct, member, count) print_array(#member, struct->member, count);
 #define printk printw
 
 /*  Divide x by y.  Round up if there is a remainder.  */




More information about the Cluster-devel mailing list