CVSROOT:        /cvs/cluster
Module name:    cluster
Changes by:     [EMAIL PROTECTED]       2007-11-13 17:22:06

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

Log message:
        Fixed printing of gfs1 journals.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/edit/gfs2hex.c.diff?cvsroot=cluster&r1=1.12&r2=1.13
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/edit/hexedit.c.diff?cvsroot=cluster&r1=1.24&r2=1.25
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/gfs2/edit/hexedit.h.diff?cvsroot=cluster&r1=1.13&r2=1.14

--- cluster/gfs2/edit/gfs2hex.c 2007/07/30 15:31:23     1.12
+++ cluster/gfs2/edit/gfs2hex.c 2007/11/13 17:22:06     1.13
@@ -463,6 +463,7 @@
        struct gfs2_meta_header mh;
        struct gfs2_rgrp rg;
        struct gfs2_leaf lf;
+       struct gfs_log_header lh1;
        struct gfs2_log_header lh;
        struct gfs2_log_descriptor ld;
 
@@ -525,8 +526,13 @@
                case GFS2_METATYPE_LH:
                        print_gfs2("Log Header:");
                        eol(0);
-                       gfs2_log_header_in(&lh, buf);
-                       gfs2_log_header_print(&lh);
+                       if (gfs1) {
+                               gfs_log_header_in(&lh1, buf);
+                               gfs_log_header_print(&lh1);
+                       } else {
+                               gfs2_log_header_in(&lh, buf);
+                               gfs2_log_header_print(&lh);
+                       }
                        break;
                        
                case GFS2_METATYPE_LD:
--- cluster/gfs2/edit/hexedit.c 2007/11/08 18:10:09     1.24
+++ cluster/gfs2/edit/hexedit.c 2007/11/13 17:22:06     1.25
@@ -1247,6 +1247,8 @@
                parse_rindex(tmp_inode, TRUE);
                brelse(tmp_bh, not_updated);
        }
+       else if (display_indirect(indirect, indirect_blocks, 0, 0) == 0)
+               return -1;
        else if (block_is_rglist()) {
                tmp_bh = bread(&sbd, masterblock("rindex"));
                tmp_inode = inode_get(&sbd, tmp_bh);
@@ -1277,8 +1279,6 @@
                print_quota(tmp_inode);
                brelse(tmp_bh, not_updated);
        }
-       else if (display_indirect(indirect, indirect_blocks, 0, 0) == 0)
-               return -1;
        return 0;
 }
 
@@ -1977,6 +1977,42 @@
 }/* interactive_mode */
 
 /* ------------------------------------------------------------------------ */
