| From: David Sterba <dsterba@suse.cz> |
| Date: Thu, 24 Jul 2014 17:34:58 +0200 |
| Subject: btrfs: new define for the inline extent data start |
| |
| commit 7ec20afbcb7b257aec82ea5d66e6b0b7499abaca upstream. |
| |
| Use a common definition for the inline data start so we don't have to |
| open-code it and introduce bugs like "Btrfs: fix wrong max inline data |
| size limit" fixed. |
| |
| Signed-off-by: David Sterba <dsterba@suse.cz> |
| [bwh: Backported to 3.16 as dependency of various fixes: adjust context] |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| fs/btrfs/ctree.c | 3 +-- |
| fs/btrfs/ctree.h | 16 ++++++++-------- |
| 2 files changed, 9 insertions(+), 10 deletions(-) |
| |
| --- a/fs/btrfs/ctree.c |
| +++ b/fs/btrfs/ctree.c |
| @@ -4609,8 +4609,7 @@ void btrfs_truncate_item(struct btrfs_ro |
| ptr = btrfs_item_ptr_offset(leaf, slot); |
| memmove_extent_buffer(leaf, ptr, |
| (unsigned long)fi, |
| - offsetof(struct btrfs_file_extent_item, |
| - disk_bytenr)); |
| + BTRFS_FILE_EXTENT_INLINE_DATA_START); |
| } |
| } |
| |
| --- a/fs/btrfs/ctree.h |
| +++ b/fs/btrfs/ctree.h |
| @@ -392,9 +392,11 @@ struct btrfs_header { |
| sizeof(struct btrfs_key_ptr)) |
| #define __BTRFS_LEAF_DATA_SIZE(bs) ((bs) - sizeof(struct btrfs_header)) |
| #define BTRFS_LEAF_DATA_SIZE(r) (__BTRFS_LEAF_DATA_SIZE(r->leafsize)) |
| +#define BTRFS_FILE_EXTENT_INLINE_DATA_START \ |
| + (offsetof(struct btrfs_file_extent_item, disk_bytenr)) |
| #define BTRFS_MAX_INLINE_DATA_SIZE(r) (BTRFS_LEAF_DATA_SIZE(r) - \ |
| sizeof(struct btrfs_item) - \ |
| - offsetof(struct btrfs_file_extent_item, disk_bytenr)) |
| + BTRFS_FILE_EXTENT_INLINE_DATA_START) |
| #define BTRFS_MAX_XATTR_SIZE(r) (BTRFS_LEAF_DATA_SIZE(r) - \ |
| sizeof(struct btrfs_item) -\ |
| sizeof(struct btrfs_dir_item)) |
| @@ -904,6 +906,8 @@ struct btrfs_file_extent_item { |
| /* |
| * disk space consumed by the extent, checksum blocks are included |
| * in these numbers |
| + * |
| + * At this offset in the structure, the inline extent data start. |
| */ |
| __le64 disk_bytenr; |
| __le64 disk_num_bytes; |
| @@ -3050,14 +3054,12 @@ BTRFS_SETGET_STACK_FUNCS(stack_file_exte |
| static inline unsigned long |
| btrfs_file_extent_inline_start(struct btrfs_file_extent_item *e) |
| { |
| - unsigned long offset = (unsigned long)e; |
| - offset += offsetof(struct btrfs_file_extent_item, disk_bytenr); |
| - return offset; |
| + return (unsigned long)e + BTRFS_FILE_EXTENT_INLINE_DATA_START; |
| } |
| |
| static inline u32 btrfs_file_extent_calc_inline_size(u32 datasize) |
| { |
| - return offsetof(struct btrfs_file_extent_item, disk_bytenr) + datasize; |
| + return BTRFS_FILE_EXTENT_INLINE_DATA_START + datasize; |
| } |
| |
| BTRFS_SETGET_FUNCS(file_extent_disk_bytenr, struct btrfs_file_extent_item, |
| @@ -3087,9 +3089,7 @@ BTRFS_SETGET_FUNCS(file_extent_other_enc |
| static inline u32 btrfs_file_extent_inline_item_len(struct extent_buffer *eb, |
| struct btrfs_item *e) |
| { |
| - unsigned long offset; |
| - offset = offsetof(struct btrfs_file_extent_item, disk_bytenr); |
| - return btrfs_item_size(eb, e) - offset; |
| + return btrfs_item_size(eb, e) - BTRFS_FILE_EXTENT_INLINE_DATA_START; |
| } |
| |
| /* this returns the number of file bytes represented by the inline item. |