aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQu Wenruo <quwenruo@cn.fujitsu.com>2017-02-08 21:45:06 -0500
committerDavid Sterba <dsterba@suse.com>2017-02-17 06:03:48 -0500
commit6f6b643e44ef79cbd85e69800a06326805829aa8 (patch)
tree7d04cfdabebaa9da49fc5f36c83024e7d882fbb7
parentfe01aa65385c226d822013b90608b67c485f8dc6 (diff)
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>
-rw-r--r--fs/btrfs/btrfs_inode.h18
-rw-r--r--fs/btrfs/compression.c6
-rw-r--r--fs/btrfs/inode.c5
3 files changed, 22 insertions, 7 deletions
diff --git a/fs/btrfs/btrfs_inode.h b/fs/btrfs/btrfs_inode.h
index b2dde0efebc0..819a6d27218a 100644
--- a/fs/btrfs/btrfs_inode.h
+++ b/fs/btrfs/btrfs_inode.h
@@ -324,6 +324,24 @@ static inline void btrfs_inode_resume_unlocked_dio(struct inode *inode)
324 &BTRFS_I(inode)->runtime_flags); 324 &BTRFS_I(inode)->runtime_flags);
325} 325}
326 326
327static inline void btrfs_print_data_csum_error(struct inode *inode,
328 u64 logical_start, u32 csum, u32 csum_expected, int mirror_num)
329{
330 struct btrfs_root *root = BTRFS_I(inode)->root;
331
332 /* Output minus objectid, which is more meaningful */
333 if (root->objectid >= BTRFS_LAST_FREE_OBJECTID)
334 btrfs_warn_rl(root->fs_info,
335 "csum failed root %lld ino %lld off %llu csum 0x%08x expected csum 0x%08x mirror %d",
336 root->objectid, btrfs_ino(BTRFS_I(inode)),
337 logical_start, csum, csum_expected, mirror_num);
338 else
339 btrfs_warn_rl(root->fs_info,
340 "csum failed root %llu ino %llu off %llu csum 0x%08x expected csum 0x%08x mirror %d",
341 root->objectid, btrfs_ino(BTRFS_I(inode)),
342 logical_start, csum, csum_expected, mirror_num);
343}
344
327bool btrfs_page_exists_in_range(struct inode *inode, loff_t start, loff_t end); 345bool btrfs_page_exists_in_range(struct inode *inode, loff_t start, loff_t end);
328 346
329#endif 347#endif
diff --git a/fs/btrfs/compression.c b/fs/btrfs/compression.c
index 454711240649..903c32c9eb22 100644
--- a/fs/btrfs/compression.c
+++ b/fs/btrfs/compression.c
@@ -124,10 +124,8 @@ static int check_compressed_csum(struct inode *inode,
124 kunmap_atomic(kaddr); 124 kunmap_atomic(kaddr);
125 125
126 if (csum != *cb_sum) { 126 if (csum != *cb_sum) {
127 btrfs_info(BTRFS_I(inode)->root->fs_info, 127 btrfs_print_data_csum_error(inode, disk_start, csum,
128 "csum failed ino %llu extent %llu csum %u wanted %u mirror %d", 128 *cb_sum, cb->mirror_num);
129 btrfs_ino(BTRFS_I(inode)), disk_start, csum, *cb_sum,
130 cb->mirror_num);
131 ret = -EIO; 129 ret = -EIO;
132 goto fail; 130 goto fail;
133 } 131 }
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index 92416f3ea9a8..175c28a94a57 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -3086,9 +3086,8 @@ static int __readpage_endio_check(struct inode *inode,
3086 kunmap_atomic(kaddr); 3086 kunmap_atomic(kaddr);
3087 return 0; 3087 return 0;
3088zeroit: 3088zeroit:
3089 btrfs_warn_rl(BTRFS_I(inode)->root->fs_info, 3089 btrfs_print_data_csum_error(inode, start, csum, csum_expected,
3090 "csum failed ino %llu off %llu csum %u expected csum %u", 3090 io_bio->mirror_num);
3091 btrfs_ino(BTRFS_I(inode)), start, csum, csum_expected);
3092 memset(kaddr + pgoff, 1, len); 3091 memset(kaddr + pgoff, 1, len);
3093 flush_dcache_page(page); 3092 flush_dcache_page(page);
3094 kunmap_atomic(kaddr); 3093 kunmap_atomic(kaddr);