Whamcloud - gitweb
[COVERITY] Allow blkid_dev_has_tag to check if a tag exists when value==NULL
[tools/e2fsprogs.git] / misc / dumpe2fs.c
index 73042fa..fcae0f0 100644 (file)
@@ -46,8 +46,7 @@ extern int optind;
 
 const char * program_name = "dumpe2fs";
 char * device_name = NULL;
-const char *num_format = "%lu";
-char range_format[16];
+int hex_format = 0;
 
 static void usage(void)
 {
@@ -56,9 +55,20 @@ static void usage(void)
        exit (1);
 }
 
-static void print_number (unsigned long num)
+static void print_number(unsigned long num)
 {
-       printf(num_format, num);
+       if (hex_format) 
+               printf("0x%04lx", num);
+       else
+               printf("%lu", num);
+}
+
+static void print_range(unsigned long a, unsigned long b)
+{
+       if (hex_format) 
+               printf("0x%04lx-0x%04lx", a, b);
+       else
+               printf("%lu-%lu", a, b);
 }
 
 static void print_free (unsigned long group, char * bitmap,
@@ -86,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;
@@ -107,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);
-               printf(range_format, 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 "),
@@ -129,14 +171,13 @@ static void list_desc (ext2_filsys fs)
                }
                if (old_desc_blk) {
                        printf(_(", Group descriptors at "));
-                       printf(range_format, old_desc_blk,
-                              old_desc_blk + old_desc_blocks - 1);
+                       print_range(old_desc_blk, 
+                                   old_desc_blk + old_desc_blocks - 1);
                        if (reserved_gdt) {
                                printf(_("\n  Reserved GDT blocks at "));
-                               printf(range_format, 
-                                      old_desc_blk + old_desc_blocks,
-                                      old_desc_blk + old_desc_blocks + 
-                                      reserved_gdt - 1);
+                               print_range(old_desc_blk + old_desc_blocks,
+                                           old_desc_blk + old_desc_blocks + 
+                                           reserved_gdt - 1);
                        }
                } else if (new_desc_blk) {
                        fputc(has_super ? ',' : ' ', stdout);
@@ -148,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);
-               printf(range_format, 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;
+               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 - first_block;
                if (diff > 0)
                        printf(" (+%ld)", diff);
                printf (_("\n  %d free blocks, %d free inodes, "
@@ -183,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;
        }
 }
 
@@ -197,7 +237,7 @@ static void list_bad_blocks(ext2_filsys fs, int dump)
 
        retval = ext2fs_read_bb_inode(fs, &bb_list);
        if (retval) {
-               com_err("ext2fs_read_bb_inode", retval, "");
+               com_err("ext2fs_read_bb_inode", retval, 0);
                return;
        }
        retval = ext2fs_badblocks_list_iterate_begin(bb_list, &bb_iter);
@@ -207,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);
@@ -221,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;
@@ -244,20 +305,20 @@ 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);
                printf(i ? "                          %s\n"
-                      : "Journal users:            %s\n",
+                      : _("Journal users:            %s\n"),
                       str);
        }
 }
@@ -282,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)
@@ -316,7 +377,7 @@ int main (int argc, char ** argv)
                                error_message(EXT2_ET_BASE));
                        exit(0);
                case 'x':
-                       num_format = "0x%04x";
+                       hex_format++;
                        break;
                default:
                        usage();
@@ -324,11 +385,10 @@ int main (int argc, char ** argv)
        }
        if (optind > argc - 1)
                usage();
-       sprintf(range_format, "%s-%s", num_format, num_format);
        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)
@@ -358,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);
@@ -372,5 +435,6 @@ int main (int argc, char ** argv)
                }
        }
        ext2fs_close (fs);
+       remove_error_table(&et_ext2_error_table);
        exit (0);
 }