Blame view

fs/ocfs2/alloc.h 11.7 KB
ccd979bdb   Mark Fasheh   [PATCH] OCFS2: Th...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
  /* -*- mode: c; c-basic-offset: 8; -*-
   * vim: noexpandtab sw=8 ts=8 sts=0:
   *
   * alloc.h
   *
   * Function prototypes
   *
   * Copyright (C) 2002, 2004 Oracle.  All rights reserved.
   *
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public
   * License as published by the Free Software Foundation; either
   * version 2 of the License, or (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   * General Public License for more details.
   *
   * You should have received a copy of the GNU General Public
   * License along with this program; if not, write to the
   * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
   * Boston, MA 021110-1307, USA.
   */
  
  #ifndef OCFS2_ALLOC_H
  #define OCFS2_ALLOC_H
e7d4cb6bc   Tao Ma   ocfs2: Abstract o...
28

ca12b7c48   Tao Ma   ocfs2: Optionally...
29
30
31
32
  /*
   * For xattr tree leaf, we limit the leaf byte size to be 64K.
   */
  #define OCFS2_MAX_XATTR_TREE_LEAF_SIZE 65536
f99b9b7cc   Joel Becker   ocfs2: Make ocfs2...
33
34
35
36
37
38
39
40
41
  /*
   * ocfs2_extent_tree and ocfs2_extent_tree_operations are used to abstract
   * the b-tree operations in ocfs2. Now all the b-tree operations are not
   * limited to ocfs2_dinode only. Any data which need to allocate clusters
   * to store can use b-tree. And it only needs to implement its ocfs2_extent_tree
   * and operation.
   *
   * ocfs2_extent_tree becomes the first-class object for extent tree
   * manipulation.  Callers of the alloc.c code need to fill it via one of
8d6220d6a   Joel Becker   ocfs2: Change ocf...
42
   * the ocfs2_init_*_extent_tree() operations below.
f99b9b7cc   Joel Becker   ocfs2: Make ocfs2...
43
44
45
   *
   * ocfs2_extent_tree contains info for the root of the b-tree, it must have a
   * root ocfs2_extent_list and a root_bh so that they can be used in the b-tree
d9a0a1f83   Joel Becker   ocfs2: Store the ...
46
47
   * functions.  It needs the ocfs2_caching_info structure associated with
   * I/O on the tree.  With metadata ecc, we now call different journal_access
13723d00e   Joel Becker   ocfs2: Use metada...
48
49
   * functions for each type of metadata, so it must have the
   * root_journal_access function.
f99b9b7cc   Joel Becker   ocfs2: Make ocfs2...
50
51
52
53
54
55
56
57
   * ocfs2_extent_tree_operations abstract the normal operations we do for
   * the root of extent b-tree.
   */
  struct ocfs2_extent_tree_operations;
  struct ocfs2_extent_tree {
  	struct ocfs2_extent_tree_operations	*et_ops;
  	struct buffer_head			*et_root_bh;
  	struct ocfs2_extent_list		*et_root_el;
d9a0a1f83   Joel Becker   ocfs2: Store the ...
58
  	struct ocfs2_caching_info		*et_ci;
13723d00e   Joel Becker   ocfs2: Use metada...
59
  	ocfs2_journal_access_func		et_root_journal_access;
f99b9b7cc   Joel Becker   ocfs2: Make ocfs2...
60
61
62
63
64
  	void					*et_object;
  	unsigned int				et_max_leaf_clusters;
  };
  
  /*
8d6220d6a   Joel Becker   ocfs2: Change ocf...
65
66
   * ocfs2_init_*_extent_tree() will fill an ocfs2_extent_tree from the
   * specified object buffer.
f99b9b7cc   Joel Becker   ocfs2: Make ocfs2...
67
   */
8d6220d6a   Joel Becker   ocfs2: Change ocf...
68
  void ocfs2_init_dinode_extent_tree(struct ocfs2_extent_tree *et,
5e404e9ed   Joel Becker   ocfs2: Pass ocfs2...
69
  				   struct ocfs2_caching_info *ci,
8d6220d6a   Joel Becker   ocfs2: Change ocf...
70
71
  				   struct buffer_head *bh);
  void ocfs2_init_xattr_tree_extent_tree(struct ocfs2_extent_tree *et,
5e404e9ed   Joel Becker   ocfs2: Pass ocfs2...
72
  				       struct ocfs2_caching_info *ci,
8d6220d6a   Joel Becker   ocfs2: Change ocf...
73
  				       struct buffer_head *bh);
