123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274 |
- #ifndef _EXT4_EXTENTS
- #define _EXT4_EXTENTS
- #include "ext4.h"
- #define AGGRESSIVE_TEST_
- #define EXTENTS_STATS__
- #define CHECK_BINSEARCH__
- #define EXT_STATS_
- struct ext4_extent_tail {
- __le32 et_checksum;
- };
- struct ext4_extent {
- __le32 ee_block;
- __le16 ee_len;
- __le16 ee_start_hi;
- __le32 ee_start_lo;
- };
- struct ext4_extent_idx {
- __le32 ei_block;
- __le32 ei_leaf_lo;
- __le16 ei_leaf_hi;
- __u16 ei_unused;
- };
- struct ext4_extent_header {
- __le16 eh_magic;
- __le16 eh_entries;
- __le16 eh_max;
- __le16 eh_depth;
- __le32 eh_generation;
- };
- #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));
- }
- struct ext4_ext_path {
- ext4_fsblk_t p_block;
- __u16 p_depth;
- __u16 p_maxdepth;
- struct ext4_extent *p_ext;
- struct ext4_extent_idx *p_idx;
- struct ext4_extent_header *p_hdr;
- struct buffer_head *p_bh;
- };
- #define EXT_INIT_MAX_LEN (1UL << 15)
- #define EXT_UNWRITTEN_MAX_LEN (EXT_INIT_MAX_LEN - 1)
- #define EXT_FIRST_EXTENT(__hdr__) \
- ((struct ext4_extent *) (((char *) (__hdr__)) + \
- sizeof(struct ext4_extent_header)))
- #define EXT_FIRST_INDEX(__hdr__) \
- ((struct ext4_extent_idx *) (((char *) (__hdr__)) + \
- sizeof(struct ext4_extent_header)))
- #define EXT_HAS_FREE_INDEX(__path__) \
- (le16_to_cpu((__path__)->p_hdr->eh_entries) \
- < le16_to_cpu((__path__)->p_hdr->eh_max))
- #define EXT_LAST_EXTENT(__hdr__) \
- (EXT_FIRST_EXTENT((__hdr__)) + le16_to_cpu((__hdr__)->eh_entries) - 1)
- #define EXT_LAST_INDEX(__hdr__) \
- (EXT_FIRST_INDEX((__hdr__)) + le16_to_cpu((__hdr__)->eh_entries) - 1)
- #define EXT_MAX_EXTENT(__hdr__) \
- (EXT_FIRST_EXTENT((__hdr__)) + le16_to_cpu((__hdr__)->eh_max) - 1)
- #define EXT_MAX_INDEX(__hdr__) \
- (EXT_FIRST_INDEX((__hdr__)) + le16_to_cpu((__hdr__)->eh_max) - 1)
- static inline struct ext4_extent_header *ext_inode_hdr(struct inode *inode)
- {
- return (struct ext4_extent_header *) EXT4_I(inode)->i_data;
- }
- static inline struct ext4_extent_header *ext_block_hdr(struct buffer_head *bh)
- {
- return (struct ext4_extent_header *) bh->b_data;
- }
- static inline unsigned short ext_depth(struct inode *inode)
- {
- return le16_to_cpu(ext_inode_hdr(inode)->eh_depth);
- }
- static inline void ext4_ext_mark_unwritten(struct ext4_extent *ext)
- {
-
- 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_unwritten(struct ext4_extent *ext)
- {
-
- return (le16_to_cpu(ext->ee_len) > EXT_INIT_MAX_LEN);
- }
- static inline int ext4_ext_get_actual_len(struct ext4_extent *ext)
- {
- return (le16_to_cpu(ext->ee_len) <= EXT_INIT_MAX_LEN ?
- le16_to_cpu(ext->ee_len) :
- (le16_to_cpu(ext->ee_len) - EXT_INIT_MAX_LEN));
- }
- static inline void ext4_ext_mark_initialized(struct ext4_extent *ext)
- {
- ext->ee_len = cpu_to_le16(ext4_ext_get_actual_len(ext));
- }
- static inline ext4_fsblk_t ext4_ext_pblock(struct ext4_extent *ex)
- {
- ext4_fsblk_t block;
- block = le32_to_cpu(ex->ee_start_lo);
- block |= ((ext4_fsblk_t) le16_to_cpu(ex->ee_start_hi) << 31) << 1;
- return block;
- }
- static inline ext4_fsblk_t ext4_idx_pblock(struct ext4_extent_idx *ix)
- {
- ext4_fsblk_t block;
- block = le32_to_cpu(ix->ei_leaf_lo);
- block |= ((ext4_fsblk_t) le16_to_cpu(ix->ei_leaf_hi) << 31) << 1;
- return block;
- }
- static inline void ext4_ext_store_pblock(struct ext4_extent *ex,
- ext4_fsblk_t pb)
- {
- ex->ee_start_lo = cpu_to_le32((unsigned long) (pb & 0xffffffff));
- ex->ee_start_hi = cpu_to_le16((unsigned long) ((pb >> 31) >> 1) &
- 0xffff);
- }
- static inline void ext4_idx_store_pblock(struct ext4_extent_idx *ix,
- ext4_fsblk_t pb)
- {
- ix->ei_leaf_lo = cpu_to_le32((unsigned long) (pb & 0xffffffff));
- ix->ei_leaf_hi = cpu_to_le16((unsigned long) ((pb >> 31) >> 1) &
- 0xffff);
- }
- #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
|