diff options
Diffstat (limited to 'fs/ext4/ext4_extents.h')
-rw-r--r-- | fs/ext4/ext4_extents.h | 82 |
1 files changed, 60 insertions, 22 deletions
diff --git a/fs/ext4/ext4_extents.h b/fs/ext4/ext4_extents.h index bdb6ce7e2eb4..095c36f3b612 100644 --- a/fs/ext4/ext4_extents.h +++ b/fs/ext4/ext4_extents.h | |||
@@ -119,17 +119,13 @@ struct ext4_ext_path { | |||
119 | * structure for external API | 119 | * structure for external API |
120 | */ | 120 | */ |
121 | 121 | ||
122 | #define EXT4_EXT_CACHE_NO 0 | ||
123 | #define EXT4_EXT_CACHE_GAP 1 | ||
124 | #define EXT4_EXT_CACHE_EXTENT 2 | ||
125 | |||
126 | /* | 122 | /* |
127 | * to be called by ext4_ext_walk_space() | 123 | * to be called by ext4_ext_walk_space() |
128 | * negative retcode - error | 124 | * negative retcode - error |
129 | * positive retcode - signal for ext4_ext_walk_space(), see below | 125 | * positive retcode - signal for ext4_ext_walk_space(), see below |
130 | * callback must return valid extent (passed or newly created) | 126 | * callback must return valid extent (passed or newly created) |
131 | */ | 127 | */ |
132 | typedef int (*ext_prepare_callback)(struct inode *, struct ext4_ext_path *, | 128 | typedef int (*ext_prepare_callback)(struct inode *, ext4_lblk_t, |
133 | struct ext4_ext_cache *, | 129 | struct ext4_ext_cache *, |
134 | struct ext4_extent *, void *); | 130 | struct ext4_extent *, void *); |
135 | 131 | ||
@@ -137,8 +133,11 @@ typedef int (*ext_prepare_callback)(struct inode *, struct ext4_ext_path *, | |||
137 | #define EXT_BREAK 1 | 133 | #define EXT_BREAK 1 |
138 | #define EXT_REPEAT 2 | 134 | #define EXT_REPEAT 2 |
139 | 135 | ||
140 | /* Maximum logical block in a file; ext4_extent's ee_block is __le32 */ | 136 | /* |
141 | #define EXT_MAX_BLOCK 0xffffffff | 137 | * Maximum number of logical blocks in a file; ext4_extent's ee_block is |
138 | * __le32. | ||
139 | */ | ||
140 | #define EXT_MAX_BLOCKS 0xffffffff | ||
142 | 141 | ||
143 | /* | 142 | /* |
144 | * EXT_INIT_MAX_LEN is the maximum number of blocks we can have in an | 143 | * EXT_INIT_MAX_LEN is the maximum number of blocks we can have in an |
@@ -197,7 +196,7 @@ static inline unsigned short ext_depth(struct inode *inode) | |||
197 | static inline void | 196 | static inline void |
198 | ext4_ext_invalidate_cache(struct inode *inode) | 197 | ext4_ext_invalidate_cache(struct inode *inode) |
199 | { | 198 | { |
200 | EXT4_I(inode)->i_cached_extent.ec_type = EXT4_EXT_CACHE_NO; | 199 | EXT4_I(inode)->i_cached_extent.ec_len = 0; |
201 | } | 200 | } |
202 | 201 | ||
203 | static inline void ext4_ext_mark_uninitialized(struct ext4_extent *ext) | 202 | static inline void ext4_ext_mark_uninitialized(struct ext4_extent *ext) |
@@ -225,11 +224,60 @@ static inline void ext4_ext_mark_initialized(struct ext4_extent *ext) | |||
225 | ext->ee_len = cpu_to_le16(ext4_ext_get_actual_len(ext)); | 224 | ext->ee_len = cpu_to_le16(ext4_ext_get_actual_len(ext)); |
226 | } | 225 | } |
227 | 226 | ||
227 | /* | ||
228 | * ext4_ext_pblock: | ||
229 | * combine low and high parts of physical block number into ext4_fsblk_t | ||
230 | */ | ||
231 | static inline ext4_fsblk_t ext4_ext_pblock(struct ext4_extent *ex) | ||
232 | { | ||
233 | ext4_fsblk_t block; | ||
234 | |||
235 | block = le32_to_cpu(ex->ee_start_lo); | ||
236 | block |= ((ext4_fsblk_t) le16_to_cpu(ex->ee_start_hi) << 31) << 1; | ||
237 | return block; | ||
238 | } | ||
239 | |||
240 | /* | ||
241 | * ext4_idx_pblock: | ||
242 | * combine low and high parts of a leaf physical block number into ext4_fsblk_t | ||
243 | */ | ||
244 | static inline ext4_fsblk_t ext4_idx_pblock(struct ext4_extent_idx *ix) | ||
245 | { | ||
246 | ext4_fsblk_t block; | ||
247 | |||
248 | block = le32_to_cpu(ix->ei_leaf_lo); | ||
249 | block |= ((ext4_fsblk_t) le16_to_cpu(ix->ei_leaf_hi) << 31) << 1; | ||
250 | return block; | ||
251 | } | ||
252 | |||
253 | /* | ||
254 | * ext4_ext_store_pblock: | ||
255 | * stores a large physical block number into an extent struct, | ||
256 | * breaking it into parts | ||
257 | */ | ||
258 | static inline void ext4_ext_store_pblock(struct ext4_extent *ex, | ||
259 | ext4_fsblk_t pb) | ||
260 | { | ||
261 | ex->ee_start_lo = cpu_to_le32((unsigned long) (pb & 0xffffffff)); | ||
262 | ex->ee_start_hi = cpu_to_le16((unsigned long) ((pb >> 31) >> 1) & | ||
263 | 0xffff); | ||
264 | } | ||
265 | |||
266 | /* | ||
267 | * ext4_idx_store_pblock: | ||
268 | * stores a large physical block number into an index struct, | ||
269 | * breaking it into parts | ||
270 | */ | ||
271 | static inline void ext4_idx_store_pblock(struct ext4_extent_idx *ix, | ||
272 | ext4_fsblk_t pb) | ||
273 | { | ||
274 | ix->ei_leaf_lo = cpu_to_le32((unsigned long) (pb & 0xffffffff)); | ||
275 | ix->ei_leaf_hi = cpu_to_le16((unsigned long) ((pb >> 31) >> 1) & | ||
276 | 0xffff); | ||
277 | } | ||
278 | |||
228 | extern int ext4_ext_calc_metadata_amount(struct inode *inode, | 279 | extern int ext4_ext_calc_metadata_amount(struct inode *inode, |
229 | sector_t lblocks); | 280 | ext4_lblk_t lblocks); |
230 | extern ext4_fsblk_t ext_pblock(struct ext4_extent *ex); | ||
231 | extern ext4_fsblk_t idx_pblock(struct ext4_extent_idx *); | ||
232 | extern void ext4_ext_store_pblock(struct ext4_extent *, ext4_fsblk_t); | ||
233 | extern int ext4_extent_tree_init(handle_t *, struct inode *); | 281 | extern int ext4_extent_tree_init(handle_t *, struct inode *); |
234 | extern int ext4_ext_calc_credits_for_single_extent(struct inode *inode, | 282 | extern int ext4_ext_calc_credits_for_single_extent(struct inode *inode, |
235 | int num, | 283 | int num, |
@@ -237,19 +285,9 @@ extern int ext4_ext_calc_credits_for_single_extent(struct inode *inode, | |||
237 | extern int ext4_can_extents_be_merged(struct inode *inode, | 285 | extern int ext4_can_extents_be_merged(struct inode *inode, |
238 | struct ext4_extent *ex1, | 286 | struct ext4_extent *ex1, |
239 | struct ext4_extent *ex2); | 287 | struct ext4_extent *ex2); |
240 | extern int ext4_ext_try_to_merge(struct inode *inode, | ||
241 | struct ext4_ext_path *path, | ||
242 | struct ext4_extent *); | ||
243 | extern unsigned int ext4_ext_check_overlap(struct inode *, struct ext4_extent *, struct ext4_ext_path *); | ||
244 | extern int ext4_ext_insert_extent(handle_t *, struct inode *, struct ext4_ext_path *, struct ext4_extent *, int); | 288 | extern int ext4_ext_insert_extent(handle_t *, struct inode *, struct ext4_ext_path *, struct ext4_extent *, int); |
245 | extern int ext4_ext_walk_space(struct inode *, ext4_lblk_t, ext4_lblk_t, | ||
246 | ext_prepare_callback, void *); | ||
247 | extern struct ext4_ext_path *ext4_ext_find_extent(struct inode *, ext4_lblk_t, | 289 | extern struct ext4_ext_path *ext4_ext_find_extent(struct inode *, ext4_lblk_t, |
248 | struct ext4_ext_path *); | 290 | struct ext4_ext_path *); |
249 | extern int ext4_ext_search_left(struct inode *, struct ext4_ext_path *, | ||
250 | ext4_lblk_t *, ext4_fsblk_t *); | ||
251 | extern int ext4_ext_search_right(struct inode *, struct ext4_ext_path *, | ||
252 | ext4_lblk_t *, ext4_fsblk_t *); | ||
253 | extern void ext4_ext_drop_refs(struct ext4_ext_path *); | 291 | extern void ext4_ext_drop_refs(struct ext4_ext_path *); |
254 | extern int ext4_ext_check_inode(struct inode *inode); | 292 | extern int ext4_ext_check_inode(struct inode *inode); |
255 | #endif /* _EXT4_EXTENTS */ | 293 | #endif /* _EXT4_EXTENTS */ |