2a50a743b   Joel Becker   ocfs2: Create ocf...
74
  struct ocfs2_xattr_value_buf;
8d6220d6a   Joel Becker   ocfs2: Change ocf...
75
  void ocfs2_init_xattr_value_extent_tree(struct ocfs2_extent_tree *et,
5e404e9ed   Joel Becker   ocfs2: Pass ocfs2...
76
  					struct ocfs2_caching_info *ci,
2a50a743b   Joel Becker   ocfs2: Create ocf...
77
  					struct ocfs2_xattr_value_buf *vb);
9b7895efa   Mark Fasheh   ocfs2: Add a name...
78
  void ocfs2_init_dx_root_extent_tree(struct ocfs2_extent_tree *et,
5e404e9ed   Joel Becker   ocfs2: Pass ocfs2...
79
  				    struct ocfs2_caching_info *ci,
9b7895efa   Mark Fasheh   ocfs2: Add a name...
80
  				    struct buffer_head *bh);
fe9244159   Tao Ma   ocfs2: Add refcou...
81
82
83
  void ocfs2_init_refcount_extent_tree(struct ocfs2_extent_tree *et,
  				     struct ocfs2_caching_info *ci,
  				     struct buffer_head *bh);
f99b9b7cc   Joel Becker   ocfs2: Make ocfs2...
84

5e96581a3   Joel Becker   ocfs2: Wrap exten...
85
86
87
88
89
  /*
   * Read an extent block into *bh.  If *bh is NULL, a bh will be
   * allocated.  This is a cached read.  The extent block will be validated
   * with ocfs2_validate_extent_block().
   */
3d03a305d   Joel Becker   ocfs2: Pass ocfs2...
90
  int ocfs2_read_extent_block(struct ocfs2_caching_info *ci, u64 eb_blkno,
5e96581a3   Joel Becker   ocfs2: Wrap exten...
91
  			    struct buffer_head **bh);
ccd979bdb   Mark Fasheh   [PATCH] OCFS2: Th...
92
  struct ocfs2_alloc_context;
cc79d8c19   Joel Becker   ocfs2: ocfs2_inse...
93
  int ocfs2_insert_extent(handle_t *handle,
f99b9b7cc   Joel Becker   ocfs2: Make ocfs2...
94
95
96
97
98
99
  			struct ocfs2_extent_tree *et,
  			u32 cpos,
  			u64 start_blk,
  			u32 new_clusters,
  			u8 flags,
  			struct ocfs2_alloc_context *meta_ac);
0eb8d47e6   Tao Ma   ocfs2: Make high ...
100
101
102
103
104
  enum ocfs2_alloc_restarted {
  	RESTART_NONE = 0,
  	RESTART_TRANS,
  	RESTART_META
  };
cbee7e1a6   Joel Becker   ocfs2: ocfs2_add_...
105
106
  int ocfs2_add_clusters_in_btree(handle_t *handle,
  				struct ocfs2_extent_tree *et,
0eb8d47e6   Tao Ma   ocfs2: Make high ...
107
108
109
  				u32 *logical_offset,
  				u32 clusters_to_add,
  				int mark_unwritten,
0eb8d47e6   Tao Ma   ocfs2: Make high ...
110
111
  				struct ocfs2_alloc_context *data_ac,
  				struct ocfs2_alloc_context *meta_ac,
f99b9b7cc   Joel Becker   ocfs2: Make ocfs2...
112
  				enum ocfs2_alloc_restarted *reason_ret);
328d5752e   Mark Fasheh   ocfs2: btree chan...
113
  struct ocfs2_cached_dealloc_ctxt;
e2e9f6082   Tao Ma   ocfs2: move tree ...
114
115
116
117
118
119
120
121
  struct ocfs2_path;
  int ocfs2_split_extent(handle_t *handle,
  		       struct ocfs2_extent_tree *et,
  		       struct ocfs2_path *path,
  		       int split_index,
  		       struct ocfs2_extent_rec *split_rec,
  		       struct ocfs2_alloc_context *meta_ac,
  		       struct ocfs2_cached_dealloc_ctxt *dealloc);
f99b9b7cc   Joel Becker   ocfs2: Make ocfs2...
122
123
  int ocfs2_mark_extent_written(struct inode *inode,
  			      struct ocfs2_extent_tree *et,
328d5752e   Mark Fasheh   ocfs2: btree chan...
124
125
  			      handle_t *handle, u32 cpos, u32 len, u32 phys,
  			      struct ocfs2_alloc_context *meta_ac,
f99b9b7cc   Joel Becker   ocfs2: Make ocfs2...
126
  			      struct ocfs2_cached_dealloc_ctxt *dealloc);
