static void usage(void)
{
- fprintf (stderr, _("Usage: %s [-bfhixV] [-ob superblock] "
- "[-oB blocksize] device\n"), program_name);
+ fprintf (stderr, _("Usage: %s [-bfhixV] [-o superblock=<num>] "
+ "[-o blocksize=<num>] device\n"), program_name);
exit (1);
}
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,
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);
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;
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 "),
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,
}
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);
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)
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) {
_("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) &&
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)
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);
}
}
-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;
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;
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)
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) {