Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
fs
ocfs2
alloc.h
Go to the documentation of this file.
1
/* -*- mode: c; c-basic-offset: 8; -*-
2
* vim: noexpandtab sw=8 ts=8 sts=0:
3
*
4
* alloc.h
5
*
6
* Function prototypes
7
*
8
* Copyright (C) 2002, 2004 Oracle. All rights reserved.
9
*
10
* This program is free software; you can redistribute it and/or
11
* modify it under the terms of the GNU General Public
12
* License as published by the Free Software Foundation; either
13
* version 2 of the License, or (at your option) any later version.
14
*
15
* This program is distributed in the hope that it will be useful,
16
* but WITHOUT ANY WARRANTY; without even the implied warranty of
17
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18
* General Public License for more details.
19
*
20
* You should have received a copy of the GNU General Public
21
* License along with this program; if not, write to the
22
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23
* Boston, MA 021110-1307, USA.
24
*/
25
26
#ifndef OCFS2_ALLOC_H
27
#define OCFS2_ALLOC_H
28
29
30
/*
31
* For xattr tree leaf, we limit the leaf byte size to be 64K.
32
*/
33
#define OCFS2_MAX_XATTR_TREE_LEAF_SIZE 65536
34
35
/*
36
* ocfs2_extent_tree and ocfs2_extent_tree_operations are used to abstract
37
* the b-tree operations in ocfs2. Now all the b-tree operations are not
38
* limited to ocfs2_dinode only. Any data which need to allocate clusters
39
* to store can use b-tree. And it only needs to implement its ocfs2_extent_tree
40
* and operation.
41
*
42
* ocfs2_extent_tree becomes the first-class object for extent tree
43
* manipulation. Callers of the alloc.c code need to fill it via one of
44
* the ocfs2_init_*_extent_tree() operations below.
45
*
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
48
* functions. It needs the ocfs2_caching_info structure associated with
49
* I/O on the tree. With metadata ecc, we now call different journal_access
50
* functions for each type of metadata, so it must have the
51
* root_journal_access function.
52
* ocfs2_extent_tree_operations abstract the normal operations we do for
53
* the root of extent b-tree.
54
*/
55
struct
ocfs2_extent_tree_operations
;
56
struct
ocfs2_extent_tree
{
57
struct
ocfs2_extent_tree_operations
*
et_ops
;
58
struct
buffer_head *
et_root_bh
;
59
struct
ocfs2_extent_list
*
et_root_el
;
60
struct
ocfs2_caching_info
*
et_ci
;
61
ocfs2_journal_access_func
et_root_journal_access
;
62
void
*
et_object
;
63
unsigned
int
et_max_leaf_clusters
;
64
};
65
66
/*
67
* ocfs2_init_*_extent_tree() will fill an ocfs2_extent_tree from the
68
* specified object buffer.
69
*/
70
void
ocfs2_init_dinode_extent_tree
(
struct
ocfs2_extent_tree
*
et
,
71
struct
ocfs2_caching_info
*ci,
72
struct
buffer_head *bh);
73
void
ocfs2_init_xattr_tree_extent_tree
(
struct
ocfs2_extent_tree
*
et
,
74
struct
ocfs2_caching_info
*ci,
75
struct
buffer_head *bh);
76
struct
ocfs2_xattr_value_buf
;
77
void
ocfs2_init_xattr_value_extent_tree
(
struct
ocfs2_extent_tree
*
et
,
78
struct
ocfs2_caching_info
*ci,
79
struct
ocfs2_xattr_value_buf
*vb);
80
void
ocfs2_init_dx_root_extent_tree
(
struct
ocfs2_extent_tree
*
et
,
81
struct
ocfs2_caching_info
*ci,
82
struct
buffer_head *bh);
83
void
ocfs2_init_refcount_extent_tree
(
struct
ocfs2_extent_tree
*
et
,
84
struct
ocfs2_caching_info
*ci,
85
struct
buffer_head *bh);
86
87
/*
88
* Read an extent block into *bh. If *bh is NULL, a bh will be
89
* allocated. This is a cached read. The extent block will be validated
90
* with ocfs2_validate_extent_block().
91
*/
92
int
ocfs2_read_extent_block
(
struct
ocfs2_caching_info
*ci,
u64
eb_blkno,
93
struct
buffer_head **bh);
94
95
struct
ocfs2_alloc_context
;
96
int
ocfs2_insert_extent
(handle_t *
handle
,
97
struct
ocfs2_extent_tree
*
et
,
98
u32
cpos,
99
u64
start_blk,
100
u32
new_clusters,
101
u8
flags
,
102
struct
ocfs2_alloc_context
*meta_ac);
103
104
enum
ocfs2_alloc_restarted
{
105
RESTART_NONE
= 0,
106
RESTART_TRANS
,
107
RESTART_META
108
};
109
int
ocfs2_add_clusters_in_btree
(handle_t *
handle
,
110
struct
ocfs2_extent_tree
*
et
,
111
u32
*logical_offset,
112
u32
clusters_to_add,
113
int
mark_unwritten,
114
struct
ocfs2_alloc_context
*data_ac,
115
struct
ocfs2_alloc_context
*meta_ac,
116
enum
ocfs2_alloc_restarted
*reason_ret);
117
struct
ocfs2_cached_dealloc_ctxt
;
118
struct
ocfs2_path
;
119
int
ocfs2_split_extent
(handle_t *
handle
,
120
struct
ocfs2_extent_tree
*
et
,
121
struct
ocfs2_path
*
path
,
122
int
split_index,
123
struct
ocfs2_extent_rec
*split_rec,
124
struct
ocfs2_alloc_context
*meta_ac,
125
struct
ocfs2_cached_dealloc_ctxt
*dealloc);
126
int
ocfs2_mark_extent_written
(
struct
inode
*
inode
,
127
struct
ocfs2_extent_tree
*
et
,
128
handle_t *
handle
,
u32
cpos,
u32
len,
u32
phys
,
129
struct
ocfs2_alloc_context
*meta_ac,
130
struct
ocfs2_cached_dealloc_ctxt
*dealloc);
131
int
ocfs2_change_extent_flag
(handle_t *
handle
,
132
struct
ocfs2_extent_tree
*
et
,
133
u32
cpos,
u32
len,
u32
phys
,
134
struct
ocfs2_alloc_context
*meta_ac,
135
struct
ocfs2_cached_dealloc_ctxt
*dealloc,
136
int
new_flags,
int
clear_flags);
137
int
ocfs2_remove_extent
(handle_t *
handle
,
struct
ocfs2_extent_tree
*
et
,
138
u32
cpos,
u32
len,
139
struct
ocfs2_alloc_context
*meta_ac,
140
struct
ocfs2_cached_dealloc_ctxt
*dealloc);
141
int
ocfs2_remove_btree_range
(
struct
inode
*
inode
,
142
struct
ocfs2_extent_tree
*
et
,
143
u32
cpos,
u32
phys_cpos,
u32
len,
int
flags
,
144
struct
ocfs2_cached_dealloc_ctxt
*dealloc,
145
u64
refcount_loc);
146
147
int
ocfs2_num_free_extents
(
struct
ocfs2_super
*osb,
148
struct
ocfs2_extent_tree
*
et
);
149
150
/*
151
* how many new metadata chunks would an allocation need at maximum?
152
*
153
* Please note that the caller must make sure that root_el is the root
154
* of extent tree. So for an inode, it should be &fe->id2.i_list. Otherwise
155
* the result may be wrong.
156
*/
157
static
inline
int
ocfs2_extend_meta_needed(
struct
ocfs2_extent_list
*root_el)
158
{
159
/*
160
* Rather than do all the work of determining how much we need
161
* (involves a ton of reads and locks), just ask for the
162
* maximal limit. That's a tree depth shift. So, one block for
163
* level of the tree (current l_tree_depth), one block for the
164
* new tree_depth==0 extent_block, and one block at the new
165
* top-of-the tree.
166
*/
167
return
le16_to_cpu
(root_el->
l_tree_depth
) + 2;
168
}
169
170
void
ocfs2_dinode_new_extent_list
(
struct
inode
*
inode
,
struct
ocfs2_dinode
*di);
171
void
ocfs2_set_inode_data_inline
(
struct
inode
*
inode
,
struct
ocfs2_dinode
*di);
172
int
ocfs2_convert_inline_data_to_extents
(
struct
inode
*
inode
,
173
struct
buffer_head *di_bh);
174
175
int
ocfs2_truncate_log_init
(
struct
ocfs2_super
*osb);
176
void
ocfs2_truncate_log_shutdown
(
struct
ocfs2_super
*osb);
177
void
ocfs2_schedule_truncate_log_flush
(
struct
ocfs2_super
*osb,
178
int
cancel
);
179
int
ocfs2_flush_truncate_log
(
struct
ocfs2_super
*osb);
180
int
ocfs2_begin_truncate_log_recovery
(
struct
ocfs2_super
*osb,
181
int
slot_num,
182
struct
ocfs2_dinode
**tl_copy);
183
int
ocfs2_complete_truncate_log_recovery
(
struct
ocfs2_super
*osb,
184
struct
ocfs2_dinode
*tl_copy);
185
int
ocfs2_truncate_log_needs_flush
(
struct
ocfs2_super
*osb);
186
int
ocfs2_truncate_log_append
(
struct
ocfs2_super
*osb,
187
handle_t *
handle
,
188
u64
start_blk,
189
unsigned
int
num_clusters);
190
int
__ocfs2_flush_truncate_log
(
struct
ocfs2_super
*osb);
191
192
/*
193
* Process local structure which describes the block unlinks done
194
* during an operation. This is populated via
195
* ocfs2_cache_block_dealloc().
196
*
197
* ocfs2_run_deallocs() should be called after the potentially
198
* de-allocating routines. No journal handles should be open, and most
199
* locks should have been dropped.
200
*/
201
struct
ocfs2_cached_dealloc_ctxt
{
202
struct
ocfs2_per_slot_free_list
*
c_first_suballocator
;
203
struct
ocfs2_cached_block_free
*
c_global_allocator
;
204
};
205
static
inline
void
ocfs2_init_dealloc_ctxt(
struct
ocfs2_cached_dealloc_ctxt
*
c
)
206
{
207
c->
c_first_suballocator
=
NULL
;
208
c->
c_global_allocator
=
NULL
;
209
}
210
int
ocfs2_cache_cluster_dealloc
(
struct
ocfs2_cached_dealloc_ctxt
*ctxt,
211
u64
blkno,
unsigned
int
bit
);
212
int
ocfs2_cache_block_dealloc
(
struct
ocfs2_cached_dealloc_ctxt
*ctxt,
213
int
type
,
int
slot
,
u64
suballoc,
u64
blkno,
214
unsigned
int
bit
);
215
static
inline
int
ocfs2_dealloc_has_cluster(
struct
ocfs2_cached_dealloc_ctxt
*
c
)
216
{
217
return
c->
c_global_allocator
!=
NULL
;
218
}
219
int
ocfs2_run_deallocs
(
struct
ocfs2_super
*osb,
220
struct
ocfs2_cached_dealloc_ctxt
*ctxt);
221
222
struct
ocfs2_truncate_context
{
223
struct
ocfs2_cached_dealloc_ctxt
tc_dealloc
;
224
int
tc_ext_alloc_locked
;
/* is it cluster locked? */
225
/* these get destroyed once it's passed to ocfs2_commit_truncate. */
226
struct
buffer_head *
tc_last_eb_bh
;
227
};
228
229
int
ocfs2_zero_range_for_truncate
(
struct
inode
*
inode
, handle_t *
handle
,
230
u64
range_start
,
u64
range_end);
231
int
ocfs2_commit_truncate
(
struct
ocfs2_super
*osb,
232
struct
inode
*
inode
,
233
struct
buffer_head *di_bh);
234
int
ocfs2_truncate_inline
(
struct
inode
*
inode
,
struct
buffer_head *di_bh,
235
unsigned
int
start
,
unsigned
int
end
,
int
trunc);
236
237
int
ocfs2_find_leaf
(
struct
ocfs2_caching_info
*ci,
238
struct
ocfs2_extent_list
*root_el,
u32
cpos,
239
struct
buffer_head **leaf_bh);
240
int
ocfs2_search_extent_list
(
struct
ocfs2_extent_list
*
el
,
u32
v_cluster);
241
242
int
ocfs2_trim_fs
(
struct
super_block
*
sb
,
struct
fstrim_range
*
range
);
243
/*
244
* Helper function to look at the # of clusters in an extent record.
245
*/
246
static
inline
unsigned
int
ocfs2_rec_clusters(
struct
ocfs2_extent_list
*
el
,
247
struct
ocfs2_extent_rec
*rec)
248
{
249
/*
250
* Cluster count in extent records is slightly different
251
* between interior nodes and leaf nodes. This is to support
252
* unwritten extents which need a flags field in leaf node
253
* records, thus shrinking the available space for a clusters
254
* field.
255
*/
256
if
(el->
l_tree_depth
)
257
return
le32_to_cpu
(rec->
e_int_clusters
);
258
else
259
return
le16_to_cpu
(rec->
e_leaf_clusters
);
260
}
261
262
/*
263
* This is only valid for leaf nodes, which are the only ones that can
264
* have empty extents anyway.
265
*/
266
static
inline
int
ocfs2_is_empty_extent(
struct
ocfs2_extent_rec
*rec)
267
{
268
return
!rec->
e_leaf_clusters
;
269
}
270
271
int
ocfs2_grab_pages
(
struct
inode
*
inode
, loff_t
start
, loff_t
end
,
272
struct
page
**
pages
,
int
*num);
273
void
ocfs2_map_and_dirty_page
(
struct
inode
*
inode
, handle_t *
handle
,
274
unsigned
int
from
,
unsigned
int
to,
275
struct
page
*
page
,
int
zero
,
u64
*
phys
);
276
/*
277
* Structures which describe a path through a btree, and functions to
278
* manipulate them.
279
*
280
* The idea here is to be as generic as possible with the tree
281
* manipulation code.
282
*/
283
struct
ocfs2_path_item
{
284
struct
buffer_head *
bh
;
285
struct
ocfs2_extent_list
*
el
;
286
};
287
288
#define OCFS2_MAX_PATH_DEPTH 5
289
290
struct
ocfs2_path
{
291
int
p_tree_depth
;
292
ocfs2_journal_access_func
p_root_access
;
293
struct
ocfs2_path_item
p_node
[
OCFS2_MAX_PATH_DEPTH
];
294
};
295
296
#define path_root_bh(_path) ((_path)->p_node[0].bh)
297
#define path_root_el(_path) ((_path)->p_node[0].el)
298
#define path_root_access(_path)((_path)->p_root_access)
299
#define path_leaf_bh(_path) ((_path)->p_node[(_path)->p_tree_depth].bh)
300
#define path_leaf_el(_path) ((_path)->p_node[(_path)->p_tree_depth].el)
301
#define path_num_items(_path) ((_path)->p_tree_depth + 1)
302
303
void
ocfs2_reinit_path
(
struct
ocfs2_path
*
path
,
int
keep_root);
304
void
ocfs2_free_path
(
struct
ocfs2_path
*
path
);
305
int
ocfs2_find_path
(
struct
ocfs2_caching_info
*ci,
306
struct
ocfs2_path
*
path
,
307
u32
cpos);
308
struct
ocfs2_path
*
ocfs2_new_path_from_path
(
struct
ocfs2_path
*
path
);
309
struct
ocfs2_path
*
ocfs2_new_path_from_et
(
struct
ocfs2_extent_tree
*
et
);
310
int
ocfs2_path_bh_journal_access
(handle_t *
handle
,
311
struct
ocfs2_caching_info
*ci,
312
struct
ocfs2_path
*
path
,
313
int
idx
);
314
int
ocfs2_journal_access_path
(
struct
ocfs2_caching_info
*ci,
315
handle_t *
handle
,
316
struct
ocfs2_path
*
path
);
317
int
ocfs2_find_cpos_for_right_leaf
(
struct
super_block
*
sb
,
318
struct
ocfs2_path
*
path
,
u32
*cpos);
319
int
ocfs2_find_cpos_for_left_leaf
(
struct
super_block
*
sb
,
320
struct
ocfs2_path
*
path
,
u32
*cpos);
321
int
ocfs2_find_subtree_root
(
struct
ocfs2_extent_tree
*
et
,
322
struct
ocfs2_path
*
left
,
323
struct
ocfs2_path
*
right
);
324
#endif
/* OCFS2_ALLOC_H */
Generated on Thu Jan 10 2013 14:48:57 for Linux Kernel by
1.8.2