1aa75fea6   Tao Ma   ocfs2: Add functi...
127
128
129
130
131
132
  int ocfs2_change_extent_flag(handle_t *handle,
  			     struct ocfs2_extent_tree *et,
  			     u32 cpos, u32 len, u32 phys,
  			     struct ocfs2_alloc_context *meta_ac,
  			     struct ocfs2_cached_dealloc_ctxt *dealloc,
  			     int new_flags, int clear_flags);
dbdcf6a48   Joel Becker   ocfs2: ocfs2_remo...
133
134
  int ocfs2_remove_extent(handle_t *handle, struct ocfs2_extent_tree *et,
  			u32 cpos, u32 len,
063c4561f   Mark Fasheh   ocfs2: support fo...
135
  			struct ocfs2_alloc_context *meta_ac,
f99b9b7cc   Joel Becker   ocfs2: Make ocfs2...
136
  			struct ocfs2_cached_dealloc_ctxt *dealloc);
fecc01126   Mark Fasheh   ocfs2: turn __ocf...
137
138
  int ocfs2_remove_btree_range(struct inode *inode,
  			     struct ocfs2_extent_tree *et,
78f94673d   Tristan Ye   Ocfs2: Optimize o...
139
140
141
  			     u32 cpos, u32 phys_cpos, u32 len, int flags,
  			     struct ocfs2_cached_dealloc_ctxt *dealloc,
  			     u64 refcount_loc);
fecc01126   Mark Fasheh   ocfs2: turn __ocf...
142

ccd979bdb   Mark Fasheh   [PATCH] OCFS2: Th...
143
  int ocfs2_num_free_extents(struct ocfs2_super *osb,
f99b9b7cc   Joel Becker   ocfs2: Make ocfs2...
144
  			   struct ocfs2_extent_tree *et);
e7d4cb6bc   Tao Ma   ocfs2: Abstract o...
145

811f933df   Tao Ma   ocfs2: Use ocfs2_...
146
147
148
149
150
151
152
153
  /*
   * how many new metadata chunks would an allocation need at maximum?
   *
   * Please note that the caller must make sure that root_el is the root
   * of extent tree. So for an inode, it should be &fe->id2.i_list. Otherwise
   * the result may be wrong.
   */
  static inline int ocfs2_extend_meta_needed(struct ocfs2_extent_list *root_el)
ccd979bdb   Mark Fasheh   [PATCH] OCFS2: Th...
154
155
156
157
158
159
160
161
162
  {
  	/*
  	 * Rather than do all the work of determining how much we need
  	 * (involves a ton of reads and locks), just ask for the
  	 * maximal limit.  That's a tree depth shift.  So, one block for
  	 * level of the tree (current l_tree_depth), one block for the
  	 * new tree_depth==0 extent_block, and one block at the new
  	 * top-of-the tree.
  	 */
811f933df   Tao Ma   ocfs2: Use ocfs2_...
163
  	return le16_to_cpu(root_el->l_tree_depth) + 2;
ccd979bdb   Mark Fasheh   [PATCH] OCFS2: Th...
164
  }
5b6a3a2b4   Mark Fasheh   ocfs2: Write supp...
165
  void ocfs2_dinode_new_extent_list(struct inode *inode, struct ocfs2_dinode *di);
1afc32b95   Mark Fasheh   ocfs2: Write supp...
166
167
168
  void ocfs2_set_inode_data_inline(struct inode *inode, struct ocfs2_dinode *di);
  int ocfs2_convert_inline_data_to_extents(struct inode *inode,
  					 struct buffer_head *di_bh);
ccd979bdb   Mark Fasheh   [PATCH] OCFS2: Th...
169
170
171
172
173
174
175
176
177
178
  int ocfs2_truncate_log_init(struct ocfs2_super *osb);
  void ocfs2_truncate_log_shutdown(struct ocfs2_super *osb);
  void ocfs2_schedule_truncate_log_flush(struct ocfs2_super *osb,
  				       int cancel);
  int ocfs2_flush_truncate_log(struct ocfs2_super *osb);
  int ocfs2_begin_truncate_log_recovery(struct ocfs2_super *osb,
  				      int slot_num,
  				      struct ocfs2_dinode **tl_copy);
  int ocfs2_complete_truncate_log_recovery(struct ocfs2_super *osb,
  					 struct ocfs2_dinode *tl_copy);
