aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ext4/ext4_extents.h
diff options
context:
space:
mode:
Diffstat (limited to 'fs/ext4/ext4_extents.h')
-rw-r--r--fs/ext4/ext4_extents.h82
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 */
132typedef int (*ext_prepare_callback)(struct inode *, struct ext4_ext_path *, 128typedef 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)
197static inline void 196static inline void
198ext4_ext_invalidate_cache(struct inode *inode) 197ext4_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
203static inline void ext4_ext_mark_uninitialized(struct ext4_extent *ext) 202static 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 */
231static 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 */
244static 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 */
258static 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 */
271static 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
228extern int ext4_ext_calc_metadata_amount(struct inode *inode, 279extern int ext4_ext_calc_metadata_amount(struct inode *inode,
229 sector_t lblocks); 280 ext4_lblk_t lblocks);
230extern ext4_fsblk_t ext_pblock(struct ext4_extent *ex);
231extern ext4_fsblk_t idx_pblock(struct ext4_extent_idx *);
232extern void ext4_ext_store_pblock(struct ext4_extent *, ext4_fsblk_t);
233extern int ext4_extent_tree_init(handle_t *, struct inode *); 281extern int ext4_extent_tree_init(handle_t *, struct inode *);
234extern int ext4_ext_calc_credits_for_single_extent(struct inode *inode, 282extern 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,
237extern int ext4_can_extents_be_merged(struct inode *inode, 285extern 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);
240extern int ext4_ext_try_to_merge(struct inode *inode,
241 struct ext4_ext_path *path,
242 struct ext4_extent *);
243extern unsigned int ext4_ext_check_overlap(struct inode *, struct ext4_extent *, struct ext4_ext_path *);
244extern int ext4_ext_insert_extent(handle_t *, struct inode *, struct ext4_ext_path *, struct ext4_extent *, int); 288extern int ext4_ext_insert_extent(handle_t *, struct inode *, struct ext4_ext_path *, struct ext4_extent *, int);
245extern int ext4_ext_walk_space(struct inode *, ext4_lblk_t, ext4_lblk_t,
246 ext_prepare_callback, void *);
247extern struct ext4_ext_path *ext4_ext_find_extent(struct inode *, ext4_lblk_t, 289extern struct ext4_ext_path *ext4_ext_find_extent(struct inode *, ext4_lblk_t,
248 struct ext4_ext_path *); 290 struct ext4_ext_path *);
249extern int ext4_ext_search_left(struct inode *, struct ext4_ext_path *,
250 ext4_lblk_t *, ext4_fsblk_t *);
251extern int ext4_ext_search_right(struct inode *, struct ext4_ext_path *,
252 ext4_lblk_t *, ext4_fsblk_t *);
253extern void ext4_ext_drop_refs(struct ext4_ext_path *); 291extern void ext4_ext_drop_refs(struct ext4_ext_path *);
254extern int ext4_ext_check_inode(struct inode *inode); 292extern int ext4_ext_check_inode(struct inode *inode);
255#endif /* _EXT4_EXTENTS */ 293#endif /* _EXT4_EXTENTS */