1da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o/* 2da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o * logdump.c --- dump the contents of the journal out to a file 3efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * 4da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o * Authro: Stephen C. Tweedie, 2001 <sct@redhat.com> 5da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o * Copyright (C) 2001 Red Hat, Inc. 6efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * Based on portions Copyright (C) 1994 Theodore Ts'o. 7da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o * 8efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * This file may be redistributed under the terms of the GNU Public 9da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o * License. 10da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o */ 11da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 12d1154eb460efe588eaed3d439c1caaca149fa362Theodore Ts'o#include "config.h" 13da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#include <stdio.h> 14da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#include <unistd.h> 15da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#include <stdlib.h> 16da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#include <ctype.h> 17da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#include <string.h> 18da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#include <time.h> 19da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#ifdef HAVE_ERRNO_H 20da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#include <errno.h> 21da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#endif 22da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#include <sys/types.h> 23da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#include <sys/stat.h> 24da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#include <fcntl.h> 25da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#include <utime.h> 26da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#ifdef HAVE_GETOPT_H 27da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#include <getopt.h> 28efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o#else 29da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'oextern int optind; 30da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'oextern char *optarg; 31da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#endif 32da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 33da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#include "debugfs.h" 34f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o#include "blkid/blkid.h" 35da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#include "jfs_user.h" 364ea7bd04390935e1f8b473c8b857e518df2e226bTheodore Ts'o#include <uuid/uuid.h> 37da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 38da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'oenum journal_location {JOURNAL_IS_INTERNAL, JOURNAL_IS_EXTERNAL}; 39da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 404dbfd79d1458ce1259b951377e341aeb6197f8c1Darrick J. Wong#define ANY_BLOCK ((blk64_t) -1) 41544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o 4246272d5aa21fe879ca90a157485a2a3507e0a9b4Darrick J. Wongstatic int dump_all, dump_old, dump_contents, dump_descriptors; 43f404167dda29a59d2be2882328aeb074b9899669Theodore Ts'ostatic blk64_t block_to_dump, bitmap_to_dump, inode_block_to_dump; 44f404167dda29a59d2be2882328aeb074b9899669Theodore Ts'ostatic unsigned int group_to_dump, inode_offset_to_dump; 45f404167dda29a59d2be2882328aeb074b9899669Theodore Ts'ostatic ext2_ino_t inode_to_dump; 46da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 47efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'ostruct journal_source 48da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o{ 49da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o enum journal_location where; 50da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o int fd; 51da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o ext2_file_t file; 52da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o}; 53da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 54da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'ostatic void dump_journal(char *, FILE *, struct journal_source *); 55da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 56da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'ostatic void dump_descriptor_block(FILE *, struct journal_source *, 57da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o char *, journal_superblock_t *, 58da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o unsigned int *, int, tid_t); 59da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 60da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'ostatic void dump_revoke_block(FILE *, char *, journal_superblock_t *, 61da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o unsigned int, int, tid_t); 62da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 63da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'ostatic void dump_metadata_block(FILE *, struct journal_source *, 64efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o journal_superblock_t*, 6598446d738201df0dd24830eaf0781c7b4a26689aTheodore Ts'o unsigned int, unsigned int, unsigned int, 6698446d738201df0dd24830eaf0781c7b4a26689aTheodore Ts'o int, tid_t); 67da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 68da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'ostatic void do_hexdump (FILE *, char *, int); 69da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 70da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o#define WRAP(jsb, blocknr) \ 71da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (blocknr >= be32_to_cpu((jsb)->s_maxlen)) \ 72da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o blocknr -= (be32_to_cpu((jsb)->s_maxlen) - \ 73da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o be32_to_cpu((jsb)->s_first)); 74da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 75da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'ovoid do_logdump(int argc, char **argv) 76da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o{ 77da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o int c; 78da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o int retval; 79da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o char *out_fn; 80da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o FILE *out_file; 81efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 82da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o char *inode_spec = NULL; 83da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o char *journal_fn = NULL; 84da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o int journal_fd = 0; 85a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o int use_sb = 0; 86da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o ext2_ino_t journal_inum; 87da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o struct ext2_inode journal_inode; 88da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o ext2_file_t journal_file; 89da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o char *tmp; 905e4f070952bb4472e28a925f591b551baf2db278Theodore Ts'o struct journal_source journal_source; 91f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o struct ext2_super_block *es = NULL; 92efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 93c59776306c7e6e7aca2d1442a0cf1bc08c647944Manish Katiyar journal_source.where = JOURNAL_IS_INTERNAL; 945e4f070952bb4472e28a925f591b551baf2db278Theodore Ts'o journal_source.fd = 0; 955e4f070952bb4472e28a925f591b551baf2db278Theodore Ts'o journal_source.file = 0; 96da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o dump_all = 0; 9746272d5aa21fe879ca90a157485a2a3507e0a9b4Darrick J. Wong dump_old = 0; 98da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o dump_contents = 0; 99da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o dump_descriptors = 1; 100544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o block_to_dump = ANY_BLOCK; 101da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o bitmap_to_dump = -1; 102544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o inode_block_to_dump = ANY_BLOCK; 103da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o inode_to_dump = -1; 104efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 10588494bb6d440f703db98b6cc4452f63d7aa392b9Theodore Ts'o reset_getopt(); 10646272d5aa21fe879ca90a157485a2a3507e0a9b4Darrick J. Wong while ((c = getopt (argc, argv, "ab:ci:f:Os")) != EOF) { 107da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o switch (c) { 108da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o case 'a': 109da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o dump_all++; 110da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o break; 111da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o case 'b': 112da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o block_to_dump = strtoul(optarg, &tmp, 0); 113da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (*tmp) { 114da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o com_err(argv[0], 0, 115da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o "Bad block number - %s", optarg); 116da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return; 117da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 118da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o dump_descriptors = 0; 119da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o break; 120da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o case 'c': 121da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o dump_contents++; 122da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o break; 123da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o case 'f': 124da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o journal_fn = optarg; 125da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o break; 126da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o case 'i': 127da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o inode_spec = optarg; 128da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o dump_descriptors = 0; 129da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o break; 13046272d5aa21fe879ca90a157485a2a3507e0a9b4Darrick J. Wong case 'O': 13146272d5aa21fe879ca90a157485a2a3507e0a9b4Darrick J. Wong dump_old++; 13246272d5aa21fe879ca90a157485a2a3507e0a9b4Darrick J. Wong break; 133a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o case 's': 134a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o use_sb++; 135a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o break; 136da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o default: 1379b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o goto print_usage; 138da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 139da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 140da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (optind != argc && optind != argc-1) { 1419b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o goto print_usage; 142da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 143da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 144f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o if (current_fs) 145f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o es = current_fs->super; 146f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o 147da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (inode_spec) { 148da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o int inode_group, group_offset, inodes_per_block; 149f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o 150da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (check_fs_open(argv[0])) 151da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return; 152da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 153da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o inode_to_dump = string_to_inode(inode_spec); 154da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (!inode_to_dump) 155da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return; 156da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 157da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o inode_group = ((inode_to_dump - 1) 158f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o / es->s_inodes_per_group); 159da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o group_offset = ((inode_to_dump - 1) 160f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o % es->s_inodes_per_group); 161efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o inodes_per_block = (current_fs->blocksize 162da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o / sizeof(struct ext2_inode)); 163efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 164efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o inode_block_to_dump = 165048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson ext2fs_inode_table_loc(current_fs, inode_group) + 166da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o (group_offset / inodes_per_block); 167da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o inode_offset_to_dump = ((group_offset % inodes_per_block) 168da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o * sizeof(struct ext2_inode)); 1694dbfd79d1458ce1259b951377e341aeb6197f8c1Darrick J. Wong printf("Inode %u is at group %u, block %llu, offset %u\n", 170da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o inode_to_dump, inode_group, 171da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o inode_block_to_dump, inode_offset_to_dump); 172da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 173da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 174da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (optind == argc) { 175da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o out_file = stdout; 176da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } else { 177da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o out_fn = argv[optind]; 178da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o out_file = fopen(out_fn, "w"); 1790bed54fd3ea86772022fa994a6af265613464699Brian Behlendorf if (!out_file) { 180da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o com_err(argv[0], errno, "while opening %s for logdump", 181da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o out_fn); 1820bed54fd3ea86772022fa994a6af265613464699Brian Behlendorf goto errout; 183da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 184da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 185da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 186544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o if (block_to_dump != ANY_BLOCK && current_fs != NULL) { 187efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o group_to_dump = ((block_to_dump - 188f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o es->s_first_data_block) 189f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o / es->s_blocks_per_group); 190048786d7e87a6de698936b0cf25f1ab70d5c15bcValerie Aurora Henson bitmap_to_dump = ext2fs_block_bitmap_loc(current_fs, group_to_dump); 191da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 192da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 1935faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o if (!journal_fn && check_fs_open(argv[0])) 1940bed54fd3ea86772022fa994a6af265613464699Brian Behlendorf goto errout; 1955faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o 1965faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o if (journal_fn) { 197da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o /* Set up to read journal from a regular file somewhere */ 198da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o journal_fd = open(journal_fn, O_RDONLY, 0); 199da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (journal_fd < 0) { 200da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o com_err(argv[0], errno, "while opening %s for logdump", 201da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o journal_fn); 2020bed54fd3ea86772022fa994a6af265613464699Brian Behlendorf goto errout; 203da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 204efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 205da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o journal_source.where = JOURNAL_IS_EXTERNAL; 206da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o journal_source.fd = journal_fd; 207f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o } else if ((journal_inum = es->s_journal_inum)) { 208a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o if (use_sb) { 209a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o if (es->s_jnl_backup_type != EXT3_JNL_BACKUP_BLOCKS) { 210a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o com_err(argv[0], 0, 211a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o "no journal backup in super block\n"); 2120bed54fd3ea86772022fa994a6af265613464699Brian Behlendorf goto errout; 213a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o } 214a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o memset(&journal_inode, 0, sizeof(struct ext2_inode)); 215efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o memcpy(&journal_inode.i_block[0], es->s_jnl_blocks, 216a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o EXT2_N_BLOCKS*4); 217931b58e1cb2158c1f5218059cce92e94917ef485Andreas Dilger journal_inode.i_size_high = es->s_jnl_blocks[15]; 218a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o journal_inode.i_size = es->s_jnl_blocks[16]; 219a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o journal_inode.i_links_count = 1; 220a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o journal_inode.i_mode = LINUX_S_IFREG | 0600; 221a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o } else { 222efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o if (debugfs_read_inode(journal_inum, &journal_inode, 223a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o argv[0])) 2240bed54fd3ea86772022fa994a6af265613464699Brian Behlendorf goto errout; 225a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o } 226efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 227a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o retval = ext2fs_file_open2(current_fs, journal_inum, 228a435ec3449694a8fa299337197cc09624960a3a6Theodore Ts'o &journal_inode, 0, &journal_file); 229da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (retval) { 230da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o com_err(argv[0], retval, "while opening ext2 file"); 2310bed54fd3ea86772022fa994a6af265613464699Brian Behlendorf goto errout; 232da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 233da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o journal_source.where = JOURNAL_IS_INTERNAL; 234da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o journal_source.file = journal_file; 235f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o } else { 236f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o char uuid[37]; 237efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 238f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o uuid_unparse(es->s_journal_uuid, uuid); 239f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o journal_fn = blkid_get_devname(NULL, "UUID", uuid); 240f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o if (!journal_fn) 241f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o journal_fn = blkid_devno_to_devname(es->s_journal_dev); 242f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o if (!journal_fn) { 243f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o com_err(argv[0], 0, "filesystem has no journal"); 2440bed54fd3ea86772022fa994a6af265613464699Brian Behlendorf goto errout; 245f364093b1956def0b0f1d037852cbb645284d5f2Theodore Ts'o } 2465faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o journal_fd = open(journal_fn, O_RDONLY, 0); 2475faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o if (journal_fd < 0) { 2485faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o com_err(argv[0], errno, "while opening %s for logdump", 2495faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o journal_fn); 2505faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o free(journal_fn); 2510bed54fd3ea86772022fa994a6af265613464699Brian Behlendorf goto errout; 2525faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o } 2535faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o fprintf(out_file, "Using external journal found at %s\n", 2545faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o journal_fn); 2555faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o free(journal_fn); 2565faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o journal_source.where = JOURNAL_IS_EXTERNAL; 2575faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o journal_source.fd = journal_fd; 258da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 259da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 260da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o dump_journal(argv[0], out_file, &journal_source); 261da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 262da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (journal_source.where == JOURNAL_IS_INTERNAL) 263da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o ext2fs_file_close(journal_file); 264da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o else 265da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o close(journal_fd); 266da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 2670bed54fd3ea86772022fa994a6af265613464699Brian Behlendorferrout: 268dad0bab204a61c1749e1bbc747f8fa86fa0f1577Eric Sandeen if (out_file && (out_file != stdout)) 269da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fclose(out_file); 270da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 271da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return; 2729b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o 2739b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'oprint_usage: 27446272d5aa21fe879ca90a157485a2a3507e0a9b4Darrick J. Wong fprintf(stderr, "%s: Usage: logdump [-acsO] [-b<block>] [-i<filespec>]\n\t" 2759b9a780f5a5823865f62f0c9fd194d262f63a06fTheodore Ts'o "[-f<journal_file>] [output_file]\n", argv[0]); 276da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o} 277da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 278da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 279efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'ostatic int read_journal_block(const char *cmd, struct journal_source *source, 2805eca88c1dcb1b378997d2a38699856624a1681e4Theodore Ts'o ext2_loff_t offset, char *buf, unsigned int size) 281da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o{ 282da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o int retval; 283b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o unsigned int got; 284efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 285da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (source->where == JOURNAL_IS_EXTERNAL) { 2864bb0c0434c06da97836a3efba8a978a0d1ad5c6eTheodore Ts'o if (lseek(source->fd, offset, SEEK_SET) < 0) { 2874bb0c0434c06da97836a3efba8a978a0d1ad5c6eTheodore Ts'o retval = errno; 288b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o goto seek_err; 2894bb0c0434c06da97836a3efba8a978a0d1ad5c6eTheodore Ts'o } 2904bb0c0434c06da97836a3efba8a978a0d1ad5c6eTheodore Ts'o retval = read(source->fd, buf, size); 291b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o if (retval < 0) { 2925faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o retval = errno; 293b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o goto read_err; 294b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o } 295b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o got = retval; 296b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o retval = 0; 297da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } else { 2985eca88c1dcb1b378997d2a38699856624a1681e4Theodore Ts'o retval = ext2fs_file_llseek(source->file, offset, 2995eca88c1dcb1b378997d2a38699856624a1681e4Theodore Ts'o EXT2_SEEK_SET, NULL); 300da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (retval) { 301b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o seek_err: 302da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o com_err(cmd, retval, "while seeking in reading journal"); 303da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return retval; 304da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 305b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o retval = ext2fs_file_read(source->file, buf, size, &got); 306b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o if (retval) { 307b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o read_err: 308b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o com_err(cmd, retval, "while reading journal"); 309b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o return retval; 310b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o } 311da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 312b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o if (got != size) { 313b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o com_err(cmd, 0, "short read (read %u, expected %u) " 314b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o "while reading journal", got, size); 315da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o retval = -1; 316da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 317da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return retval; 318da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o} 319da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 3205e4f070952bb4472e28a925f591b551baf2db278Theodore Ts'ostatic const char *type_to_name(int btype) 321da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o{ 322da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o switch (btype) { 323da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o case JFS_DESCRIPTOR_BLOCK: 324da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return "descriptor block"; 325da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o case JFS_COMMIT_BLOCK: 326da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return "commit block"; 327da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o case JFS_SUPERBLOCK_V1: 328da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return "V1 superblock"; 329da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o case JFS_SUPERBLOCK_V2: 330da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return "V2 superblock"; 331da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o case JFS_REVOKE_BLOCK: 332da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return "revoke table"; 333da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 334da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return "unrecognised type"; 335da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o} 336da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 337da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 338efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'ostatic void dump_journal(char *cmdname, FILE *out_file, 339da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o struct journal_source *source) 340da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o{ 3415faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o struct ext2_super_block *sb; 342da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o char jsb_buffer[1024]; 343da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o char buf[8192]; 344da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o journal_superblock_t *jsb; 345544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o unsigned int blocksize = 1024; 346da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o int retval; 347da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o __u32 magic, sequence, blocktype; 348da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o journal_header_t *header; 349da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o tid_t transaction; 3505faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o unsigned int blocknr = 0; 351efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 3525faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o /* First, check to see if there's an ext2 superblock header */ 353b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o retval = read_journal_block(cmdname, source, 0, buf, 2048); 354da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (retval) 355da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return; 3565faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o 3575faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o jsb = (journal_superblock_t *) buf; 3585faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o sb = (struct ext2_super_block *) (buf+1024); 3592eae093081a097a0a611fe2817e1533825dfdd86Theodore Ts'o#ifdef WORDS_BIGENDIAN 360efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o if (sb->s_magic == ext2fs_swab16(EXT2_SUPER_MAGIC)) 3615faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o ext2fs_swap_super(sb); 362ff63f2686f859418b7248029a967f9f7280109dcStephen Tweedie#endif 363efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 3645faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o if ((be32_to_cpu(jsb->s_header.h_magic) != JFS_MAGIC_NUMBER) && 3655faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o (sb->s_magic == EXT2_SUPER_MAGIC) && 3664ee26699823c945b1894880f53cea3b45b5e3a20Darrick J. Wong ext2fs_has_feature_journal_dev(sb)) { 3675faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o blocksize = EXT2_BLOCK_SIZE(sb); 3685faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o blocknr = (blocksize == 1024) ? 2 : 1; 3694ea7bd04390935e1f8b473c8b857e518df2e226bTheodore Ts'o uuid_unparse(sb->s_uuid, jsb_buffer); 3705faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o fprintf(out_file, "Ext2 superblock header found.\n"); 3715faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o if (dump_all) { 3725faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o fprintf(out_file, "\tuuid=%s\n", jsb_buffer); 3735faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o fprintf(out_file, "\tblocksize=%d\n", blocksize); 3745d38ef1d049bf56d1c1e88b8b4d287c0f9470e61Valerie Clement fprintf(out_file, "\tjournal data size %lu\n", 3754efbac6fed75c29d3d5f1b676b932754653a2ac5Valerie Aurora Henson (unsigned long) ext2fs_blocks_count(sb)); 3765faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o } 3775faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o } 378efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 3795faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o /* Next, read the journal superblock */ 3805eca88c1dcb1b378997d2a38699856624a1681e4Theodore Ts'o retval = read_journal_block(cmdname, source, 3815eca88c1dcb1b378997d2a38699856624a1681e4Theodore Ts'o ((ext2_loff_t) blocknr) * blocksize, 382b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o jsb_buffer, 1024); 3835faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o if (retval) 3845faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o return; 3855faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o 386da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o jsb = (journal_superblock_t *) jsb_buffer; 3875faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o if (be32_to_cpu(jsb->s_header.h_magic) != JFS_MAGIC_NUMBER) { 3885faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o fprintf(out_file, 3895faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o "Journal superblock magic number invalid!\n"); 3905faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o return; 3915faba3acba0552b1dbae71418e8a002ccae1ae70Theodore Ts'o } 392da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o blocksize = be32_to_cpu(jsb->s_blocksize); 393da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o transaction = be32_to_cpu(jsb->s_sequence); 394da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o blocknr = be32_to_cpu(jsb->s_start); 395da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 396da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf(out_file, "Journal starts at block %u, transaction %u\n", 397da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o blocknr, transaction); 398da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 39946272d5aa21fe879ca90a157485a2a3507e0a9b4Darrick J. Wong if (!blocknr) { 400da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o /* Empty journal, nothing to do. */ 40146272d5aa21fe879ca90a157485a2a3507e0a9b4Darrick J. Wong if (!dump_old) 40246272d5aa21fe879ca90a157485a2a3507e0a9b4Darrick J. Wong return; 40346272d5aa21fe879ca90a157485a2a3507e0a9b4Darrick J. Wong else 40446272d5aa21fe879ca90a157485a2a3507e0a9b4Darrick J. Wong blocknr = 1; 40546272d5aa21fe879ca90a157485a2a3507e0a9b4Darrick J. Wong } 406efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 407da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o while (1) { 408efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o retval = read_journal_block(cmdname, source, 4095eca88c1dcb1b378997d2a38699856624a1681e4Theodore Ts'o ((ext2_loff_t) blocknr) * blocksize, 4105eca88c1dcb1b378997d2a38699856624a1681e4Theodore Ts'o buf, blocksize); 411b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o if (retval) 412da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return; 413efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 414da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o header = (journal_header_t *) buf; 415da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 416da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o magic = be32_to_cpu(header->h_magic); 417da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o sequence = be32_to_cpu(header->h_sequence); 418da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o blocktype = be32_to_cpu(header->h_blocktype); 419efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 420da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (magic != JFS_MAGIC_NUMBER) { 421da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf (out_file, "No magic number at block %u: " 422da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o "end of journal.\n", blocknr); 423da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return; 424da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 425efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 426da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (sequence != transaction) { 427da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf (out_file, "Found sequence %u (not %u) at " 428efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o "block %u: end of journal.\n", 429da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o sequence, transaction, blocknr); 43046272d5aa21fe879ca90a157485a2a3507e0a9b4Darrick J. Wong if (!dump_old) 43146272d5aa21fe879ca90a157485a2a3507e0a9b4Darrick J. Wong return; 432da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 433da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 434da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (dump_descriptors) { 435da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf (out_file, "Found expected sequence %u, " 436da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o "type %u (%s) at block %u\n", 437efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o sequence, blocktype, 438da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o type_to_name(blocktype), blocknr); 439da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 440efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 441da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o switch (blocktype) { 442da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o case JFS_DESCRIPTOR_BLOCK: 443efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o dump_descriptor_block(out_file, source, buf, jsb, 444da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o &blocknr, blocksize, 445da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o transaction); 446da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o continue; 447da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 448da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o case JFS_COMMIT_BLOCK: 449da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o transaction++; 450da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o blocknr++; 451da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o WRAP(jsb, blocknr); 452da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o continue; 453efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 454da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o case JFS_REVOKE_BLOCK: 455da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o dump_revoke_block(out_file, buf, jsb, 456efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o blocknr, blocksize, 457da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o transaction); 458da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o blocknr++; 459da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o WRAP(jsb, blocknr); 460da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o continue; 461da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 462da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o default: 463da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf (out_file, "Unexpected block type %u at " 464da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o "block %u.\n", blocktype, blocknr); 465da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return; 466da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 467da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 468da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o} 469da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 470df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'ostatic inline size_t journal_super_tag_bytes(journal_superblock_t *jsb) 471df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o{ 472df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o size_t sz; 473df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o 474df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o if (JSB_HAS_INCOMPAT_FEATURE(jsb, JFS_FEATURE_INCOMPAT_CSUM_V3)) 475df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o return sizeof(journal_block_tag3_t); 476df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o 477df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o sz = sizeof(journal_block_tag_t); 478df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o 479df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o if (JSB_HAS_INCOMPAT_FEATURE(jsb, JFS_FEATURE_INCOMPAT_CSUM_V2)) 480df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o sz += sizeof(__u16); 481df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o 482df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o if (JSB_HAS_INCOMPAT_FEATURE(jsb, JFS_FEATURE_INCOMPAT_64BIT)) 483df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o return sz; 484df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o 485df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o return sz - sizeof(__u32); 486df0b907ec1625b058814f42119c9a736f2c34c96Theodore Ts'o} 487da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 488efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'ostatic void dump_descriptor_block(FILE *out_file, 489efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o struct journal_source *source, 490da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o char *buf, 491efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o journal_superblock_t *jsb, 492da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o unsigned int *blockp, int blocksize, 493da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o tid_t transaction) 494da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o{ 49538d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong int offset, tag_size, csum_size = 0; 496da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o char *tagp; 497da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o journal_block_tag_t *tag; 498da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o unsigned int blocknr; 499da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o __u32 tag_block; 500da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o __u32 tag_flags; 501efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 50238d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong tag_size = journal_super_tag_bytes(jsb); 503da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o offset = sizeof(journal_header_t); 504da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o blocknr = *blockp; 505da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 50638d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong if (JSB_HAS_INCOMPAT_FEATURE(jsb, JFS_FEATURE_INCOMPAT_CSUM_V3) || 50738d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong JSB_HAS_INCOMPAT_FEATURE(jsb, JFS_FEATURE_INCOMPAT_CSUM_V2)) 50838d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong csum_size = sizeof(struct journal_block_tail); 50938d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong 510efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o if (dump_all) 511da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf(out_file, "Dumping descriptor block, sequence %u, at " 512da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o "block %u:\n", transaction, blocknr); 513efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 514da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o ++blocknr; 515da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o WRAP(jsb, blocknr); 516efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 517da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o do { 518efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o /* Work out the location of the current tag, and skip to 519da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o * the next one... */ 520da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o tagp = &buf[offset]; 521da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o tag = (journal_block_tag_t *) tagp; 52298446d738201df0dd24830eaf0781c7b4a26689aTheodore Ts'o offset += tag_size; 523da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 524da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o /* ... and if we have gone too far, then we've reached the 525da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o end of this block. */ 52638d5adf33993264d8db78ebb3d924e9d9e155590Darrick J. Wong if (offset > blocksize - csum_size) 527da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o break; 528efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 529da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o tag_block = be32_to_cpu(tag->t_blocknr); 5302556373a33c694a277ebd6e35d16384dff2dc692Darrick J. Wong tag_flags = be16_to_cpu(tag->t_flags); 531da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 532da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (!(tag_flags & JFS_FLAG_SAME_UUID)) 533da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o offset += 16; 534da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 535efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o dump_metadata_block(out_file, source, jsb, 53698446d738201df0dd24830eaf0781c7b4a26689aTheodore Ts'o blocknr, tag_block, tag_flags, blocksize, 537da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o transaction); 538da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 539da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o ++blocknr; 540da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o WRAP(jsb, blocknr); 541efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 542da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } while (!(tag_flags & JFS_FLAG_LAST_TAG)); 543efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 544da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o *blockp = blocknr; 545da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o} 546da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 547da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 548da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'ostatic void dump_revoke_block(FILE *out_file, char *buf, 549efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o journal_superblock_t *jsb EXT2FS_ATTR((unused)), 550efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o unsigned int blocknr, 551544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o int blocksize EXT2FS_ATTR((unused)), 552544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o tid_t transaction) 553da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o{ 554da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o int offset, max; 555da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o journal_revoke_header_t *header; 556a1ff15f83b3ab4b4f524cea48e149ec9be93908cDarrick J. Wong unsigned long long rblock; 557a1ff15f83b3ab4b4f524cea48e149ec9be93908cDarrick J. Wong int tag_size = sizeof(__u32); 558efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 559efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o if (dump_all) 560da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf(out_file, "Dumping revoke block, sequence %u, at " 561da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o "block %u:\n", transaction, blocknr); 562efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 563a1ff15f83b3ab4b4f524cea48e149ec9be93908cDarrick J. Wong if (be32_to_cpu(jsb->s_feature_incompat) & JFS_FEATURE_INCOMPAT_64BIT) 564a1ff15f83b3ab4b4f524cea48e149ec9be93908cDarrick J. Wong tag_size = sizeof(__u64); 565a1ff15f83b3ab4b4f524cea48e149ec9be93908cDarrick J. Wong 566da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o header = (journal_revoke_header_t *) buf; 567da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o offset = sizeof(journal_revoke_header_t); 568da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o max = be32_to_cpu(header->r_count); 569da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 570da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o while (offset < max) { 571a1ff15f83b3ab4b4f524cea48e149ec9be93908cDarrick J. Wong if (tag_size == sizeof(__u32)) { 572a1ff15f83b3ab4b4f524cea48e149ec9be93908cDarrick J. Wong __u32 *entry = (__u32 *) (buf + offset); 573a1ff15f83b3ab4b4f524cea48e149ec9be93908cDarrick J. Wong rblock = be32_to_cpu(*entry); 574a1ff15f83b3ab4b4f524cea48e149ec9be93908cDarrick J. Wong } else { 575a1ff15f83b3ab4b4f524cea48e149ec9be93908cDarrick J. Wong __u64 *entry = (__u64 *) (buf + offset); 576a1ff15f83b3ab4b4f524cea48e149ec9be93908cDarrick J. Wong rblock = ext2fs_be64_to_cpu(*entry); 577a1ff15f83b3ab4b4f524cea48e149ec9be93908cDarrick J. Wong } 578da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (dump_all || rblock == block_to_dump) { 579a1ff15f83b3ab4b4f524cea48e149ec9be93908cDarrick J. Wong fprintf(out_file, " Revoke FS block %llu", rblock); 580da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (dump_all) 581da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf(out_file, "\n"); 582da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o else 583da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf(out_file," at block %u, sequence %u\n", 584da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o blocknr, transaction); 585da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 586a1ff15f83b3ab4b4f524cea48e149ec9be93908cDarrick J. Wong offset += tag_size; 587da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 588da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o} 589da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 590da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 591da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'ostatic void show_extent(FILE *out_file, int start_extent, int end_extent, 592da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o __u32 first_block) 593da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o{ 594da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (start_extent >= 0 && first_block != 0) 595efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o fprintf(out_file, "(%d+%u): %u ", 596da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o start_extent, end_extent-start_extent, first_block); 597da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o} 598da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 5995e4f070952bb4472e28a925f591b551baf2db278Theodore Ts'ostatic void show_indirect(FILE *out_file, const char *name, __u32 where) 600da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o{ 601da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (where) 602da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf(out_file, "(%s): %u ", name, where); 603da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o} 604da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 605da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 606da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'ostatic void dump_metadata_block(FILE *out_file, struct journal_source *source, 607544349270e4c74a6feb971123884a8cf5052a7eeTheodore Ts'o journal_superblock_t *jsb EXT2FS_ATTR((unused)), 608efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o unsigned int log_blocknr, 609efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o unsigned int fs_blocknr, 61098446d738201df0dd24830eaf0781c7b4a26689aTheodore Ts'o unsigned int log_tag_flags, 611da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o int blocksize, 612da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o tid_t transaction) 613da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o{ 6145e4f070952bb4472e28a925f591b551baf2db278Theodore Ts'o int retval; 6155e4f070952bb4472e28a925f591b551baf2db278Theodore Ts'o char buf[8192]; 616efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 617da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (!(dump_all 618da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o || (fs_blocknr == block_to_dump) 619da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o || (fs_blocknr == inode_block_to_dump) 620da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o || (fs_blocknr == bitmap_to_dump))) 621da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return; 622efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 623da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf(out_file, " FS block %u logged at ", fs_blocknr); 624efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o if (!dump_all) 625da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf(out_file, "sequence %u, ", transaction); 62698446d738201df0dd24830eaf0781c7b4a26689aTheodore Ts'o fprintf(out_file, "journal block %u (flags 0x%x)\n", log_blocknr, 62798446d738201df0dd24830eaf0781c7b4a26689aTheodore Ts'o log_tag_flags); 628efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 629da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o /* There are two major special cases to parse: 630efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * 631da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o * If this block is a block 632da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o * bitmap block, we need to give it special treatment so that we 633da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o * can log any allocates and deallocates which affect the 634efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * block_to_dump query block. 635efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * 636da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o * If the block is an inode block for the inode being searched 637da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o * for, then we need to dump the contents of that inode 638efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * structure symbolically. 639da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o */ 640efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 641da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (!(dump_contents && dump_all) 642da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o && fs_blocknr != block_to_dump 643efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o && fs_blocknr != bitmap_to_dump 644da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o && fs_blocknr != inode_block_to_dump) 645da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return; 646efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 647efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o retval = read_journal_block("logdump", source, 6485eca88c1dcb1b378997d2a38699856624a1681e4Theodore Ts'o ((ext2_loff_t) log_blocknr) * blocksize, 649b34b94d5cd500e0369f0af43b21ab6af890e531dTheodore Ts'o buf, blocksize); 650da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (retval) 651da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o return; 652efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 653da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (fs_blocknr == bitmap_to_dump) { 654da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o struct ext2_super_block *super; 655da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o int offset; 656efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 657da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o super = current_fs->super; 658de2c477815dc6c842db60ef9187c7fddaaa3cd48Theodore Ts'o offset = ((block_to_dump - super->s_first_data_block) % 659da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o super->s_blocks_per_group); 660efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 6614dbfd79d1458ce1259b951377e341aeb6197f8c1Darrick J. Wong fprintf(out_file, " (block bitmap for block %llu: " 662efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o "block is %s)\n", 663da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o block_to_dump, 664da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o ext2fs_test_bit(offset, buf) ? "SET" : "CLEAR"); 665da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 666efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 667da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (fs_blocknr == inode_block_to_dump) { 668da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o struct ext2_inode *inode; 669da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o int first, prev, this, start_extent, i; 670efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 671da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf(out_file, " (inode block for inode %u):\n", 672da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o inode_to_dump); 673efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 674da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o inode = (struct ext2_inode *) (buf + inode_offset_to_dump); 675da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o internal_dump_inode(out_file, " ", inode_to_dump, inode, 0); 676efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 677da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o /* Dump out the direct/indirect blocks here: 678da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o * internal_dump_inode can only dump them from the main 679da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o * on-disk inode, not from the journaled copy of the 680da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o * inode. */ 681efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 682da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf (out_file, " Blocks: "); 6835e4f070952bb4472e28a925f591b551baf2db278Theodore Ts'o first = prev = start_extent = -1; 684da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 685da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o for (i=0; i<EXT2_NDIR_BLOCKS; i++) { 686da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o this = inode->i_block[i]; 687da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (start_extent >= 0 && this == prev+1) { 688da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o prev = this; 689da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o continue; 690da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } else { 691da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o show_extent(out_file, start_extent, i, first); 692da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o start_extent = i; 693da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o first = prev = this; 694da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 695da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 696da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o show_extent(out_file, start_extent, i, first); 697da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o show_indirect(out_file, "IND", inode->i_block[i++]); 698da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o show_indirect(out_file, "DIND", inode->i_block[i++]); 699da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o show_indirect(out_file, "TIND", inode->i_block[i++]); 700efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 701da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf(out_file, "\n"); 702da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 703da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 704da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (dump_contents) 705da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o do_hexdump(out_file, buf, blocksize); 706efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 707da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o} 708da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 709da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'ostatic void do_hexdump (FILE *out_file, char *buf, int blocksize) 710da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o{ 711da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o int i,j; 712da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o int *intp; 713da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o char *charp; 714da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o unsigned char c; 715efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 716da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o intp = (int *) buf; 717da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o charp = (char *) buf; 718efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o 719da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o for (i=0; i<blocksize; i+=16) { 720da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf(out_file, " %04x: ", i); 721da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o for (j=0; j<16; j+=4) 722da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf(out_file, "%08x ", *intp++); 723da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o for (j=0; j<16; j++) { 724da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o c = *charp++; 725da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o if (c < ' ' || c >= 127) 726da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o c = '.'; 727da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf(out_file, "%c", c); 728da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 729da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o fprintf(out_file, "\n"); 730da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o } 731da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o} 732da81e3fcfe075922e995a1c5f1efded5768d519aTheodore Ts'o 733