diff options
Diffstat (limited to 'fs/ext4/ext4_extents.h')
| -rw-r--r-- | fs/ext4/ext4_extents.h | 102 | 
1 files changed, 40 insertions, 62 deletions
diff --git a/fs/ext4/ext4_extents.h b/fs/ext4/ext4_extents.h index 28ce70fd9cd..a867f5ca999 100644 --- a/fs/ext4/ext4_extents.h +++ b/fs/ext4/ext4_extents.h @@ -43,16 +43,6 @@  #define CHECK_BINSEARCH__  /* - * Turn on EXT_DEBUG to get lots of info about extents operations. - */ -#define EXT_DEBUG__ -#ifdef EXT_DEBUG -#define ext_debug(a...)		printk(a) -#else -#define ext_debug(a...) -#endif - -/*   * If EXT_STATS is defined then stats numbers are collected.   * These number will be displayed at umount time.   */ @@ -63,9 +53,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 +104,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. @@ -119,46 +133,25 @@ struct ext4_ext_path {   * structure for external API   */ -#define EXT4_EXT_CACHE_NO	0 -#define EXT4_EXT_CACHE_GAP	1 -#define EXT4_EXT_CACHE_EXTENT	2 - -/* - * to be called by ext4_ext_walk_space() - * negative retcode - error - * positive retcode - signal for ext4_ext_walk_space(), see below - * callback must return valid extent (passed or newly created) - */ -typedef int (*ext_prepare_callback)(struct inode *, struct ext4_ext_path *, -					struct ext4_ext_cache *, -					struct ext4_extent *, void *); - -#define EXT_CONTINUE   0 -#define EXT_BREAK      1 -#define EXT_REPEAT     2 - -/* Maximum logical block in a file; ext4_extent's ee_block is __le32 */ -#define EXT_MAX_BLOCK	0xffffffff -  /*   * EXT_INIT_MAX_LEN is the maximum number of blocks we can have in an   * initialized extent. This is 2^15 and not (2^16 - 1), since we use the   * MSB of ee_len field in the extent datastructure to signify if this - * particular extent is an initialized extent or an uninitialized (i.e. + * particular extent is an initialized extent or an unwritten (i.e.   * preallocated). - * EXT_UNINIT_MAX_LEN is the maximum number of blocks we can have in an - * uninitialized extent. + * EXT_UNWRITTEN_MAX_LEN is the maximum number of blocks we can have in an + * unwritten extent.   * If ee_len is <= 0x8000, it is an initialized extent. Otherwise, it is an - * uninitialized one. In other words, if MSB of ee_len is set, it is an - * uninitialized extent with only one special scenario when ee_len = 0x8000. - * In this case we can not have an uninitialized extent of zero length and + * unwritten one. In other words, if MSB of ee_len is set, it is an + * unwritten extent with only one special scenario when ee_len = 0x8000. + * In this case we can not have an unwritten extent of zero length and   * thus we make it as a special case of initialized extent with 0x8000 length.   * This way we get better extent-to-group alignment for initialized extents.   * Hence, the maximum number of blocks we can have in an *initialized* - * extent is 2^15 (32768) and in an *uninitialized* extent is 2^15-1 (32767). + * extent is 2^15 (32768) and in an *unwritten* extent is 2^15-1 (32767).   */  #define EXT_INIT_MAX_LEN	(1UL << 15) -#define EXT_UNINIT_MAX_LEN	(EXT_INIT_MAX_LEN - 1) +#define EXT_UNWRITTEN_MAX_LEN	(EXT_INIT_MAX_LEN - 1)  #define EXT_FIRST_EXTENT(__hdr__) \ @@ -194,20 +187,14 @@ static inline unsigned short ext_depth(struct inode *inode)  	return le16_to_cpu(ext_inode_hdr(inode)->eh_depth);  } -static inline void -ext4_ext_invalidate_cache(struct inode *inode) +static inline void ext4_ext_mark_unwritten(struct ext4_extent *ext)  { -	EXT4_I(inode)->i_cached_extent.ec_type = EXT4_EXT_CACHE_NO; -} - -static inline void ext4_ext_mark_uninitialized(struct ext4_extent *ext) -{ -	/* We can not have an uninitialized extent of zero length! */ +	/* We can not have an unwritten extent of zero length! */  	BUG_ON((le16_to_cpu(ext->ee_len) & ~EXT_INIT_MAX_LEN) == 0);  	ext->ee_len |= cpu_to_le16(EXT_INIT_MAX_LEN);  } -static inline int ext4_ext_is_uninitialized(struct ext4_extent *ext) +static inline int ext4_ext_is_unwritten(struct ext4_extent *ext)  {  	/* Extent with ee_len of 0x8000 is treated as an initialized extent */  	return (le16_to_cpu(ext->ee_len) > EXT_INIT_MAX_LEN); @@ -277,19 +264,10 @@ static inline void ext4_idx_store_pblock(struct ext4_extent_idx *ix,  				     0xffff);  } -extern int ext4_ext_calc_metadata_amount(struct inode *inode, -					 sector_t lblocks); -extern int ext4_extent_tree_init(handle_t *, struct inode *); -extern int ext4_ext_calc_credits_for_single_extent(struct inode *inode, -						   int num, -						   struct ext4_ext_path *path); -extern int ext4_can_extents_be_merged(struct inode *inode, -				      struct ext4_extent *ex1, -				      struct ext4_extent *ex2); -extern int ext4_ext_insert_extent(handle_t *, struct inode *, struct ext4_ext_path *, struct ext4_extent *, int); -extern struct ext4_ext_path *ext4_ext_find_extent(struct inode *, ext4_lblk_t, -							struct ext4_ext_path *); -extern void ext4_ext_drop_refs(struct ext4_ext_path *); -extern int ext4_ext_check_inode(struct inode *inode); +#define ext4_ext_dirty(handle, inode, path) \ +		__ext4_ext_dirty(__func__, __LINE__, (handle), (inode), (path)) +int __ext4_ext_dirty(const char *where, unsigned int line, handle_t *handle, +		     struct inode *inode, struct ext4_ext_path *path); +  #endif /* _EXT4_EXTENTS */  | 