063c4561f   Mark Fasheh   ocfs2: support fo...
179
180
181
182
183
184
  int ocfs2_truncate_log_needs_flush(struct ocfs2_super *osb);
  int ocfs2_truncate_log_append(struct ocfs2_super *osb,
  			      handle_t *handle,
  			      u64 start_blk,
  			      unsigned int num_clusters);
  int __ocfs2_flush_truncate_log(struct ocfs2_super *osb);
ccd979bdb   Mark Fasheh   [PATCH] OCFS2: Th...
185

2b604351b   Mark Fasheh   ocfs2: simplify d...
186
187
188
189
190
191
192
193
194
195
196
  /*
   * Process local structure which describes the block unlinks done
   * during an operation. This is populated via
   * ocfs2_cache_block_dealloc().
   *
   * ocfs2_run_deallocs() should be called after the potentially
   * de-allocating routines. No journal handles should be open, and most
   * locks should have been dropped.
   */
  struct ocfs2_cached_dealloc_ctxt {
  	struct ocfs2_per_slot_free_list		*c_first_suballocator;
2891d290a   Tao Ma   ocfs2: Add cluste...
197
  	struct ocfs2_cached_block_free 		*c_global_allocator;
2b604351b   Mark Fasheh   ocfs2: simplify d...
198
199
200
201
  };
  static inline void ocfs2_init_dealloc_ctxt(struct ocfs2_cached_dealloc_ctxt *c)
  {
  	c->c_first_suballocator = NULL;
2891d290a   Tao Ma   ocfs2: Add cluste...
202
  	c->c_global_allocator = NULL;
2b604351b   Mark Fasheh   ocfs2: simplify d...
203
  }
2891d290a   Tao Ma   ocfs2: Add cluste...
204
205
  int ocfs2_cache_cluster_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt,
  				u64 blkno, unsigned int bit);
1823cb0b9   Tao Ma   ocfs2: Add suppor...
206
  int ocfs2_cache_block_dealloc(struct ocfs2_cached_dealloc_ctxt *ctxt,
74380c479   Tao Ma   ocfs2: Free block...
207
  			      int type, int slot, u64 suballoc, u64 blkno,
1823cb0b9   Tao Ma   ocfs2: Add suppor...
208
  			      unsigned int bit);
78f30c314   Tao Ma   ocfs2/xattr: Rese...
209
210
211
212
  static inline int ocfs2_dealloc_has_cluster(struct ocfs2_cached_dealloc_ctxt *c)
  {
  	return c->c_global_allocator != NULL;
  }
2b604351b   Mark Fasheh   ocfs2: simplify d...
213
214
  int ocfs2_run_deallocs(struct ocfs2_super *osb,
  		       struct ocfs2_cached_dealloc_ctxt *ctxt);
ccd979bdb   Mark Fasheh   [PATCH] OCFS2: Th...
215
  struct ocfs2_truncate_context {
59a5e416d   Mark Fasheh   ocfs2: plug trunc...
216
  	struct ocfs2_cached_dealloc_ctxt tc_dealloc;
ccd979bdb   Mark Fasheh   [PATCH] OCFS2: Th...
217
218
219
220
  	int tc_ext_alloc_locked; /* is it cluster locked? */
  	/* these get destroyed once it's passed to ocfs2_commit_truncate. */
  	struct buffer_head *tc_last_eb_bh;
  };
35edec1d5   Mark Fasheh   ocfs2: update tru...
221
222
  int ocfs2_zero_range_for_truncate(struct inode *inode, handle_t *handle,
  				  u64 range_start, u64 range_end);
ccd979bdb   Mark Fasheh   [PATCH] OCFS2: Th...
223
224
  int ocfs2_commit_truncate(struct ocfs2_super *osb,
  			  struct inode *inode,
78f94673d   Tristan Ye   Ocfs2: Optimize o...
225
  			  struct buffer_head *di_bh);
1afc32b95   Mark Fasheh   ocfs2: Write supp...
226
227
  int ocfs2_truncate_inline(struct inode *inode, struct buffer_head *di_bh,
  			  unsigned int start, unsigned int end, int trunc);
ccd979bdb   Mark Fasheh   [PATCH] OCFS2: Th...
228

facdb77f5   Joel Becker   ocfs2: ocfs2_find...
229
230
231
  int ocfs2_find_leaf(struct ocfs2_caching_info *ci,
  		    struct ocfs2_extent_list *root_el, u32 cpos,
  		    struct buffer_head **leaf_bh);
328d5752e   Mark Fasheh   ocfs2: btree chan...
232
  int ocfs2_search_extent_list(struct ocfs2_extent_list *el, u32 v_cluster);
