]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
Refactor code to print journal superblock information
authorTheodore Ts'o <tytso@mit.edu>
Thu, 16 Feb 2017 23:54:41 +0000 (18:54 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 16 Feb 2017 23:54:41 +0000 (18:54 -0500)
Move the code to list the journal superblock information to libe2p, so
it can be used by debugfs, and so we don't have two copies of
substantially the same code in dumpe2fs.

Signed-off-by: Theodore Ts'o <tytso@mit.edu>
debugfs/logdump.c
lib/e2p/Makefile.in
lib/e2p/e2p.h
lib/e2p/ljs.c [new file with mode: 0644]
misc/dumpe2fs.c
tests/j_ext_dumpe2fs/expect

index ee3201a6d5f396ac29dcce0cabaa3dce2590fe49..6ff5ad1f0d57493d8958cced6381023e55bc31da 100644 (file)
@@ -39,7 +39,7 @@ enum journal_location {JOURNAL_IS_INTERNAL, JOURNAL_IS_EXTERNAL};
 
 #define ANY_BLOCK ((blk64_t) -1)
 
-static int             dump_all, dump_old, dump_contents, dump_descriptors;
+static int             dump_all, dump_super, dump_old, dump_contents, dump_descriptors;
 static blk64_t         block_to_dump, bitmap_to_dump, inode_block_to_dump;
 static unsigned int    group_to_dump, inode_offset_to_dump;
 static ext2_ino_t      inode_to_dump;
@@ -96,6 +96,7 @@ void do_logdump(int argc, char **argv)
        dump_all = 0;
        dump_old = 0;
        dump_contents = 0;
+       dump_super = 0;
        dump_descriptors = 1;
        block_to_dump = ANY_BLOCK;
        bitmap_to_dump = -1;
@@ -103,7 +104,7 @@ void do_logdump(int argc, char **argv)
        inode_to_dump = -1;
 
        reset_getopt();
-       while ((c = getopt (argc, argv, "ab:ci:f:Os")) != EOF) {
+       while ((c = getopt (argc, argv, "ab:ci:f:OsS")) != EOF) {
                switch (c) {
                case 'a':
                        dump_all++;
@@ -133,6 +134,9 @@ void do_logdump(int argc, char **argv)
                case 's':
                        use_sb++;
                        break;
+               case 'S':
+                       dump_super++;
+                       break;
                default:
                        goto print_usage;
                }
@@ -383,6 +387,12 @@ static void dump_journal(char *cmdname, FILE *out_file,
        if (retval)
                return;
 
+       if (dump_super) {
+               e2p_list_journal_super(out_file, jsb_buffer,
+                                      current_fs->blocksize, 0);
+               fputc('\n', out_file);
+       }
+
        jsb = (journal_superblock_t *) jsb_buffer;
        if (be32_to_cpu(jsb->s_header.h_magic) != JFS_MAGIC_NUMBER) {
                fprintf(out_file,
index e86a8ac404582f17b584fb129785e199879d0d87..6fd2ceca6bb467169bedc49d667cdabe92ad1148 100644 (file)
@@ -17,7 +17,7 @@ INSTALL = @INSTALL@
 all::  e2p.pc
 
 OBJS=          feature.o fgetflags.o fsetflags.o fgetversion.o fsetversion.o \
-               getflags.o getversion.o hashstr.o iod.o ls.o mntopts.o \
+               getflags.o getversion.o hashstr.o iod.o ls.o ljs.o mntopts.o \
                parse_num.o pe.o pf.o ps.o setflags.o setversion.o uuid.o \
                ostype.o percent.o crypto_mode.o fgetproject.o fsetproject.o
 
@@ -25,7 +25,7 @@ SRCS=         $(srcdir)/feature.c $(srcdir)/fgetflags.c \
                $(srcdir)/fsetflags.c $(srcdir)/fgetversion.c \
                $(srcdir)/fsetversion.c $(srcdir)/getflags.c \
                $(srcdir)/getversion.c $(srcdir)/hashstr.c $(srcdir)/iod.c \
-               $(srcdir)/ls.c $(srcdir)/mntopts.c $(srcdir)/parse_num.c \
+               $(srcdir)/ls.c $(srcdir)/ljs.c $(srcdir)/mntopts.c $(srcdir)/parse_num.c \
                $(srcdir)/pe.c $(srcdir)/pf.c $(srcdir)/ps.c \
                $(srcdir)/setflags.c $(srcdir)/setversion.c $(srcdir)/uuid.c \
                $(srcdir)/ostype.c $(srcdir)/percent.c $(srcdir)/crypto_mode.c \
index 66b83b49ada6f68630cd5376057c03884597c947..e96cdec8528c80202d2843e274abb2ed17b4729e 100644 (file)
@@ -47,6 +47,9 @@ void print_fs_state (FILE * f, unsigned short state);
 int setflags (int fd, unsigned long flags);
 int setversion (int fd, unsigned long version);
 
+void e2p_list_journal_super(FILE *f, char *journal_sb_buf,
+                           int exp_block_size, int flags);
+
 const char *e2p_feature2string(int compat, unsigned int mask);
 const char *e2p_jrnl_feature2string(int compat, unsigned int mask);
 int e2p_string2feature(char *string, int *compat, unsigned int *mask);
diff --git a/lib/e2p/ljs.c b/lib/e2p/ljs.c
new file mode 100644 (file)
index 0000000..2db700b
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * ljs.c                       - List the contents of an journal superblock
+ *
+ * Copyright (C) 1995, 1996, 1997  Theodore Ts'o <tytso@mit.edu>
+ *
+ * %Begin-Header%
+ * This file may be redistributed under the terms of the GNU Library
+ * General Public License, version 2.
+ * %End-Header%
+ */
+
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <string.h>
+#include <grp.h>
+#include <pwd.h>
+#include <time.h>
+
+#include "ext2fs/ext2_fs.h"
+#include "ext2fs/ext2fs.h"
+#include "e2p.h"
+#include "ext2fs/kernel-jbd.h"
+
+#ifdef WORDS_BIGENDIAN
+#define e2p_be32(x) (x)
+#else
+static __u32 e2p_swab32(__u32 val)
+{
+       return ((val>>24) | ((val>>8)&0xFF00) |
+               ((val<<8)&0xFF0000) | (val<<24));
+}
+
+#define e2p_be32(x) e2p_swab32(x)
+#endif
+
+static const char *journal_checksum_type_str(__u8 type)
+{
+       switch (type) {
+       case JBD2_CRC32C_CHKSUM:
+               return "crc32c";
+       default:
+               return "unknown";
+       }
+}
+
+void e2p_list_journal_super(FILE *f, char *journal_sb_buf,
+                           int exp_block_size, int flags)
+{
+       journal_superblock_t *jsb = (journal_superblock_t *) journal_sb_buf;
+       __u32 *mask_ptr, mask, m;
+       unsigned int size;
+       int i, j, printed = 0;
+       unsigned int nr_users;
+
+       fprintf(f, "%s", "Journal features:        ");
+       for (i=0, mask_ptr=&jsb->s_feature_compat; i <3; i++,mask_ptr++) {
+               mask = e2p_be32(*mask_ptr);
+               for (j=0,m=1; j < 32; j++, m<<=1) {
+                       if (mask & m) {
+                               fprintf(f, " %s", e2p_jrnl_feature2string(i, m));
+                               printed++;
+                       }
+               }
+       }
+       if (printed == 0)
+               fprintf(f, " (none)");
+       fputc('\n', f);
+       fputs("Journal size:             ", f);
+       size = (ntohl(jsb->s_blocksize) / 1024) * ntohl(jsb->s_maxlen);
+       if (size < 8192)
+               fprintf(f, "%uk\n", size);
+       else
+               fprintf(f, "%uM\n", size >> 10);
+       nr_users = (unsigned int) ntohl(jsb->s_nr_users);
+       if (exp_block_size != ntohl(jsb->s_blocksize))
+               fprintf(f, "Journal block size:       %u\n",
+                       (unsigned int)ntohl(jsb->s_blocksize));
+       fprintf(f, "Journal length:           %u\n",
+               (unsigned int)ntohl(jsb->s_maxlen));
+       if (ntohl(jsb->s_first) != 1)
+               fprintf(f, "Journal first block:      %u\n",
+                       (unsigned int)ntohl(jsb->s_first));
+       fprintf(f, "Journal sequence:         0x%08x\n"
+               "Journal start:            %u\n",
+               (unsigned int)ntohl(jsb->s_sequence),
+               (unsigned int)ntohl(jsb->s_start));
+       if (nr_users != 1)
+               fprintf(f, "Journal number of users:  %u\n", nr_users);
+       if (jsb->s_feature_compat & e2p_be32(JFS_FEATURE_COMPAT_CHECKSUM))
+               fprintf(f, "%s", "Journal checksum type:    crc32\n");
+       if ((jsb->s_feature_incompat &
+            e2p_be32(JFS_FEATURE_INCOMPAT_CSUM_V3)) ||
+           (jsb->s_feature_incompat &
+            e2p_be32(JFS_FEATURE_INCOMPAT_CSUM_V2)))
+               fprintf(f, "Journal checksum type:    %s\n"
+                       "Journal checksum:         0x%08x\n",
+                       journal_checksum_type_str(jsb->s_checksum_type),
+                       e2p_be32(jsb->s_checksum));
+       if ((nr_users > 1) ||
+           !e2p_is_null_uuid(&jsb->s_users[0])) {
+               for (i=0; i < nr_users; i++) {
+                       printf(i ? "                          %s\n"
+                              : "Journal users:            %s\n",
+                              e2p_uuid2str(&jsb->s_users[i*16]));
+               }
+       }
+       if (jsb->s_errno != 0)
+               fprintf(f, "Journal errno:            %d\n",
+                       (int) ntohl(jsb->s_errno));
+}
index a034703b39ea9cebfb17a9c202cec7a5c5fab86b..621840ae1ba6856bfdd2359b1ac3940937d8a973 100644 (file)
@@ -404,49 +404,7 @@ static void print_inline_journal_information(ext2_filsys fs)
                        _("Journal superblock magic number invalid!\n"));
                exit(1);
        }
-       printf("%s", _("Journal features:        "));
-       for (i=0, mask_ptr=&jsb->s_feature_compat; i <3; i++,mask_ptr++) {
-               mask = be32_to_cpu(*mask_ptr);
-               for (j=0,m=1; j < 32; j++, m<<=1) {
-                       if (mask & m) {
-                               printf(" %s", e2p_jrnl_feature2string(i, m));
-                               printed++;
-                       }
-               }
-       }
-       if (printed == 0)
-               printf(" (none)");
-       printf("\n");
-       fputs(_("Journal size:             "), stdout);
-       if (ext2fs_has_feature_huge_file(fs->super) &&
-           (inode.i_flags & EXT4_HUGE_FILE_FL))
-               size = inode.i_blocks / (fs->blocksize / 1024);
-       else
-               size = inode.i_blocks >> 1;
-       if (size < 8192)
-               printf("%uk\n", size);
-       else
-               printf("%uM\n", size >> 10);
-       printf(_("Journal length:           %u\n"
-                "Journal sequence:         0x%08x\n"
-                "Journal start:            %u\n"),
-              (unsigned int)ntohl(jsb->s_maxlen),
-              (unsigned int)ntohl(jsb->s_sequence),
-              (unsigned int)ntohl(jsb->s_start));
-       if (jsb->s_feature_compat &
-           ext2fs_cpu_to_be32(JFS_FEATURE_COMPAT_CHECKSUM))
-               printf("%s", _("Journal checksum type:    crc32\n"));
-       if ((jsb->s_feature_incompat &
-            ext2fs_cpu_to_be32(JFS_FEATURE_INCOMPAT_CSUM_V3)) ||
-           (jsb->s_feature_incompat &
-            ext2fs_cpu_to_be32(JFS_FEATURE_INCOMPAT_CSUM_V2)))
-               printf(_("Journal checksum type:    %s\n"
-                        "Journal checksum:         0x%08x\n"),
-                      journal_checksum_type_str(jsb->s_checksum_type),
-                      ext2fs_be32_to_cpu(jsb->s_checksum));
-       if (jsb->s_errno != 0)
-               printf(_("Journal errno:            %d\n"),
-                      (int) ntohl(jsb->s_errno));
+       e2p_list_journal_super(stdout, buf, fs->blocksize, 0);
 }
 
 static void print_journal_information(ext2_filsys fs)
@@ -474,46 +432,7 @@ static void print_journal_information(ext2_filsys fs)
                        _("Couldn't find journal superblock magic numbers"));
                exit(1);
        }
-
-       if (jsb->s_feature_compat &
-           ext2fs_cpu_to_be32(JFS_FEATURE_COMPAT_CHECKSUM))
-               printf("%s", _("Journal checksum type:    crc32\n"));
-       if ((jsb->s_feature_incompat &
-            ext2fs_cpu_to_be32(JFS_FEATURE_INCOMPAT_CSUM_V3)) ||
-           (jsb->s_feature_incompat &
-            ext2fs_cpu_to_be32(JFS_FEATURE_INCOMPAT_CSUM_V2)))
-               printf(_("Journal checksum type:    %s\n"
-                        "Journal checksum:         0x%08x\n"),
-                      journal_checksum_type_str(jsb->s_checksum_type),
-                      ext2fs_be32_to_cpu(jsb->s_checksum));
-
-       printf("%s", _("Journal features:        "));
-       for (i = 0, mask_ptr = &jsb->s_feature_compat; i < 3; i++, mask_ptr++) {
-               mask = be32_to_cpu(*mask_ptr);
-               for (j = 0, m = 1; j < 32; j++, m <<= 1) {
-                       if (mask & m) {
-                               printf(" %s", e2p_jrnl_feature2string(i, m));
-                               printed++;
-                       }
-               }
-       }
-
-       printf(_("\nJournal block size:       %u\n"
-                "Journal length:           %u\n"
-                "Journal first block:      %u\n"
-                "Journal sequence:         0x%08x\n"
-                "Journal start:            %u\n"
-                "Journal number of users:  %u\n"),
-              (unsigned int)ntohl(jsb->s_blocksize),  (unsigned int)ntohl(jsb->s_maxlen),
-              (unsigned int)ntohl(jsb->s_first), (unsigned int)ntohl(jsb->s_sequence),
-              (unsigned int)ntohl(jsb->s_start), (unsigned int)ntohl(jsb->s_nr_users));
-
-       for (i=0; i < ntohl(jsb->s_nr_users); i++) {
-               uuid_unparse(&jsb->s_users[i*16], str);
-               printf(i ? "                          %s\n"
-                      : _("Journal users:            %s\n"),
-                      str);
-       }
+       e2p_list_journal_super(stdout, buf, fs->blocksize, 0);
 }
 
 static void parse_extended_opts(const char *opts, blk64_t *superblock,
index 8dc95cd553575f6806f434f25eef8d99fd092aa7..db77a36dcbf4357335abcf5654a96061f1d31e77 100644 (file)
@@ -42,13 +42,12 @@ Required extra isize:     28
 Desired extra isize:      28
 Default directory hash:   half_md4
 Checksum type:            crc32c
-Journal checksum type:    crc32c
-Journal checksum:         0x661e816f
 Journal features:         journal_64bit journal_checksum_v3
-Journal block size:       1024
+Journal size:             2048k
 Journal length:           2048
 Journal first block:      3
 Journal sequence:         0x00000003
 Journal start:            0
-Journal number of users:  1
+Journal checksum type:    crc32c
+Journal checksum:         0x661e816f
 Journal users:            117f752e-f27d-4f6f-a652-072586a29b82