X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=misc%2Fdumpe2fs.c;h=c01ffe55a3917f93f2a20e79e70ea76db77b97a1;hb=829d9994880394e48c883510799b1536812d6efb;hp=9ef5476998aad3e9ec9af77d8d75ec88b3a797ed;hpb=efc6f628e15de95bcd13e4f0ee223cb42115d520;p=tools%2Fe2fsprogs.git diff --git a/misc/dumpe2fs.c b/misc/dumpe2fs.c index 9ef5476..c01ffe5 100644 --- a/misc/dumpe2fs.c +++ b/misc/dumpe2fs.c @@ -50,8 +50,8 @@ int hex_format = 0; static void usage(void) { - fprintf (stderr, _("Usage: %s [-bfhixV] [-ob superblock] " - "[-oB blocksize] device\n"), program_name); + fprintf (stderr, _("Usage: %s [-bfhixV] [-o superblock=] " + "[-o blocksize=] device\n"), program_name); exit (1); } @@ -63,12 +63,12 @@ static void print_number(unsigned long num) printf("%lu", num); } -static void print_range(unsigned long a, unsigned long b) +static void print_range(unsigned long long a, unsigned long long b) { if (hex_format) - printf("0x%04lx-0x%04lx", a, b); + printf("0x%llx-0x%llx", a, b); else - printf("%lu-%lu", a, b); + printf("%llu-%llu", a, b); } static void print_free (unsigned long group, char * bitmap, @@ -113,7 +113,7 @@ static void print_bg_opts(ext2_filsys fs, dgrp_t i) int first = 1, bg_flags = 0; if (fs->super->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_GDT_CSUM) - bg_flags = fs->group_desc[i].bg_flags; + bg_flags = ext2fs_bg_flags(fs, i); print_bg_opt(bg_flags, EXT2_BG_INODE_UNINIT, "INODE_UNINIT", &first); @@ -126,17 +126,31 @@ static void print_bg_opts(ext2_filsys fs, dgrp_t i) fputc('\n', stdout); } +static void print_bg_rel_offset(ext2_filsys fs, blk64_t block, int itable, + blk64_t first_block, blk64_t last_block) +{ + if ((block >= first_block) && (block <= last_block)) { + if (itable && block == first_block) + return; + printf(" (+%u)", (unsigned)(block - first_block)); + } else if (fs->super->s_feature_incompat & + EXT4_FEATURE_INCOMPAT_FLEX_BG) { + dgrp_t flex_grp = ext2fs_group_of_blk(fs, block); + printf(" (bg #%u + %u)", flex_grp, + (unsigned)(block-ext2fs_group_first_block(fs,flex_grp))); + } +} + static void list_desc (ext2_filsys fs) { unsigned long i; - long diff; - blk_t first_block, last_block; - blk_t super_blk, old_desc_blk, new_desc_blk; + blk64_t first_block, last_block; + blk64_t super_blk, old_desc_blk, new_desc_blk; char *block_bitmap=NULL, *inode_bitmap=NULL; int inode_blocks_per_group, old_desc_blocks, reserved_gdt; int block_nbytes, inode_nbytes; int has_super; - blk_t blk_itr = fs->super->s_first_data_block; + blk64_t blk_itr = fs->super->s_first_data_block; ext2_ino_t ino_itr = 1; block_nbytes = EXT2_BLOCKS_PER_GROUP(fs->super) / 8; @@ -159,20 +173,20 @@ static void list_desc (ext2_filsys fs) else old_desc_blocks = fs->desc_blocks; for (i = 0; i < fs->group_desc_count; i++) { - first_block = ext2fs_group_first_block(fs, i); - last_block = ext2fs_group_last_block(fs, i); + first_block = ext2fs_group_first_block2(fs, i); + last_block = ext2fs_group_last_block2(fs, i); - ext2fs_super_and_bgd_loc(fs, i, &super_blk, - &old_desc_blk, &new_desc_blk, 0); + ext2fs_super_and_bgd_loc2(fs, i, &super_blk, + &old_desc_blk, &new_desc_blk, 0); printf (_("Group %lu: (Blocks "), i); print_range(first_block, last_block); fputs(")", stdout); print_bg_opts(fs, i); if (fs->super->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_GDT_CSUM) - printf(_(" Checksum 0x%04x, unused inodes %d\n"), - fs->group_desc[i].bg_checksum, - fs->group_desc[i].bg_itable_unused); + printf(_(" Checksum 0x%04x, unused inodes %u\n"), + ext2fs_bg_checksum(fs, i), + ext2fs_bg_itable_unused(fs, i)); has_super = ((i==0) || super_blk); if (has_super) { printf (_(" %s superblock at "), @@ -198,34 +212,31 @@ static void list_desc (ext2_filsys fs) if (has_super) fputc('\n', stdout); fputs(_(" Block bitmap at "), stdout); - print_number(fs->group_desc[i].bg_block_bitmap); - diff = fs->group_desc[i].bg_block_bitmap - first_block; - if (diff >= 0) - printf(" (+%ld)", diff); + print_number(ext2fs_block_bitmap_loc(fs, i)); + print_bg_rel_offset(fs, ext2fs_block_bitmap_loc(fs, i), 0, + first_block, last_block); fputs(_(", Inode bitmap at "), stdout); - print_number(fs->group_desc[i].bg_inode_bitmap); - diff = fs->group_desc[i].bg_inode_bitmap - first_block; - if (diff >= 0) - printf(" (+%ld)", diff); + print_number(ext2fs_inode_bitmap_loc(fs, i)); + print_bg_rel_offset(fs, ext2fs_inode_bitmap_loc(fs, i), 0, + first_block, last_block); fputs(_("\n Inode table at "), stdout); - print_range(fs->group_desc[i].bg_inode_table, - fs->group_desc[i].bg_inode_table + + print_range(ext2fs_inode_table_loc(fs, i), + ext2fs_inode_table_loc(fs, i) + inode_blocks_per_group - 1); - diff = fs->group_desc[i].bg_inode_table - first_block; - if (diff > 0) - printf(" (+%ld)", diff); + print_bg_rel_offset(fs, ext2fs_inode_table_loc(fs, i), 1, + first_block, last_block); printf (_("\n %u free blocks, %u free inodes, " "%u directories%s"), - fs->group_desc[i].bg_free_blocks_count, - fs->group_desc[i].bg_free_inodes_count, - fs->group_desc[i].bg_used_dirs_count, - fs->group_desc[i].bg_itable_unused ? "" : "\n"); - if (fs->group_desc[i].bg_itable_unused) + ext2fs_bg_free_blocks_count(fs, i), + ext2fs_bg_free_inodes_count(fs, i), + ext2fs_bg_used_dirs_count(fs, i), + ext2fs_bg_itable_unused(fs, i) ? "" : "\n"); + if (ext2fs_bg_itable_unused(fs, i)) printf (_(", %u unused inodes\n"), - fs->group_desc[i].bg_itable_unused); + ext2fs_bg_itable_unused(fs, i)); if (block_bitmap) { fputs(_(" Free blocks: "), stdout); - ext2fs_get_block_bitmap_range(fs->block_map, + ext2fs_get_block_bitmap_range2(fs->block_map, blk_itr, block_nbytes << 3, block_bitmap); print_free (i, block_bitmap, fs->super->s_blocks_per_group, @@ -235,7 +246,7 @@ static void list_desc (ext2_filsys fs) } if (inode_bitmap) { fputs(_(" Free inodes: "), stdout); - ext2fs_get_inode_bitmap_range(fs->inode_map, + ext2fs_get_inode_bitmap_range2(fs->inode_map, ino_itr, inode_nbytes << 3, inode_bitmap); print_free (i, inode_bitmap, fs->super->s_inodes_per_group, 1); @@ -243,6 +254,10 @@ static void list_desc (ext2_filsys fs) ino_itr += fs->super->s_inodes_per_group; } } + if (block_bitmap) + free(block_bitmap); + if (inode_bitmap) + free(inode_bitmap); } static void list_bad_blocks(ext2_filsys fs, int dump) @@ -277,14 +292,19 @@ static void list_bad_blocks(ext2_filsys fs, int dump) ext2fs_badblocks_list_iterate_end(bb_iter); if (!dump) fputc('\n', stdout); + ext2fs_badblocks_list_free(bb_list); } static void print_inline_journal_information(ext2_filsys fs) { + journal_superblock_t *jsb; struct ext2_inode inode; + ext2_file_t journal_file; errcode_t retval; ino_t ino = fs->super->s_journal_inum; - int size; + char buf[1024]; + __u32 *mask_ptr, mask, m; + int i, j, size, printed = 0; retval = ext2fs_read_inode(fs, ino, &inode); if (retval) { @@ -292,6 +312,38 @@ static void print_inline_journal_information(ext2_filsys fs) _("while reading journal inode")); exit(1); } + retval = ext2fs_file_open2(fs, ino, &inode, 0, &journal_file); + if (retval) { + com_err(program_name, retval, + _("while opening journal inode")); + exit(1); + } + retval = ext2fs_file_read(journal_file, buf, sizeof(buf), 0); + if (retval) { + com_err(program_name, retval, + _("while reading journal super block")); + exit(1); + } + ext2fs_file_close(journal_file); + jsb = (journal_superblock_t *) buf; + if (be32_to_cpu(jsb->s_header.h_magic) != JFS_MAGIC_NUMBER) { + fprintf(stderr, + "Journal superblock magic number invalid!\n"); + exit(1); + } + printf(_("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 ((fs->super->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_HUGE_FILE) && @@ -303,6 +355,12 @@ static void print_inline_journal_information(ext2_filsys fs) 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)); } static void print_journal_information(ext2_filsys fs) @@ -314,7 +372,7 @@ static void print_journal_information(ext2_filsys fs) journal_superblock_t *jsb; /* Get the journal superblock */ - if ((retval = io_channel_read_blk(fs->io, fs->super->s_first_data_block+1, -1024, buf))) { + if ((retval = io_channel_read_blk64(fs->io, fs->super->s_first_data_block+1, -1024, buf))) { com_err(program_name, retval, _("while reading journal superblock")); exit(1); @@ -346,7 +404,7 @@ static void print_journal_information(ext2_filsys fs) } } -static void parse_extended_opts(const char *opts, blk_t *superblock, +static void parse_extended_opts(const char *opts, blk64_t *superblock, int *blocksize) { char *buf, *token, *next, *p, *arg, *badopt = 0; @@ -428,7 +486,7 @@ int main (int argc, char ** argv) errcode_t retval; ext2_filsys fs; int print_badblocks = 0; - blk_t use_superblock = 0; + blk64_t use_superblock = 0; int use_blocksize = 0; int image_dump = 0; int force = 0; @@ -481,7 +539,7 @@ int main (int argc, char ** argv) if (optind > argc - 1) usage(); device_name = argv[optind++]; - flags = EXT2_FLAG_JOURNAL_DEV_OK | EXT2_FLAG_SOFTSUPP_FEATURES; + flags = EXT2_FLAG_JOURNAL_DEV_OK | EXT2_FLAG_SOFTSUPP_FEATURES | EXT2_FLAG_64BITS; if (force) flags |= EXT2_FLAG_FORCE; if (image_dump) @@ -517,8 +575,9 @@ int main (int argc, char ** argv) ext2fs_close(fs); exit(0); } - if (fs->super->s_feature_compat & - EXT3_FEATURE_COMPAT_HAS_JOURNAL) + if ((fs->super->s_feature_compat & + EXT3_FEATURE_COMPAT_HAS_JOURNAL) && + (fs->super->s_journal_inum != 0)) print_inline_journal_information(fs); list_bad_blocks(fs, 0); if (header_only) {