diff options
-rw-r--r-- | cmds-check.c | 2 | ||||
-rw-r--r-- | cmds-restore.c | 3 | ||||
-rw-r--r-- | ctree.h | 31 | ||||
-rw-r--r-- | print-tree.c | 5 |
4 files changed, 27 insertions, 14 deletions
diff --git a/cmds-check.c b/cmds-check.c index 288906fc..d195e7a4 100644 --- a/cmds-check.c +++ b/cmds-check.c @@ -1166,7 +1166,7 @@ static int process_file_extent(struct btrfs_root *root, extent_type = btrfs_file_extent_type(eb, fi); if (extent_type == BTRFS_FILE_EXTENT_INLINE) { - num_bytes = btrfs_file_extent_inline_len(eb, fi); + num_bytes = btrfs_file_extent_inline_len(eb, slot, fi); if (num_bytes == 0) rec->errors |= I_ERR_BAD_FILE_EXTENT; rec->found_size += num_bytes; diff --git a/cmds-restore.c b/cmds-restore.c index 2ecbc94d..96b97e1e 100644 --- a/cmds-restore.c +++ b/cmds-restore.c @@ -229,8 +229,7 @@ static int copy_one_inline(int fd, struct btrfs_path *path, u64 pos) fi = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_file_extent_item); ptr = btrfs_file_extent_inline_start(fi); - len = btrfs_file_extent_inline_item_len(leaf, - btrfs_item_nr(path->slots[0])); + len = btrfs_file_extent_inline_len(leaf, path->slots[0], fi); read_extent_buffer(leaf, buf, ptr, len); compress = btrfs_file_extent_compression(leaf, fi); @@ -2094,15 +2094,6 @@ BTRFS_SETGET_STACK_FUNCS(stack_qgroup_limit_rsv_referenced, BTRFS_SETGET_STACK_FUNCS(stack_qgroup_limit_rsv_exclusive, struct btrfs_qgroup_limit_item, rsv_exclusive, 64); -/* 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(struct extent_buffer *eb, - struct btrfs_file_extent_item *e) -{ - return btrfs_file_extent_ram_bytes(eb, e); -} - /* * this returns the number of bytes used by the item on disk, minus the * size of any extent headers. If a file is compressed on disk, this is @@ -2116,6 +2107,28 @@ static inline u32 btrfs_file_extent_inline_item_len(struct extent_buffer *eb, return btrfs_item_size(eb, e) - offset; } +/* 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(struct extent_buffer *eb, + int slot, + struct btrfs_file_extent_item *fi) +{ + /* + * return the space used on disk if this item isn't + * compressed or encoded + */ + if (btrfs_file_extent_compression(eb, fi) == 0 && + btrfs_file_extent_encryption(eb, fi) == 0 && + btrfs_file_extent_other_encoding(eb, fi) == 0) { + return btrfs_file_extent_inline_item_len(eb, + btrfs_item_nr(slot)); + } + + /* otherwise use the ram bytes field */ + return btrfs_file_extent_ram_bytes(eb, fi); +} + static inline u32 btrfs_level_size(struct btrfs_root *root, int level) { if (level == 0) return root->leafsize; diff --git a/print-tree.c b/print-tree.c index 9b90f9b5..7263b09a 100644 --- a/print-tree.c +++ b/print-tree.c @@ -209,6 +209,7 @@ static void print_uuids(struct extent_buffer *eb) static void print_file_extent_item(struct extent_buffer *eb, struct btrfs_item *item, + int slot, struct btrfs_file_extent_item *fi) { int extent_type = btrfs_file_extent_type(eb, fi); @@ -217,7 +218,7 @@ static void print_file_extent_item(struct extent_buffer *eb, printf("\t\tinline extent data size %u " "ram %u compress %d\n", btrfs_file_extent_inline_item_len(eb, item), - btrfs_file_extent_inline_len(eb, fi), + btrfs_file_extent_inline_len(eb, slot, fi), btrfs_file_extent_compression(eb, fi)); return; } @@ -829,7 +830,7 @@ void btrfs_print_leaf(struct btrfs_root *root, struct extent_buffer *l) case BTRFS_EXTENT_DATA_KEY: fi = btrfs_item_ptr(l, i, struct btrfs_file_extent_item); - print_file_extent_item(l, item, fi); + print_file_extent_item(l, item, i, fi); break; case BTRFS_BLOCK_GROUP_ITEM_KEY: bi = btrfs_item_ptr(l, i, |