mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 08:19:28 +00:00
btrfs: Better csum error message for data csum mismatch
The original csum error message only outputs inode number, offset, check sum and expected check sum. However no root objectid is outputted, which sometimes makes debugging quite painful under multi-subvolume case (including relocation). Also the checksum output is decimal, which seldom makes sense for users/developers and is hard to read in most time. This patch will add root objectid, which will be %lld for rootid larger than LAST_FREE_OBJECTID, and hex csum output for better readability. Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
parent
fe01aa6538
commit
6f6b643e44
3 changed files with 22 additions and 7 deletions
|
@ -324,6 +324,24 @@ static inline void btrfs_inode_resume_unlocked_dio(struct inode *inode)
|
|||
&BTRFS_I(inode)->runtime_flags);
|
||||
}
|
||||
|
||||
static inline void btrfs_print_data_csum_error(struct inode *inode,
|
||||
u64 logical_start, u32 csum, u32 csum_expected, int mirror_num)
|
||||
{
|
||||
struct btrfs_root *root = BTRFS_I(inode)->root;
|
||||
|
||||
/* Output minus objectid, which is more meaningful */
|
||||
if (root->objectid >= BTRFS_LAST_FREE_OBJECTID)
|
||||
btrfs_warn_rl(root->fs_info,
|
||||
"csum failed root %lld ino %lld off %llu csum 0x%08x expected csum 0x%08x mirror %d",
|
||||
root->objectid, btrfs_ino(BTRFS_I(inode)),
|
||||
logical_start, csum, csum_expected, mirror_num);
|
||||
else
|
||||
btrfs_warn_rl(root->fs_info,
|
||||
"csum failed root %llu ino %llu off %llu csum 0x%08x expected csum 0x%08x mirror %d",
|
||||
root->objectid, btrfs_ino(BTRFS_I(inode)),
|
||||
logical_start, csum, csum_expected, mirror_num);
|
||||
}
|
||||
|
||||
bool btrfs_page_exists_in_range(struct inode *inode, loff_t start, loff_t end);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -124,10 +124,8 @@ static int check_compressed_csum(struct inode *inode,
|
|||
kunmap_atomic(kaddr);
|
||||
|
||||
if (csum != *cb_sum) {
|
||||
btrfs_info(BTRFS_I(inode)->root->fs_info,
|
||||
"csum failed ino %llu extent %llu csum %u wanted %u mirror %d",
|
||||
btrfs_ino(BTRFS_I(inode)), disk_start, csum, *cb_sum,
|
||||
cb->mirror_num);
|
||||
btrfs_print_data_csum_error(inode, disk_start, csum,
|
||||
*cb_sum, cb->mirror_num);
|
||||
ret = -EIO;
|
||||
goto fail;
|
||||
}
|
||||
|
|
|
@ -3086,9 +3086,8 @@ static int __readpage_endio_check(struct inode *inode,
|
|||
kunmap_atomic(kaddr);
|
||||
return 0;
|
||||
zeroit:
|
||||
btrfs_warn_rl(BTRFS_I(inode)->root->fs_info,
|
||||
"csum failed ino %llu off %llu csum %u expected csum %u",
|
||||
btrfs_ino(BTRFS_I(inode)), start, csum, csum_expected);
|
||||
btrfs_print_data_csum_error(inode, start, csum, csum_expected,
|
||||
io_bio->mirror_num);
|
||||
memset(kaddr + pgoff, 1, len);
|
||||
flush_dcache_page(page);
|
||||
kunmap_atomic(kaddr);
|
||||
|
|
Loading…
Reference in a new issue