0001
0002
0003
0004
0005
0006
0007 #ifndef _EXT4_EXTENTS
0008 #define _EXT4_EXTENTS
0009
0010 #include "ext4.h"
0011
0012
0013
0014
0015
0016
0017
0018 #define AGGRESSIVE_TEST_
0019
0020
0021
0022
0023
0024
0025 #define EXTENTS_STATS__
0026
0027
0028
0029
0030
0031 #define CHECK_BINSEARCH__
0032
0033
0034
0035
0036
0037 #define EXT_STATS_
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055 struct ext4_extent_tail {
0056 __le32 et_checksum;
0057 };
0058
0059
0060
0061
0062
0063 struct ext4_extent {
0064 __le32 ee_block;
0065 __le16 ee_len;
0066 __le16 ee_start_hi;
0067 __le32 ee_start_lo;
0068 };
0069
0070
0071
0072
0073
0074 struct ext4_extent_idx {
0075 __le32 ei_block;
0076 __le32 ei_leaf_lo;
0077
0078 __le16 ei_leaf_hi;
0079 __u16 ei_unused;
0080 };
0081
0082
0083
0084
0085 struct ext4_extent_header {
0086 __le16 eh_magic;
0087 __le16 eh_entries;
0088 __le16 eh_max;
0089 __le16 eh_depth;
0090 __le32 eh_generation;
0091 };
0092
0093 #define EXT4_EXT_MAGIC cpu_to_le16(0xf30a)
0094 #define EXT4_MAX_EXTENT_DEPTH 5
0095
0096 #define EXT4_EXTENT_TAIL_OFFSET(hdr) \
0097 (sizeof(struct ext4_extent_header) + \
0098 (sizeof(struct ext4_extent) * le16_to_cpu((hdr)->eh_max)))
0099
0100 static inline struct ext4_extent_tail *
0101 find_ext4_extent_tail(struct ext4_extent_header *eh)
0102 {
0103 return (struct ext4_extent_tail *)(((void *)eh) +
0104 EXT4_EXTENT_TAIL_OFFSET(eh));
0105 }
0106
0107
0108
0109
0110
0111
0112 struct ext4_ext_path {
0113 ext4_fsblk_t p_block;
0114 __u16 p_depth;
0115 __u16 p_maxdepth;
0116 struct ext4_extent *p_ext;
0117 struct ext4_extent_idx *p_idx;
0118 struct ext4_extent_header *p_hdr;
0119 struct buffer_head *p_bh;
0120 };
0121
0122
0123
0124
0125
0126
0127
0128
0129 struct partial_cluster {
0130 ext4_fsblk_t pclu;
0131 ext4_lblk_t lblk;
0132 enum {initial, tofree, nofree} state;
0133 };
0134
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156 #define EXT_INIT_MAX_LEN (1UL << 15)
0157 #define EXT_UNWRITTEN_MAX_LEN (EXT_INIT_MAX_LEN - 1)
0158
0159
0160 #define EXT_FIRST_EXTENT(__hdr__) \
0161 ((struct ext4_extent *) (((char *) (__hdr__)) + \
0162 sizeof(struct ext4_extent_header)))
0163 #define EXT_FIRST_INDEX(__hdr__) \
0164 ((struct ext4_extent_idx *) (((char *) (__hdr__)) + \
0165 sizeof(struct ext4_extent_header)))
0166 #define EXT_HAS_FREE_INDEX(__path__) \
0167 (le16_to_cpu((__path__)->p_hdr->eh_entries) \
0168 < le16_to_cpu((__path__)->p_hdr->eh_max))
0169 #define EXT_LAST_EXTENT(__hdr__) \
0170 (EXT_FIRST_EXTENT((__hdr__)) + le16_to_cpu((__hdr__)->eh_entries) - 1)
0171 #define EXT_LAST_INDEX(__hdr__) \
0172 (EXT_FIRST_INDEX((__hdr__)) + le16_to_cpu((__hdr__)->eh_entries) - 1)
0173 #define EXT_MAX_EXTENT(__hdr__) \
0174 ((le16_to_cpu((__hdr__)->eh_max)) ? \
0175 ((EXT_FIRST_EXTENT((__hdr__)) + le16_to_cpu((__hdr__)->eh_max) - 1)) \
0176 : NULL)
0177 #define EXT_MAX_INDEX(__hdr__) \
0178 ((le16_to_cpu((__hdr__)->eh_max)) ? \
0179 ((EXT_FIRST_INDEX((__hdr__)) + le16_to_cpu((__hdr__)->eh_max) - 1)) \
0180 : NULL)
0181
0182 static inline struct ext4_extent_header *ext_inode_hdr(struct inode *inode)
0183 {
0184 return (struct ext4_extent_header *) EXT4_I(inode)->i_data;
0185 }
0186
0187 static inline struct ext4_extent_header *ext_block_hdr(struct buffer_head *bh)
0188 {
0189 return (struct ext4_extent_header *) bh->b_data;
0190 }
0191
0192 static inline unsigned short ext_depth(struct inode *inode)
0193 {
0194 return le16_to_cpu(ext_inode_hdr(inode)->eh_depth);
0195 }
0196
0197 static inline void ext4_ext_mark_unwritten(struct ext4_extent *ext)
0198 {
0199
0200 BUG_ON((le16_to_cpu(ext->ee_len) & ~EXT_INIT_MAX_LEN) == 0);
0201 ext->ee_len |= cpu_to_le16(EXT_INIT_MAX_LEN);
0202 }
0203
0204 static inline int ext4_ext_is_unwritten(struct ext4_extent *ext)
0205 {
0206
0207 return (le16_to_cpu(ext->ee_len) > EXT_INIT_MAX_LEN);
0208 }
0209
0210 static inline int ext4_ext_get_actual_len(struct ext4_extent *ext)
0211 {
0212 return (le16_to_cpu(ext->ee_len) <= EXT_INIT_MAX_LEN ?
0213 le16_to_cpu(ext->ee_len) :
0214 (le16_to_cpu(ext->ee_len) - EXT_INIT_MAX_LEN));
0215 }
0216
0217 static inline void ext4_ext_mark_initialized(struct ext4_extent *ext)
0218 {
0219 ext->ee_len = cpu_to_le16(ext4_ext_get_actual_len(ext));
0220 }
0221
0222
0223
0224
0225
0226 static inline ext4_fsblk_t ext4_ext_pblock(struct ext4_extent *ex)
0227 {
0228 ext4_fsblk_t block;
0229
0230 block = le32_to_cpu(ex->ee_start_lo);
0231 block |= ((ext4_fsblk_t) le16_to_cpu(ex->ee_start_hi) << 31) << 1;
0232 return block;
0233 }
0234
0235
0236
0237
0238
0239 static inline ext4_fsblk_t ext4_idx_pblock(struct ext4_extent_idx *ix)
0240 {
0241 ext4_fsblk_t block;
0242
0243 block = le32_to_cpu(ix->ei_leaf_lo);
0244 block |= ((ext4_fsblk_t) le16_to_cpu(ix->ei_leaf_hi) << 31) << 1;
0245 return block;
0246 }
0247
0248
0249
0250
0251
0252
0253 static inline void ext4_ext_store_pblock(struct ext4_extent *ex,
0254 ext4_fsblk_t pb)
0255 {
0256 ex->ee_start_lo = cpu_to_le32((unsigned long) (pb & 0xffffffff));
0257 ex->ee_start_hi = cpu_to_le16((unsigned long) ((pb >> 31) >> 1) &
0258 0xffff);
0259 }
0260
0261
0262
0263
0264
0265
0266 static inline void ext4_idx_store_pblock(struct ext4_extent_idx *ix,
0267 ext4_fsblk_t pb)
0268 {
0269 ix->ei_leaf_lo = cpu_to_le32((unsigned long) (pb & 0xffffffff));
0270 ix->ei_leaf_hi = cpu_to_le16((unsigned long) ((pb >> 31) >> 1) &
0271 0xffff);
0272 }
0273
0274 #endif
0275