X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=debugfs%2Flogdump.c;h=03edb44b71fcb0ece3a2aa0bd81e66a5eab72f0a;hb=5abc0414922a3c99a80fdc53b1acb0f44f6e2aac;hp=1dc78690cd9fff8084cf7de97865597f832cd16f;hpb=58b0356a251a6bc7703a482bea5d1fe6766a65c5;p=tools%2Fe2fsprogs.git diff --git a/debugfs/logdump.c b/debugfs/logdump.c index 1dc7869..03edb44 100644 --- a/debugfs/logdump.c +++ b/debugfs/logdump.c @@ -1,7 +1,7 @@ /* * logdump.c --- dump the contents of the journal out to a file * - * Authro: Stephen C. Tweedie, 2001 + * Author: Stephen C. Tweedie, 2001 * Copyright (C) 2001 Red Hat, Inc. * Based on portions Copyright (C) 1994 Theodore Ts'o. * @@ -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; } @@ -271,13 +275,13 @@ errout: return; print_usage: - fprintf(stderr, "%s: Usage: logdump [-acsO] [-b] [-i]\n\t" + fprintf(stderr, "%s: Usage: logdump [-acsOS] [-b] [-i]\n\t" "[-f] [output_file]\n", argv[0]); } static int read_journal_block(const char *cmd, struct journal_source *source, - off_t offset, char *buf, unsigned int size) + ext2_loff_t offset, char *buf, unsigned int size) { int retval; unsigned int got; @@ -295,8 +299,8 @@ static int read_journal_block(const char *cmd, struct journal_source *source, got = retval; retval = 0; } else { - retval = ext2fs_file_lseek(source->file, offset, - EXT2_SEEK_SET, NULL); + retval = ext2fs_file_llseek(source->file, offset, + EXT2_SEEK_SET, NULL); if (retval) { seek_err: com_err(cmd, retval, "while seeking in reading journal"); @@ -346,7 +350,6 @@ static void dump_journal(char *cmdname, FILE *out_file, int retval; __u32 magic, sequence, blocktype; journal_header_t *header; - tid_t transaction; unsigned int blocknr = 0; @@ -364,7 +367,7 @@ static void dump_journal(char *cmdname, FILE *out_file, if ((be32_to_cpu(jsb->s_header.h_magic) != JFS_MAGIC_NUMBER) && (sb->s_magic == EXT2_SUPER_MAGIC) && - (sb->s_feature_incompat & EXT3_FEATURE_INCOMPAT_JOURNAL_DEV)) { + ext2fs_has_feature_journal_dev(sb)) { blocksize = EXT2_BLOCK_SIZE(sb); blocknr = (blocksize == 1024) ? 2 : 1; uuid_unparse(sb->s_uuid, jsb_buffer); @@ -378,12 +381,18 @@ static void dump_journal(char *cmdname, FILE *out_file, } /* Next, read the journal superblock */ - - retval = read_journal_block(cmdname, source, blocknr*blocksize, + retval = read_journal_block(cmdname, source, + ((ext2_loff_t) blocknr) * blocksize, jsb_buffer, 1024); 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, @@ -407,8 +416,8 @@ static void dump_journal(char *cmdname, FILE *out_file, while (1) { retval = read_journal_block(cmdname, source, - blocknr*blocksize, buf, - blocksize); + ((ext2_loff_t) blocknr) * blocksize, + buf, blocksize); if (retval) return; @@ -468,6 +477,23 @@ static void dump_journal(char *cmdname, FILE *out_file, } } +static inline size_t journal_super_tag_bytes(journal_superblock_t *jsb) +{ + size_t sz; + + if (JSB_HAS_INCOMPAT_FEATURE(jsb, JFS_FEATURE_INCOMPAT_CSUM_V3)) + return sizeof(journal_block_tag3_t); + + sz = sizeof(journal_block_tag_t); + + if (JSB_HAS_INCOMPAT_FEATURE(jsb, JFS_FEATURE_INCOMPAT_CSUM_V2)) + sz += sizeof(__u16); + + if (JSB_HAS_INCOMPAT_FEATURE(jsb, JFS_FEATURE_INCOMPAT_64BIT)) + return sz; + + return sz - sizeof(__u32); +} static void dump_descriptor_block(FILE *out_file, struct journal_source *source, @@ -629,7 +655,7 @@ static void dump_metadata_block(FILE *out_file, struct journal_source *source, return; retval = read_journal_block("logdump", source, - blocksize * log_blocknr, + ((ext2_loff_t) log_blocknr) * blocksize, buf, blocksize); if (retval) return; @@ -714,38 +740,3 @@ static void do_hexdump (FILE *out_file, char *buf, int blocksize) } } -void do_hexdump_block(int argc, char **argv) -{ - blk64_t block; - char *buf; - errcode_t errcode; - FILE *out; - - if (common_args_process(argc, argv, 2, 2, argv[0], - "", 0)) - return; - - if (strtoblk(argv[0], argv[1], "block number", &block)) - return; - - buf = malloc(current_fs->blocksize); - if (!buf) { - fprintf(stderr, "Couldn't allocate block buffer.\n"); - return; - } - out = open_pager(); - - errcode = io_channel_read_blk64(current_fs->io, block, 1, buf); - if (errcode) { - com_err("hexdump_block", errcode, - "while reading block %llu\n", block); - goto errout; - } - - do_hexdump(out, buf, current_fs->blocksize); - -errout: - free(buf); - close_pager(out); -} -