summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQu Wenruo <quwenruo@cn.fujitsu.com>2017-02-21 16:34:31 +0800
committerDavid Sterba <dsterba@suse.com>2017-03-08 13:00:48 +0100
commit7fe1e452586e7679dc7cb19118e2384a72236a36 (patch)
tree07ad5e761594d2ffb1c1a185a4aa6e878edde01a
parent4a749360cdb55d196750bd7ea3591a3db7f90843 (diff)
btrfs-progs: check: lowmem: Fix false alert on inline compressed extent
Old lowmem check doesn't check if the inline extent is compressed and always checks extent numbytes against inline item size. And when it finds the extent numbytes mismatch with inline item size it doesn't output any error message, just return error silently, making it quite hard to debug. Fix it by only checking extent numbytes against inline item size when the extent is not compressed, and output error message. Reported-by: Christoph Anton Mitterer <calestyo@scientia.net> Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: David Sterba <dsterba@suse.com>
-rw-r--r--cmds-check.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/cmds-check.c b/cmds-check.c
index 29c532b9..3d0b1231 100644
--- a/cmds-check.c
+++ b/cmds-check.c
@@ -4711,17 +4711,28 @@ static int check_file_extent(struct btrfs_root *root, struct btrfs_key *fkey,
fi = btrfs_item_ptr(node, slot, struct btrfs_file_extent_item);
+ /* Check inline extent */
extent_type = btrfs_file_extent_type(node, fi);
- /* Skip if file extent is inline */
if (extent_type == BTRFS_FILE_EXTENT_INLINE) {
struct btrfs_item *e = btrfs_item_nr(slot);
u32 item_inline_len;
item_inline_len = btrfs_file_extent_inline_item_len(node, e);
extent_num_bytes = btrfs_file_extent_inline_len(node, slot, fi);
- if (extent_num_bytes == 0 ||
- extent_num_bytes != item_inline_len)
+ compressed = btrfs_file_extent_compression(node, fi);
+ if (extent_num_bytes == 0) {
+ error(
+ "root %llu EXTENT_DATA[%llu %llu] has empty inline extent",
+ root->objectid, fkey->objectid, fkey->offset);
err |= FILE_EXTENT_ERROR;
+ }
+ if (!compressed && extent_num_bytes != item_inline_len) {
+ error(
+ "root %llu EXTENT_DATA[%llu %llu] wrong inline size, have: %llu, expected: %u",
+ root->objectid, fkey->objectid, fkey->offset,
+ extent_num_bytes, item_inline_len);
+ err |= FILE_EXTENT_ERROR;
+ }
*size += extent_num_bytes;
return err;
}