summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmds-check.c2
-rw-r--r--cmds-restore.c3
-rw-r--r--ctree.h31
-rw-r--r--print-tree.c5
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);
diff --git a/ctree.h b/ctree.h
index 45f2faf6..a4d2cd11 100644
--- a/ctree.h
+++ b/ctree.h
@@ -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,