From 03a179a10ef44c7057d5aad3d6654ee6b507f2ed Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Thu, 16 Feb 2017 18:54:41 -0500 Subject: [PATCH] Refactor code to print journal superblock information 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 --- debugfs/logdump.c | 14 +++++- lib/e2p/Makefile.in | 4 +- lib/e2p/e2p.h | 3 ++ lib/e2p/ljs.c | 113 ++++++++++++++++++++++++++++++++++++++++++++ misc/dumpe2fs.c | 85 +-------------------------------- tests/j_ext_dumpe2fs/expect | 7 ++- 6 files changed, 135 insertions(+), 91 deletions(-) create mode 100644 lib/e2p/ljs.c diff --git a/debugfs/logdump.c b/debugfs/logdump.c index ee3201a..6ff5ad1 100644 --- a/debugfs/logdump.c +++ b/debugfs/logdump.c @@ -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, diff --git a/lib/e2p/Makefile.in b/lib/e2p/Makefile.in index e86a8ac..6fd2cec 100644 --- a/lib/e2p/Makefile.in +++ b/lib/e2p/Makefile.in @@ -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 \ diff --git a/lib/e2p/e2p.h b/lib/e2p/e2p.h index 66b83b4..e96cdec 100644 --- a/lib/e2p/e2p.h +++ b/lib/e2p/e2p.h @@ -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 index 0000000..2db700b --- /dev/null +++ b/lib/e2p/ljs.c @@ -0,0 +1,113 @@ +/* + * ljs.c - List the contents of an journal superblock + * + * Copyright (C) 1995, 1996, 1997 Theodore Ts'o + * + * %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 +#include +#include +#include +#include +#include +#include + +#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)); +} diff --git a/misc/dumpe2fs.c b/misc/dumpe2fs.c index a034703..621840a 100644 --- a/misc/dumpe2fs.c +++ b/misc/dumpe2fs.c @@ -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, diff --git a/tests/j_ext_dumpe2fs/expect b/tests/j_ext_dumpe2fs/expect index 8dc95cd..db77a36 100644 --- a/tests/j_ext_dumpe2fs/expect +++ b/tests/j_ext_dumpe2fs/expect @@ -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 -- 1.8.3.1