Whamcloud - gitweb
[COVERITY] Allow blkid_dev_has_tag to check if a tag exists when value==NULL
[tools/e2fsprogs.git] / misc / dumpe2fs.c
index c24dccf..fcae0f0 100644 (file)
@@ -96,11 +96,41 @@ static void print_free (unsigned long group, char * bitmap,
                }
 }
 
+static void print_bg_opt(int bg_flags, int mask,
+                         const char *str, int *first)
+{
+       if (bg_flags & mask) {
+               if (*first) {
+                       fputs(" [", stdout);
+                       *first = 0;
+               } else
+                       fputs(", ", stdout);
+               fputs(str, stdout);
+       }
+}
+static void print_bg_opts(ext2_filsys fs, dgrp_t i)
+{
+       int first = 1, bg_flags;
+
+       if (fs->super->s_feature_compat & EXT2_FEATURE_COMPAT_LAZY_BG)
+               bg_flags = fs->group_desc[i].bg_flags;
+       else
+               bg_flags = 0;
+
+       print_bg_opt(bg_flags, EXT2_BG_INODE_UNINIT, "Inode not init",
+                    &first);
+       print_bg_opt(bg_flags, EXT2_BG_BLOCK_UNINIT, "Block not init",
+                    &first);
+       if (!first)
+               fputc(']', stdout);
+       fputc('\n', stdout);
+}
+
 static void list_desc (ext2_filsys fs)
 {
        unsigned long i;
        long diff;
-       blk_t   group_blk, next_blk;
+       blk_t   first_block, last_block;
        blk_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;
@@ -117,20 +147,22 @@ static void list_desc (ext2_filsys fs)
                                 EXT2_BLOCK_SIZE(fs->super);
        reserved_gdt = fs->super->s_reserved_gdt_blocks;
        fputc('\n', stdout);
-       group_blk = fs->super->s_first_data_block;
+       first_block = fs->super->s_first_data_block;
        if (fs->super->s_feature_incompat & EXT2_FEATURE_INCOMPAT_META_BG)
                old_desc_blocks = fs->super->s_first_meta_bg;
        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);
+
                ext2fs_super_and_bgd_loc(fs, i, &super_blk, 
                                         &old_desc_blk, &new_desc_blk, 0);
-               next_blk = group_blk + fs->super->s_blocks_per_group;
-               if (next_blk > fs->super->s_blocks_count)
-                       next_blk = fs->super->s_blocks_count;
+
                printf (_("Group %lu: (Blocks "), i);
-               print_range(group_blk, next_blk - 1);
-               fputs(")\n", stdout);
+               print_range(first_block, last_block);
+               fputs(")", stdout);
+               print_bg_opts(fs, i);
                has_super = ((i==0) || super_blk);
                if (has_super) {
                        printf (_("  %s superblock at "),
@@ -157,19 +189,19 @@ static void list_desc (ext2_filsys fs)
                        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 - group_blk;
+               diff = fs->group_desc[i].bg_block_bitmap - first_block;
                if (diff >= 0)
                        printf(" (+%ld)", diff);
                fputs(_(", Inode bitmap at "), stdout);
                print_number(fs->group_desc[i].bg_inode_bitmap);
-               diff = fs->group_desc[i].bg_inode_bitmap - group_blk;
+               diff = fs->group_desc[i].bg_inode_bitmap - first_block;
                if (diff >= 0)
                        printf(" (+%ld)", diff);
                fputs(_("\n  Inode table at "), stdout);
                print_range(fs->group_desc[i].bg_inode_table,
                            fs->group_desc[i].bg_inode_table +
                            inode_blocks_per_group - 1);
-               diff = fs->group_desc[i].bg_inode_table - group_blk;
+               diff = fs->group_desc[i].bg_inode_table - first_block;
                if (diff > 0)
                        printf(" (+%ld)", diff);
                printf (_("\n  %d free blocks, %d free inodes, "
@@ -192,7 +224,6 @@ static void list_desc (ext2_filsys fs)
                        fputc('\n', stdout);
                        inode_bitmap += fs->super->s_inodes_per_group / 8;
                }
-               group_blk = next_blk;
        }
 }
 
@@ -216,10 +247,10 @@ static void list_bad_blocks(ext2_filsys fs, int dump)
                return;
        }
        if (dump) {
-               header = fmt = "%d\n";
+               header = fmt = "%u\n";
        } else {
-               header =  _("Bad blocks: %d");
-               fmt = ", %d";
+               header =  _("Bad blocks: %u");
+               fmt = ", %u";
        }
        while (ext2fs_badblocks_list_iterate(bb_iter, &blk)) {
                printf(header ? header : fmt, blk);
@@ -230,6 +261,27 @@ static void list_bad_blocks(ext2_filsys fs, int dump)
                fputc('\n', stdout);
 }
 
