btrfs: Get rid of the confusing btrfs_file_extent_inline_len
We used to call btrfs_file_extent_inline_len() to get the uncompressed data size of an inlined extent. However this function is hiding evil, for compressed extent, it has no choice but to directly read out ram_bytes from btrfs_file_extent_item. While for uncompressed extent, it uses item size to calculate the real data size, and ignoring ram_bytes completely. In fact, for corrupted ram_bytes, due to above behavior kernel btrfs_print_leaf() can't even print correct ram_bytes to expose the bug. Since we have the tree-checker to verify all EXTENT_DATA, such mismatch can be detected pretty easily, thus we can trust ram_bytes without the evil btrfs_file_extent_inline_len(). Signed-off-by: Qu Wenruo <wqu@suse.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
@@ -2428,32 +2428,6 @@ static inline u32 btrfs_file_extent_inline_item_len(
|
||||
return btrfs_item_size(eb, e) - BTRFS_FILE_EXTENT_INLINE_DATA_START;
|
||||
}
|
||||
|
||||
/* this returns the number of file bytes represented by the inline item.
|
||||
* If an item is compressed, this is the uncompressed size
|
||||
*/
|
||||
static inline u32 btrfs_file_extent_inline_len(const struct extent_buffer *eb,
|
||||
int slot,
|
||||
const struct btrfs_file_extent_item *fi)
|
||||
{
|
||||
struct btrfs_map_token token;
|
||||
|
||||
btrfs_init_map_token(&token);
|
||||
/*
|
||||
* return the space used on disk if this item isn't
|
||||
* compressed or encoded
|
||||
*/
|
||||
if (btrfs_token_file_extent_compression(eb, fi, &token) == 0 &&
|
||||
btrfs_token_file_extent_encryption(eb, fi, &token) == 0 &&
|
||||
btrfs_token_file_extent_other_encoding(eb, fi, &token) == 0) {
|
||||
return btrfs_file_extent_inline_item_len(eb,
|
||||
btrfs_item_nr(slot));
|
||||
}
|
||||
|
||||
/* otherwise use the ram bytes field */
|
||||
return btrfs_token_file_extent_ram_bytes(eb, fi, &token);
|
||||
}
|
||||
|
||||
|
||||
/* btrfs_dev_stats_item */
|
||||
static inline u64 btrfs_dev_stats_value(const struct extent_buffer *eb,
|
||||
const struct btrfs_dev_stats_item *ptr,
|
||||
|
Reference in New Issue
Block a user