Whamcloud - gitweb
dumpe2fs: print the expected block group checksum if it is incorrect
authorTheodore Ts'o <tytso@mit.edu>
Thu, 15 Mar 2012 16:13:25 +0000 (12:13 -0400)
committerTheodore Ts'o <tytso@mit.edu>
Thu, 15 Mar 2012 16:13:25 +0000 (12:13 -0400)
This helps to diagnose problems caused by incorrect block group
checksums.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
debian/e2fslibs.symbols
lib/ext2fs/csum.c
lib/ext2fs/ext2fs.h
misc/dumpe2fs.c

index 8c5c2f5..c3753c9 100644 (file)
@@ -259,6 +259,7 @@ libext2fs.so.2 e2fslibs #MINVER#
  ext2fs_get_pathname@Base 1.37
  ext2fs_get_rec_len@Base 1.41.7
  ext2fs_group_blocks_count@Base 1.42
+ ext2fs_group_desc_csum@Base 1.42.2
  ext2fs_group_desc@Base 1.42
  ext2fs_group_desc_csum_set@Base 1.41.0
  ext2fs_group_desc_csum_verify@Base 1.41.0
index 596923e..9fa3f24 100644 (file)
@@ -30,7 +30,7 @@
 #define STATIC static
 #endif
 
-STATIC __u16 ext2fs_group_desc_csum(ext2_filsys fs, dgrp_t group)
+__u16 ext2fs_group_desc_csum(ext2_filsys fs, dgrp_t group)
 {
        __u16 crc = 0;
        struct ext2_group_desc *desc;
index 682f0cd..4e7711a 100644 (file)
@@ -947,6 +947,7 @@ extern __u32 ext2fs_crc32c_le(__u32 crc, unsigned char const *p, size_t len);
 extern void ext2fs_group_desc_csum_set(ext2_filsys fs, dgrp_t group);
 extern int ext2fs_group_desc_csum_verify(ext2_filsys fs, dgrp_t group);
 extern errcode_t ext2fs_set_gdt_csum(ext2_filsys fs);
+extern __u16 ext2fs_group_desc_csum(ext2_filsys fs, dgrp_t group);
 
 /* dblist.c */
 
index 5b114e9..7b7e3fe 100644 (file)
@@ -190,10 +190,16 @@ static void list_desc (ext2_filsys fs)
                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 %u\n"),
-                              ext2fs_bg_checksum(fs, i),
+               if (fs->super->s_feature_ro_compat & EXT4_FEATURE_RO_COMPAT_GDT_CSUM) {
+                       unsigned csum = ext2fs_bg_checksum(fs, i);
+                       unsigned exp_csum = ext2fs_group_desc_csum(fs, i);
+
+                       printf(_("  Checksum 0x%04x"), csum);
+                       if (csum != exp_csum)
+                               printf(_(" (EXPECTED 0x%04x)"), exp_csum);
+                       printf(_(", unused inodes %u\n"),
                               ext2fs_bg_itable_unused(fs, i));
+               }
                has_super = ((i==0) || super_blk);
                if (has_super) {
                        printf (_("  %s superblock at "),