+static void print_inline_journal_information(ext2_filsys fs)
+{
+       struct ext2_inode       inode;
+       errcode_t               retval;
+       ino_t                   ino = fs->super->s_journal_inum;
+       int                     size;
+       
+       retval = ext2fs_read_inode(fs, ino,  &inode);
+       if (retval) {
+               com_err(program_name, retval,
+                       _("while reading journal inode"));
+               exit(1);
+       }
+       fputs(_("Journal size:             "), stdout);
+       size = inode.i_blocks >> 1;
+       if (size < 8192)
+               printf("%uk\n", size);
+       else
+               printf("%uM\n", size >> 10);
+}
+
 static void print_journal_information(ext2_filsys fs)
 {
        errcode_t       retval;
@@ -253,15 +305,15 @@ static void print_journal_information(ext2_filsys fs)
                exit(1);
        }
 
-       printf(_("\nJournal block size:       %d\n"
-                "Journal length:           %d\n"
-                "Journal first block:      %d\n"
+       printf(_("\nJournal block size:       %u\n"
+                "Journal length:           %u\n"
+                "Journal first block:      %u\n"
                 "Journal sequence:         0x%08x\n"
-                "Journal start:            %d\n"
-                "Journal number of users:  %d\n"),
-              ntohl(jsb->s_blocksize),  ntohl(jsb->s_maxlen),
-              ntohl(jsb->s_first), ntohl(jsb->s_sequence),
-              ntohl(jsb->s_start), ntohl(jsb->s_nr_users));
+                "Journal start:            %u\n"
+                "Journal number of users:  %u\n"),
+              (unsigned int)ntohl(jsb->s_blocksize),  (unsigned int)ntohl(jsb->s_maxlen),
+              (unsigned int)ntohl(jsb->s_first), (unsigned int)ntohl(jsb->s_sequence),
+              (unsigned int)ntohl(jsb->s_start), (unsigned int)ntohl(jsb->s_nr_users));
 
        for (i=0; i < ntohl(jsb->s_nr_users); i++) {
                uuid_unparse(&jsb->s_users[i*16], str);
@@ -291,7 +343,7 @@ int main (int argc, char ** argv)
        bindtextdomain(NLS_CAT_NAME, LOCALEDIR);
        textdomain(NLS_CAT_NAME);
 #endif
-       initialize_ext2_error_table();
+       add_error_table(&et_ext2_error_table);
        fprintf (stderr, "dumpe2fs %s (%s)\n", E2FSPROGS_VERSION,
                 E2FSPROGS_DATE);
        if (argc && *argv)
@@ -336,7 +388,7 @@ int main (int argc, char ** argv)
        device_name = argv[optind++];
        if (use_superblock && !use_blocksize)
                use_blocksize = 1024;
-       flags = EXT2_FLAG_JOURNAL_DEV_OK;
+       flags = EXT2_FLAG_JOURNAL_DEV_OK | EXT2_FLAG_SOFTSUPP_FEATURES;
        if (force)
                flags |= EXT2_FLAG_FORCE;
        if (image_dump)
@@ -366,6 +418,9 @@ int main (int argc, char ** argv)
                        ext2fs_close(fs);
                        exit(0);
                }
+               if (fs->super->s_feature_compat &
+                     EXT3_FEATURE_COMPAT_HAS_JOURNAL)
+                       print_inline_journal_information(fs);
                list_bad_blocks(fs, 0);
                if (header_only) {
                        ext2fs_close (fs);
@@ -380,5 +435,6 @@ int main (int argc, char ** argv)
                }
        }
        ext2fs_close (fs);
+       remove_error_table(&et_ext2_error_table);
        exit (0);
 }