+/* gfs_log_header_in - read in a gfs1-style log header                      */
+/* ------------------------------------------------------------------------ */
+void gfs_log_header_in(struct gfs_log_header *head, char *buf)
+{
+       struct gfs_log_header *str = (struct gfs_log_header *) buf;
+
+       gfs2_meta_header_in(&head->lh_header, buf);
+
+       head->lh_flags = be32_to_cpu(str->lh_flags);
+       head->lh_pad = be32_to_cpu(str->lh_pad);
+
+       head->lh_first = be64_to_cpu(str->lh_first);
+       head->lh_sequence = be64_to_cpu(str->lh_sequence);
+
+       head->lh_tail = be64_to_cpu(str->lh_tail);
+       head->lh_last_dump = be64_to_cpu(str->lh_last_dump);
+
+       memcpy(head->lh_reserved, str->lh_reserved, 64);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* gfs_log_header_print - print a gfs1-style log header                     */
+/* ------------------------------------------------------------------------ */
+void gfs_log_header_print(struct gfs_log_header *lh)
+{
+       gfs2_meta_header_print(&lh->lh_header);
+       pv(lh, lh_flags, "%u", "0x%.8X");
+       pv(lh, lh_pad, "%u", "%x");
+       pv(lh, lh_first, "%llu", "%llx");
+       pv(lh, lh_sequence, "%llu", "%llx");
+       pv(lh, lh_tail, "%llu", "%llx");
+       pv(lh, lh_last_dump, "%llu", "%llx");
+}
+
+/* ------------------------------------------------------------------------ */
 /* dump_journal - dump a journal file's contents.                           */
 /* ------------------------------------------------------------------------ */
 void dump_journal(const char *journal)
@@ -2045,19 +2081,34 @@
                        uint64_t *b;
                        struct gfs2_log_descriptor ld;
                        int i = 0, ltndx;
-                       const char *logtypestr[4] = {
-                               "Metadata", "Revoke", "Jdata", "Unknown"};
+                       uint32_t logtypes[2][6] = {
+                               {GFS2_LOG_DESC_METADATA,
+                                GFS2_LOG_DESC_REVOKE,
+                                GFS2_LOG_DESC_JDATA,
+                                0, 0, 0},
+                               {GFS_LOG_DESC_METADATA,
+                                GFS_LOG_DESC_IUL,
+                                GFS_LOG_DESC_IDA,
+                                GFS_LOG_DESC_Q,
+                                GFS_LOG_DESC_LAST,
+                                0}};
+                       const char *logtypestr[2][6] = {
+                               {"Metadata", "Revoke", "Jdata",
+                                "Unknown", "Unknown", "Unknown"},
+                               {"Metadata", "Unlinked inode", "Dealloc inode",
+                                "Quota", "Final Entry", "Unknown"}};
 
                        print_gfs2("Block #%4llx: Log descriptor, ",
                                   jb / (gfs1 ? 1 : bufsize));
                        gfs2_log_descriptor_in(&ld, jbuf);
                        print_gfs2("type %d ", ld.ld_type);
-                       if (ld.ld_type >= GFS2_LOG_DESC_METADATA &&
-                           ld.ld_type <= GFS2_LOG_DESC_JDATA)
-                               ltndx = ld.ld_type - GFS2_LOG_DESC_METADATA;
-                       else
-                               ltndx = 3;
-                       print_gfs2("(%s) ", logtypestr[ltndx]);
+
+                       for (ltndx = 0;; ltndx++) {
+                               if (ld.ld_type == logtypes[gfs1][ltndx] ||
+                                   logtypes[gfs1][ltndx] == 0)
+                                       break;
+                       }
+                       print_gfs2("(%s) ", logtypestr[gfs1][ltndx]);
                        print_gfs2("len:%u, data1: %u",
                                   ld.ld_length, ld.ld_data1);
                        eol(0);
@@ -2085,11 +2136,22 @@
                        eol(0);
                } else if (get_block_type(jbuf) == GFS2_METATYPE_LH) {
                        struct gfs2_log_header lh;
+                       struct gfs_log_header lh1;
 
-                       gfs2_log_header_in(&lh, jbuf);
-                       print_gfs2("Block #%4llx: Log header: Seq = 0x%x, tail 
= 0x%x, blk = 0x%x",
-                                  jb / (gfs1 ? 1 : bufsize),
-                                  lh.lh_sequence, lh.lh_tail, lh.lh_blkno);
+                       if (gfs1) {
+                               gfs_log_header_in(&lh1, jbuf);
+                               print_gfs2("Block #%4llx: Log header: Seq"
+                                          "= 0x%x, first = 0x%x tail = "
+                                          "0x%x, last = 0x%x",
+                                          jb, lh1.lh_sequence, lh1.lh_first,
+                                          lh1.lh_tail, lh1.lh_last_dump);
+                       } else {
+                               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);
+                       }
                        eol(0);
                }
        }
--- cluster/gfs2/edit/hexedit.h 2007/11/13 17:03:39     1.13
+++ cluster/gfs2/edit/hexedit.h 2007/11/13 17:22:06     1.14
@@ -57,6 +57,13 @@
 #define GFS_FILE_FIFO           (101)  /* fifo/pipe */
 #define GFS_FILE_SOCK           (102)  /* socket */
 
+/* GFS 1 journal block types: */
+#define GFS_LOG_DESC_METADATA   (300)    /* metadata */
+#define GFS_LOG_DESC_IUL        (400)    /* unlinked inode */
+#define GFS_LOG_DESC_IDA        (401)    /* de-allocated inode */
+#define GFS_LOG_DESC_Q          (402)    /* quota */
+#define GFS_LOG_DESC_LAST       (500)    /* final in a logged transaction */
+
 EXTERN char *prog_name;
 EXTERN uint64_t block INIT(0);
 EXTERN int blockhist INIT(0);
@@ -103,12 +110,39 @@
         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];
+};
+
+struct gfs_log_header {
+       struct gfs2_meta_header lh_header;
+
+       uint32_t lh_flags;      /* GFS_LOG_HEAD_... */
+       uint32_t lh_pad;
+
+       uint64_t lh_first;     /* Block number of first header in this trans */
+       uint64_t lh_sequence;   /* Sequence number of this transaction */
+
+       uint64_t lh_tail;       /* Block number of log tail */
+       uint64_t lh_last_dump;  /* Block number of last dump */
+
+       char lh_reserved[64];
+};
+
 EXTERN int block_is_jindex(void);
 EXTERN int block_is_inum_file(void);
 EXTERN int block_is_statfs_file(void);
 EXTERN int block_is_quota_file(void);
 EXTERN int display_block_type(const char *lpBuffer, int from_restore);
 EXTERN void gfs_jindex_in(struct gfs_jindex *jindex, char *buf);
+EXTERN void gfs_log_header_in(struct gfs_log_header *head, char *buf);
+EXTERN void gfs_log_header_print(struct gfs_log_header *lh);
 
 struct gfs2_dirents {
        uint64_t block;
@@ -177,16 +211,6 @@
        char sb_reserved[96];
 };
 
-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 */

Reply via email to