363041a5f   Mark Fasheh   ocfs2: temporaril...
233

e80de36d8   Tao Ma   ocfs2: Add ocfs2_...
234
  int ocfs2_trim_fs(struct super_block *sb, struct fstrim_range *range);
e48edee2d   Mark Fasheh   ocfs2: make room ...
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
  /*
   * Helper function to look at the # of clusters in an extent record.
   */
  static inline unsigned int ocfs2_rec_clusters(struct ocfs2_extent_list *el,
  					      struct ocfs2_extent_rec *rec)
  {
  	/*
  	 * Cluster count in extent records is slightly different
  	 * between interior nodes and leaf nodes. This is to support
  	 * unwritten extents which need a flags field in leaf node
  	 * records, thus shrinking the available space for a clusters
  	 * field.
  	 */
  	if (el->l_tree_depth)
  		return le32_to_cpu(rec->e_int_clusters);
  	else
  		return le16_to_cpu(rec->e_leaf_clusters);
  }
00dc417fa   Mark Fasheh   ocfs2: fiemap sup...
253
254
255
256
257
258
259
260
  /*
   * This is only valid for leaf nodes, which are the only ones that can
   * have empty extents anyway.
   */
  static inline int ocfs2_is_empty_extent(struct ocfs2_extent_rec *rec)
  {
  	return !rec->e_leaf_clusters;
  }
6f70fa519   Tao Ma   ocfs2: Add CoW su...
261
262
263
264
265
  int ocfs2_grab_pages(struct inode *inode, loff_t start, loff_t end,
  		     struct page **pages, int *num);
  void ocfs2_map_and_dirty_page(struct inode *inode, handle_t *handle,
  			      unsigned int from, unsigned int to,
  			      struct page *page, int zero, u64 *phys);
e2e9f6082   Tao Ma   ocfs2: move tree ...
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
  /*
   * Structures which describe a path through a btree, and functions to
   * manipulate them.
   *
   * The idea here is to be as generic as possible with the tree
   * manipulation code.
   */
  struct ocfs2_path_item {
  	struct buffer_head		*bh;
  	struct ocfs2_extent_list	*el;
  };
  
  #define OCFS2_MAX_PATH_DEPTH	5
  
  struct ocfs2_path {
  	int				p_tree_depth;
  	ocfs2_journal_access_func	p_root_access;
  	struct ocfs2_path_item		p_node[OCFS2_MAX_PATH_DEPTH];
  };
  
  #define path_root_bh(_path) ((_path)->p_node[0].bh)
  #define path_root_el(_path) ((_path)->p_node[0].el)
  #define path_root_access(_path)((_path)->p_root_access)
  #define path_leaf_bh(_path) ((_path)->p_node[(_path)->p_tree_depth].bh)
  #define path_leaf_el(_path) ((_path)->p_node[(_path)->p_tree_depth].el)
  #define path_num_items(_path) ((_path)->p_tree_depth + 1)
  
  void ocfs2_reinit_path(struct ocfs2_path *path, int keep_root);
  void ocfs2_free_path(struct ocfs2_path *path);
  int ocfs2_find_path(struct ocfs2_caching_info *ci,
  		    struct ocfs2_path *path,
  		    u32 cpos);
  struct ocfs2_path *ocfs2_new_path_from_path(struct ocfs2_path *path);
  struct ocfs2_path *ocfs2_new_path_from_et(struct ocfs2_extent_tree *et);
  int ocfs2_path_bh_journal_access(handle_t *handle,
  				 struct ocfs2_caching_info *ci,
  				 struct ocfs2_path *path,
  				 int idx);
  int ocfs2_journal_access_path(struct ocfs2_caching_info *ci,
  			      handle_t *handle,
  			      struct ocfs2_path *path);
38a04e432   Tao Ma   ocfs2: Find prope...
307
308
  int ocfs2_find_cpos_for_right_leaf(struct super_block *sb,
  				   struct ocfs2_path *path, u32 *cpos);
ee149a7c6   Tristan Ye   Ocfs2: Make ocfs2...
309
310
  int ocfs2_find_cpos_for_left_leaf(struct super_block *sb,
  				  struct ocfs2_path *path, u32 *cpos);
38a04e432   Tao Ma   ocfs2: Find prope...
311
312
313
  int ocfs2_find_subtree_root(struct ocfs2_extent_tree *et,
  			    struct ocfs2_path *left,
  			    struct ocfs2_path *right);
ccd979bdb   Mark Fasheh   [PATCH] OCFS2: Th...
314
  #endif /* OCFS2_ALLOC_H */