diff options
Diffstat (limited to 'fs/ext4/ext4_extents.h')
| -rw-r--r-- | fs/ext4/ext4_extents.h | 24 | 
1 files changed, 24 insertions, 0 deletions
diff --git a/fs/ext4/ext4_extents.h b/fs/ext4/ext4_extents.h index 0f58b86e3a0..cb1b2c91996 100644 --- a/fs/ext4/ext4_extents.h +++ b/fs/ext4/ext4_extents.h @@ -63,9 +63,22 @@   * ext4_inode has i_block array (60 bytes total).   * The first 12 bytes store ext4_extent_header;   * the remainder stores an array of ext4_extent. + * For non-inode extent blocks, ext4_extent_tail + * follows the array.   */  /* + * This is the extent tail on-disk structure. + * All other extent structures are 12 bytes long.  It turns out that + * block_size % 12 >= 4 for at least all powers of 2 greater than 512, which + * covers all valid ext4 block sizes.  Therefore, this tail structure can be + * crammed into the end of the block without having to rebalance the tree. + */ +struct ext4_extent_tail { +	__le32	et_checksum;	/* crc32c(uuid+inum+extent_block) */ +}; + +/*   * This is the extent on-disk structure.   * It's used at the bottom of the tree.   */ @@ -101,6 +114,17 @@ struct ext4_extent_header {  #define EXT4_EXT_MAGIC		cpu_to_le16(0xf30a) +#define EXT4_EXTENT_TAIL_OFFSET(hdr) \ +	(sizeof(struct ext4_extent_header) + \ +	 (sizeof(struct ext4_extent) * le16_to_cpu((hdr)->eh_max))) + +static inline struct ext4_extent_tail * +find_ext4_extent_tail(struct ext4_extent_header *eh) +{ +	return (struct ext4_extent_tail *)(((void *)eh) + +					   EXT4_EXTENT_TAIL_OFFSET(eh)); +} +  /*   * Array of ext4_ext_path contains path to some extent.   * Creation/lookup routines use it for traversal/splitting/etc.  |