diff options
Diffstat (limited to 'fs/ocfs2/alloc.h')
| -rw-r--r-- | fs/ocfs2/alloc.h | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/fs/ocfs2/alloc.h b/fs/ocfs2/alloc.h index 70257c84cfbe..cceff5c37f47 100644 --- a/fs/ocfs2/alloc.h +++ b/fs/ocfs2/alloc.h | |||
| @@ -45,7 +45,9 @@ | |||
| 45 | * | 45 | * |
| 46 | * ocfs2_extent_tree contains info for the root of the b-tree, it must have a | 46 | * ocfs2_extent_tree contains info for the root of the b-tree, it must have a |
| 47 | * root ocfs2_extent_list and a root_bh so that they can be used in the b-tree | 47 | * root ocfs2_extent_list and a root_bh so that they can be used in the b-tree |
| 48 | * functions. | 48 | * functions. With metadata ecc, we now call different journal_access |
| 49 | * functions for each type of metadata, so it must have the | ||
| 50 | * root_journal_access function. | ||
| 49 | * ocfs2_extent_tree_operations abstract the normal operations we do for | 51 | * ocfs2_extent_tree_operations abstract the normal operations we do for |
| 50 | * the root of extent b-tree. | 52 | * the root of extent b-tree. |
| 51 | */ | 53 | */ |
| @@ -54,6 +56,7 @@ struct ocfs2_extent_tree { | |||
| 54 | struct ocfs2_extent_tree_operations *et_ops; | 56 | struct ocfs2_extent_tree_operations *et_ops; |
| 55 | struct buffer_head *et_root_bh; | 57 | struct buffer_head *et_root_bh; |
| 56 | struct ocfs2_extent_list *et_root_el; | 58 | struct ocfs2_extent_list *et_root_el; |
| 59 | ocfs2_journal_access_func et_root_journal_access; | ||
| 57 | void *et_object; | 60 | void *et_object; |
| 58 | unsigned int et_max_leaf_clusters; | 61 | unsigned int et_max_leaf_clusters; |
| 59 | }; | 62 | }; |
| @@ -68,10 +71,18 @@ void ocfs2_init_dinode_extent_tree(struct ocfs2_extent_tree *et, | |||
| 68 | void ocfs2_init_xattr_tree_extent_tree(struct ocfs2_extent_tree *et, | 71 | void ocfs2_init_xattr_tree_extent_tree(struct ocfs2_extent_tree *et, |
| 69 | struct inode *inode, | 72 | struct inode *inode, |
| 70 | struct buffer_head *bh); | 73 | struct buffer_head *bh); |
| 74 | struct ocfs2_xattr_value_buf; | ||
| 71 | void ocfs2_init_xattr_value_extent_tree(struct ocfs2_extent_tree *et, | 75 | void ocfs2_init_xattr_value_extent_tree(struct ocfs2_extent_tree *et, |
| 72 | struct inode *inode, | 76 | struct inode *inode, |
| 73 | struct buffer_head *bh, | 77 | struct ocfs2_xattr_value_buf *vb); |
| 74 | struct ocfs2_xattr_value_root *xv); | 78 | |
| 79 | /* | ||
| 80 | * Read an extent block into *bh. If *bh is NULL, a bh will be | ||
| 81 | * allocated. This is a cached read. The extent block will be validated | ||
| 82 | * with ocfs2_validate_extent_block(). | ||
| 83 | */ | ||
| 84 | int ocfs2_read_extent_block(struct inode *inode, u64 eb_blkno, | ||
| 85 | struct buffer_head **bh); | ||
| 75 | 86 | ||
| 76 | struct ocfs2_alloc_context; | 87 | struct ocfs2_alloc_context; |
| 77 | int ocfs2_insert_extent(struct ocfs2_super *osb, | 88 | int ocfs2_insert_extent(struct ocfs2_super *osb, |
| @@ -110,6 +121,11 @@ int ocfs2_remove_extent(struct inode *inode, | |||
| 110 | u32 cpos, u32 len, handle_t *handle, | 121 | u32 cpos, u32 len, handle_t *handle, |
| 111 | struct ocfs2_alloc_context *meta_ac, | 122 | struct ocfs2_alloc_context *meta_ac, |
| 112 | struct ocfs2_cached_dealloc_ctxt *dealloc); | 123 | struct ocfs2_cached_dealloc_ctxt *dealloc); |
| 124 | int ocfs2_remove_btree_range(struct inode *inode, | ||
| 125 | struct ocfs2_extent_tree *et, | ||
| 126 | u32 cpos, u32 phys_cpos, u32 len, | ||
| 127 | struct ocfs2_cached_dealloc_ctxt *dealloc); | ||
| 128 | |||
| 113 | int ocfs2_num_free_extents(struct ocfs2_super *osb, | 129 | int ocfs2_num_free_extents(struct ocfs2_super *osb, |
| 114 | struct inode *inode, | 130 | struct inode *inode, |
| 115 | struct ocfs2_extent_tree *et); | 131 | struct ocfs2_extent_tree *et); |
| @@ -167,10 +183,18 @@ int __ocfs2_flush_truncate_log(struct ocfs2_super *osb); | |||
| 167 | */ | 183 | */ |
| 168 | struct ocfs2_cached_dealloc_ctxt { | 184 | struct ocfs2_cached_dealloc_ctxt { |
| 169 | struct ocfs2_per_slot_free_list *c_first_suballocator; | 185 | struct ocfs2_per_slot_free_list *c_first_suballocator; |
| 186 | struct ocfs2_cached_block_free *c_global_allocator; | ||
| 170 | }; | 187 | }; |
| 171 | static inline void ocfs2_init_dealloc_ctxt(struct ocfs2_cached_dealloc_ctxt *c) | 188 | static inline void ocfs2_init_dealloc_ctxt(struct ocfs2_cached_dealloc_ctxt *c) |
| 172 | { | 189 | { |
| 173 | c->c_first_suballocator = NULL; | 190 | c->c_first_suballocator = NULL; |
| 191 | c->c_global_allocator = NULL; | ||
| 192 | } | ||
| 193 | int ocfs2_cache_cluster_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt, | ||
| 194 | u64 blkno, unsigned int bit); | ||
| 195 | static inline int ocfs2_dealloc_has_cluster(struct ocfs2_cached_dealloc_ctxt *c) | ||
| 196 | { | ||
| 197 | return c->c_global_allocator != NULL; | ||
| 174 | } | 198 | } |
| 175 | int ocfs2_run_deallocs(struct ocfs2_super *osb, | 199 | int ocfs2_run_deallocs(struct ocfs2_super *osb, |
| 176 | struct ocfs2_cached_dealloc_ctxt *ctxt); | 200 | struct ocfs2_cached_dealloc_ctxt *ctxt); |
