554
static int int_log10(unsigned long long arg)
566
#define DUMP_LEAF_EXTENTS 0x01
567
#define DUMP_NODE_EXTENTS 0x02
568
#define DUMP_EXTENT_TABLE 0x04
570
static void dump_extents(FILE *f, const char *prefix, ext2_ino_t ino,
571
int flags, int logical_width, int physical_width)
573
ext2_extent_handle_t handle;
574
struct ext2fs_extent extent;
575
struct ext2_extent_info info;
576
int op = EXT2_EXTENT_ROOT;
577
unsigned int printed = 0;
580
errcode = ext2fs_extent_open(current_fs, ino, &handle);
584
if (flags & DUMP_EXTENT_TABLE)
585
fprintf(f, "Level Entries %*s %*s Length Flags\n",
586
(logical_width*2)+3, "Logical",
587
(physical_width*2)+3, "Physical");
589
fprintf(f, "%sEXTENTS:\n%s", prefix, prefix);
592
errcode = ext2fs_extent_get(handle, op, &extent);
597
op = EXT2_EXTENT_NEXT;
599
if (extent.e_flags & EXT2_EXTENT_FLAGS_SECOND_VISIT)
602
if (extent.e_flags & EXT2_EXTENT_FLAGS_LEAF) {
603
if ((flags & DUMP_LEAF_EXTENTS) == 0)
606
if ((flags & DUMP_NODE_EXTENTS) == 0)
610
errcode = ext2fs_extent_get_info(handle, &info);
614
if (!(extent.e_flags & EXT2_EXTENT_FLAGS_LEAF)) {
615
if (extent.e_flags & EXT2_EXTENT_FLAGS_SECOND_VISIT)
618
if (flags & DUMP_EXTENT_TABLE) {
619
fprintf(f, "%2d/%2d %3d/%3d %*llu - %*llu "
621
info.curr_level, info.max_depth,
622
info.curr_entry, info.num_entries,
626
extent.e_lblk + (extent.e_len - 1),
629
physical_width+3, "", extent.e_len);
633
fprintf(f, "%s(NODE #%d, %lld-%lld, blk %lld)",
637
extent.e_lblk + (extent.e_len - 1),
643
if (flags & DUMP_EXTENT_TABLE) {
644
fprintf(f, "%2d/%2d %3d/%3d %*llu - %*llu "
645
"%*llu - %*llu %6u %s\n",
646
info.curr_level, info.max_depth,
647
info.curr_entry, info.num_entries,
651
extent.e_lblk + (extent.e_len - 1),
655
extent.e_pblk + (extent.e_len - 1),
657
extent.e_flags & EXT2_EXTENT_FLAGS_UNINIT ?
662
if (extent.e_len == 0)
664
else if (extent.e_len == 1)
669
extent.e_flags & EXT2_EXTENT_FLAGS_UNINIT ?
674
"%s(%lld-%lld%s): %lld-%lld",
677
extent.e_lblk + (extent.e_len - 1),
678
extent.e_flags & EXT2_EXTENT_FLAGS_UNINIT ?
681
extent.e_pblk + (extent.e_len - 1));
555
688
void internal_dump_inode(FILE *out, const char *prefix,
556
689
ext2_ino_t inode_num, struct ext2_inode *inode,
672
805
fprintf(out, "%sDevice major/minor number: %02d:%02d (hex %02x:%02x)\n",
673
806
devnote, major, minor, major, minor);
807
} else if (do_dump_blocks) {
808
if (inode->i_flags & EXT4_EXTENTS_FL)
809
dump_extents(out, prefix, inode_num,
810
DUMP_LEAF_EXTENTS, 0, 0);
812
dump_blocks(out, prefix, inode_num);
675
else if (do_dump_blocks)
676
dump_blocks(out, prefix, inode_num);
679
816
static void dump_inode(ext2_ino_t inode_num, struct ext2_inode *inode)
856
void do_dump_extents(int argc, char *argv[])
858
struct ext2_inode inode;
866
while ((c = getopt(argc, argv, "nl")) != EOF) {
869
flags |= DUMP_NODE_EXTENTS;
872
flags |= DUMP_LEAF_EXTENTS;
877
if (argc != optind+1) {
879
com_err(0, 0, "Usage: dump_extents [-n] [-l] file");
884
flags = DUMP_NODE_EXTENTS | DUMP_LEAF_EXTENTS;
885
flags |= DUMP_EXTENT_TABLE;
887
if (check_fs_open(argv[0]))
890
ino = string_to_inode(argv[optind]);
894
if (debugfs_read_inode(ino, &inode, argv[0]))
897
if ((inode.i_flags & EXT4_EXTENTS_FL) == 0) {
898
fprintf(stderr, "%s: does not uses extent block maps\n",
903
logical_width = int_log10(((inode.i_size |
904
(__u64) inode.i_size_high << 32) +
905
current_fs->blocksize - 1) /
906
current_fs->blocksize) + 1;
907
if (logical_width < 5)
909
physical_width = int_log10(current_fs->super->s_blocks_count) + 1;
910
if (physical_width < 5)
914
dump_extents(out, "", ino, flags, logical_width, physical_width);
719
919
void do_chroot(int argc, char *argv[])
721
921
ext2_ino_t inode;