From 87141781aabb4dc01359428d2feecdc7f43eeac0 Mon Sep 17 00:00:00 2001 From: Theodore Ts'o Date: Thu, 15 Mar 2012 12:13:25 -0400 Subject: [PATCH] dumpe2fs: print the expected block group checksum if it is incorrect This helps to diagnose problems caused by incorrect block group checksums. Signed-off-by: "Theodore Ts'o" --- debian/e2fslibs.symbols | 1 + lib/ext2fs/csum.c | 2 +- lib/ext2fs/ext2fs.h | 1 + misc/dumpe2fs.c | 12 +++++++++--- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/debian/e2fslibs.symbols b/debian/e2fslibs.symbols index 8c5c2f5d..c3753c96 100644 --- a/debian/e2fslibs.symbols +++ b/debian/e2fslibs.symbols @@ -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 diff --git a/lib/ext2fs/csum.c b/lib/ext2fs/csum.c index 596923e5..9fa3f24f 100644 --- a/lib/ext2fs/csum.c +++ b/lib/ext2fs/csum.c @@ -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; diff --git a/lib/ext2fs/ext2fs.h b/lib/ext2fs/ext2fs.h index 682f0cd0..4e7711ac 100644 --- a/lib/ext2fs/ext2fs.h +++ b/lib/ext2fs/ext2fs.h @@ -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 */ diff --git a/misc/dumpe2fs.c b/misc/dumpe2fs.c index 5b114e96..7b7e3fe2 100644 --- a/misc/dumpe2fs.c +++ b/misc/dumpe2fs.c @@ -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 "),