diff options
Diffstat (limited to 'fs/xfs/xfs_btree.h')
-rw-r--r-- | fs/xfs/xfs_btree.h | 392 |
1 files changed, 208 insertions, 184 deletions
diff --git a/fs/xfs/xfs_btree.h b/fs/xfs/xfs_btree.h index 1f528a2a3754..789fffdf8b2f 100644 --- a/fs/xfs/xfs_btree.h +++ b/fs/xfs/xfs_btree.h | |||
@@ -39,39 +39,19 @@ extern kmem_zone_t *xfs_btree_cur_zone; | |||
39 | #define XFS_BTNUM_INO ((xfs_btnum_t)XFS_BTNUM_INOi) | 39 | #define XFS_BTNUM_INO ((xfs_btnum_t)XFS_BTNUM_INOi) |
40 | 40 | ||
41 | /* | 41 | /* |
42 | * Short form header: space allocation btrees. | 42 | * Generic btree header. |
43 | */ | 43 | * |
44 | typedef struct xfs_btree_sblock { | 44 | * This is a comination of the actual format used on disk for short and long |
45 | __be32 bb_magic; /* magic number for block type */ | 45 | * format btrees. The first three fields are shared by both format, but |
46 | __be16 bb_level; /* 0 is a leaf */ | 46 | * the pointers are different and should be used with care. |
47 | __be16 bb_numrecs; /* current # of data records */ | 47 | * |
48 | __be32 bb_leftsib; /* left sibling block or NULLAGBLOCK */ | 48 | * To get the size of the actual short or long form headers please use |
49 | __be32 bb_rightsib; /* right sibling block or NULLAGBLOCK */ | 49 | * the size macros below. Never use sizeof(xfs_btree_block). |
50 | } xfs_btree_sblock_t; | ||
51 | |||
52 | /* | ||
53 | * Long form header: bmap btrees. | ||
54 | */ | ||
55 | typedef struct xfs_btree_lblock { | ||
56 | __be32 bb_magic; /* magic number for block type */ | ||
57 | __be16 bb_level; /* 0 is a leaf */ | ||
58 | __be16 bb_numrecs; /* current # of data records */ | ||
59 | __be64 bb_leftsib; /* left sibling block or NULLDFSBNO */ | ||
60 | __be64 bb_rightsib; /* right sibling block or NULLDFSBNO */ | ||
61 | } xfs_btree_lblock_t; | ||
62 | |||
63 | /* | ||
64 | * Combined header and structure, used by common code. | ||
65 | */ | 50 | */ |
66 | typedef struct xfs_btree_hdr | 51 | struct xfs_btree_block { |
67 | { | ||
68 | __be32 bb_magic; /* magic number for block type */ | 52 | __be32 bb_magic; /* magic number for block type */ |
69 | __be16 bb_level; /* 0 is a leaf */ | 53 | __be16 bb_level; /* 0 is a leaf */ |
70 | __be16 bb_numrecs; /* current # of data records */ | 54 | __be16 bb_numrecs; /* current # of data records */ |
71 | } xfs_btree_hdr_t; | ||
72 | |||
73 | typedef struct xfs_btree_block { | ||
74 | xfs_btree_hdr_t bb_h; /* header */ | ||
75 | union { | 55 | union { |
76 | struct { | 56 | struct { |
77 | __be32 bb_leftsib; | 57 | __be32 bb_leftsib; |
@@ -82,7 +62,36 @@ typedef struct xfs_btree_block { | |||
82 | __be64 bb_rightsib; | 62 | __be64 bb_rightsib; |
83 | } l; /* long form pointers */ | 63 | } l; /* long form pointers */ |
84 | } bb_u; /* rest */ | 64 | } bb_u; /* rest */ |
85 | } xfs_btree_block_t; | 65 | }; |
66 | |||
67 | #define XFS_BTREE_SBLOCK_LEN 16 /* size of a short form block */ | ||
68 | #define XFS_BTREE_LBLOCK_LEN 24 /* size of a long form block */ | ||
69 | |||
70 | |||
71 | /* | ||
72 | * Generic key, ptr and record wrapper structures. | ||
73 | * | ||
74 | * These are disk format structures, and are converted where necessary | ||
75 | * by the btree specific code that needs to interpret them. | ||
76 | */ | ||
77 | union xfs_btree_ptr { | ||
78 | __be32 s; /* short form ptr */ | ||
79 | __be64 l; /* long form ptr */ | ||
80 | }; | ||
81 | |||
82 | union xfs_btree_key { | ||
83 | xfs_bmbt_key_t bmbt; | ||
84 | xfs_bmdr_key_t bmbr; /* bmbt root block */ | ||
85 | xfs_alloc_key_t alloc; | ||
86 | xfs_inobt_key_t inobt; | ||
87 | }; | ||
88 | |||
89 | union xfs_btree_rec { | ||
90 | xfs_bmbt_rec_t bmbt; | ||
91 | xfs_bmdr_rec_t bmbr; /* bmbt root block */ | ||
92 | xfs_alloc_rec_t alloc; | ||
93 | xfs_inobt_rec_t inobt; | ||
94 | }; | ||
86 | 95 | ||
87 | /* | 96 | /* |
88 | * For logging record fields. | 97 | * For logging record fields. |
@@ -96,46 +105,131 @@ typedef struct xfs_btree_block { | |||
96 | #define XFS_BB_ALL_BITS ((1 << XFS_BB_NUM_BITS) - 1) | 105 | #define XFS_BB_ALL_BITS ((1 << XFS_BB_NUM_BITS) - 1) |
97 | 106 | ||
98 | /* | 107 | /* |
99 | * Boolean to select which form of xfs_btree_block_t.bb_u to use. | ||
100 | */ | ||
101 | #define XFS_BTREE_LONG_PTRS(btnum) ((btnum) == XFS_BTNUM_BMAP) | ||
102 | |||
103 | /* | ||
104 | * Magic numbers for btree blocks. | 108 | * Magic numbers for btree blocks. |
105 | */ | 109 | */ |
106 | extern const __uint32_t xfs_magics[]; | 110 | extern const __uint32_t xfs_magics[]; |
107 | 111 | ||
108 | /* | 112 | /* |
109 | * Maximum and minimum records in a btree block. | 113 | * Generic stats interface |
110 | * Given block size, type prefix, and leaf flag (0 or 1). | 114 | */ |
111 | * The divisor below is equivalent to lf ? (e1) : (e2) but that produces | 115 | #define __XFS_BTREE_STATS_INC(type, stat) \ |
112 | * compiler warnings. | 116 | XFS_STATS_INC(xs_ ## type ## _2_ ## stat) |
113 | */ | 117 | #define XFS_BTREE_STATS_INC(cur, stat) \ |
114 | #define XFS_BTREE_BLOCK_MAXRECS(bsz,t,lf) \ | 118 | do { \ |
115 | ((int)(((bsz) - (uint)sizeof(t ## _block_t)) / \ | 119 | switch (cur->bc_btnum) { \ |
116 | (((lf) * (uint)sizeof(t ## _rec_t)) + \ | 120 | case XFS_BTNUM_BNO: __XFS_BTREE_STATS_INC(abtb, stat); break; \ |
117 | ((1 - (lf)) * \ | 121 | case XFS_BTNUM_CNT: __XFS_BTREE_STATS_INC(abtc, stat); break; \ |
118 | ((uint)sizeof(t ## _key_t) + (uint)sizeof(t ## _ptr_t)))))) | 122 | case XFS_BTNUM_BMAP: __XFS_BTREE_STATS_INC(bmbt, stat); break; \ |
119 | #define XFS_BTREE_BLOCK_MINRECS(bsz,t,lf) \ | 123 | case XFS_BTNUM_INO: __XFS_BTREE_STATS_INC(ibt, stat); break; \ |
120 | (XFS_BTREE_BLOCK_MAXRECS(bsz,t,lf) / 2) | 124 | case XFS_BTNUM_MAX: ASSERT(0); /* fucking gcc */ ; break; \ |
121 | 125 | } \ | |
122 | /* | 126 | } while (0) |
123 | * Record, key, and pointer address calculation macros. | 127 | |
124 | * Given block size, type prefix, block pointer, and index of requested entry | 128 | #define __XFS_BTREE_STATS_ADD(type, stat, val) \ |
125 | * (first entry numbered 1). | 129 | XFS_STATS_ADD(xs_ ## type ## _2_ ## stat, val) |
126 | */ | 130 | #define XFS_BTREE_STATS_ADD(cur, stat, val) \ |
127 | #define XFS_BTREE_REC_ADDR(t,bb,i) \ | 131 | do { \ |
128 | ((t ## _rec_t *)((char *)(bb) + sizeof(t ## _block_t) + \ | 132 | switch (cur->bc_btnum) { \ |
129 | ((i) - 1) * sizeof(t ## _rec_t))) | 133 | case XFS_BTNUM_BNO: __XFS_BTREE_STATS_ADD(abtb, stat, val); break; \ |
130 | #define XFS_BTREE_KEY_ADDR(t,bb,i) \ | 134 | case XFS_BTNUM_CNT: __XFS_BTREE_STATS_ADD(abtc, stat, val); break; \ |
131 | ((t ## _key_t *)((char *)(bb) + sizeof(t ## _block_t) + \ | 135 | case XFS_BTNUM_BMAP: __XFS_BTREE_STATS_ADD(bmbt, stat, val); break; \ |
132 | ((i) - 1) * sizeof(t ## _key_t))) | 136 | case XFS_BTNUM_INO: __XFS_BTREE_STATS_ADD(ibt, stat, val); break; \ |
133 | #define XFS_BTREE_PTR_ADDR(t,bb,i,mxr) \ | 137 | case XFS_BTNUM_MAX: ASSERT(0); /* fucking gcc */ ; break; \ |
134 | ((t ## _ptr_t *)((char *)(bb) + sizeof(t ## _block_t) + \ | 138 | } \ |
135 | (mxr) * sizeof(t ## _key_t) + ((i) - 1) * sizeof(t ## _ptr_t))) | 139 | } while (0) |
136 | 140 | ||
137 | #define XFS_BTREE_MAXLEVELS 8 /* max of all btrees */ | 141 | #define XFS_BTREE_MAXLEVELS 8 /* max of all btrees */ |
138 | 142 | ||
143 | struct xfs_btree_ops { | ||
144 | /* size of the key and record structures */ | ||
145 | size_t key_len; | ||
146 | size_t rec_len; | ||
147 | |||
148 | /* cursor operations */ | ||
149 | struct xfs_btree_cur *(*dup_cursor)(struct xfs_btree_cur *); | ||
150 | void (*update_cursor)(struct xfs_btree_cur *src, | ||
151 | struct xfs_btree_cur *dst); | ||
152 | |||
153 | /* update btree root pointer */ | ||
154 | void (*set_root)(struct xfs_btree_cur *cur, | ||
155 | union xfs_btree_ptr *nptr, int level_change); | ||
156 | int (*kill_root)(struct xfs_btree_cur *cur, struct xfs_buf *bp, | ||
157 | int level, union xfs_btree_ptr *newroot); | ||
158 | |||
159 | /* block allocation / freeing */ | ||
160 | int (*alloc_block)(struct xfs_btree_cur *cur, | ||
161 | union xfs_btree_ptr *start_bno, | ||
162 | union xfs_btree_ptr *new_bno, | ||
163 | int length, int *stat); | ||
164 | int (*free_block)(struct xfs_btree_cur *cur, struct xfs_buf *bp); | ||
165 | |||
166 | /* update last record information */ | ||
167 | void (*update_lastrec)(struct xfs_btree_cur *cur, | ||
168 | struct xfs_btree_block *block, | ||
169 | union xfs_btree_rec *rec, | ||
170 | int ptr, int reason); | ||
171 | |||
172 | /* records in block/level */ | ||
173 | int (*get_minrecs)(struct xfs_btree_cur *cur, int level); | ||
174 | int (*get_maxrecs)(struct xfs_btree_cur *cur, int level); | ||
175 | |||
176 | /* records on disk. Matter for the root in inode case. */ | ||
177 | int (*get_dmaxrecs)(struct xfs_btree_cur *cur, int level); | ||
178 | |||
179 | /* init values of btree structures */ | ||
180 | void (*init_key_from_rec)(union xfs_btree_key *key, | ||
181 | union xfs_btree_rec *rec); | ||
182 | void (*init_rec_from_key)(union xfs_btree_key *key, | ||
183 | union xfs_btree_rec *rec); | ||
184 | void (*init_rec_from_cur)(struct xfs_btree_cur *cur, | ||
185 | union xfs_btree_rec *rec); | ||
186 | void (*init_ptr_from_cur)(struct xfs_btree_cur *cur, | ||
187 | union xfs_btree_ptr *ptr); | ||
188 | |||
189 | /* difference between key value and cursor value */ | ||
190 | __int64_t (*key_diff)(struct xfs_btree_cur *cur, | ||
191 | union xfs_btree_key *key); | ||
192 | |||
193 | #ifdef DEBUG | ||
194 | /* check that k1 is lower than k2 */ | ||
195 | int (*keys_inorder)(struct xfs_btree_cur *cur, | ||
196 | union xfs_btree_key *k1, | ||
197 | union xfs_btree_key *k2); | ||
198 | |||
199 | /* check that r1 is lower than r2 */ | ||
200 | int (*recs_inorder)(struct xfs_btree_cur *cur, | ||
201 | union xfs_btree_rec *r1, | ||
202 | union xfs_btree_rec *r2); | ||
203 | #endif | ||
204 | |||
205 | /* btree tracing */ | ||
206 | #ifdef XFS_BTREE_TRACE | ||
207 | void (*trace_enter)(struct xfs_btree_cur *, const char *, | ||
208 | char *, int, int, __psunsigned_t, | ||
209 | __psunsigned_t, __psunsigned_t, | ||
210 | __psunsigned_t, __psunsigned_t, | ||
211 | __psunsigned_t, __psunsigned_t, | ||
212 | __psunsigned_t, __psunsigned_t, | ||
213 | __psunsigned_t, __psunsigned_t); | ||
214 | void (*trace_cursor)(struct xfs_btree_cur *, __uint32_t *, | ||
215 | __uint64_t *, __uint64_t *); | ||
216 | void (*trace_key)(struct xfs_btree_cur *, | ||
217 | union xfs_btree_key *, __uint64_t *, | ||
218 | __uint64_t *); | ||
219 | void (*trace_record)(struct xfs_btree_cur *, | ||
220 | union xfs_btree_rec *, __uint64_t *, | ||
221 | __uint64_t *, __uint64_t *); | ||
222 | #endif | ||
223 | }; | ||
224 | |||
225 | /* | ||
226 | * Reasons for the update_lastrec method to be called. | ||
227 | */ | ||
228 | #define LASTREC_UPDATE 0 | ||
229 | #define LASTREC_INSREC 1 | ||
230 | #define LASTREC_DELREC 2 | ||
231 | |||
232 | |||
139 | /* | 233 | /* |
140 | * Btree cursor structure. | 234 | * Btree cursor structure. |
141 | * This collects all information needed by the btree code in one place. | 235 | * This collects all information needed by the btree code in one place. |
@@ -144,6 +238,8 @@ typedef struct xfs_btree_cur | |||
144 | { | 238 | { |
145 | struct xfs_trans *bc_tp; /* transaction we're in, if any */ | 239 | struct xfs_trans *bc_tp; /* transaction we're in, if any */ |
146 | struct xfs_mount *bc_mp; /* file system mount struct */ | 240 | struct xfs_mount *bc_mp; /* file system mount struct */ |
241 | const struct xfs_btree_ops *bc_ops; | ||
242 | uint bc_flags; /* btree features - below */ | ||
147 | union { | 243 | union { |
148 | xfs_alloc_rec_incore_t a; | 244 | xfs_alloc_rec_incore_t a; |
149 | xfs_bmbt_irec_t b; | 245 | xfs_bmbt_irec_t b; |
@@ -175,94 +271,40 @@ typedef struct xfs_btree_cur | |||
175 | } bc_private; /* per-btree type data */ | 271 | } bc_private; /* per-btree type data */ |
176 | } xfs_btree_cur_t; | 272 | } xfs_btree_cur_t; |
177 | 273 | ||
274 | /* cursor flags */ | ||
275 | #define XFS_BTREE_LONG_PTRS (1<<0) /* pointers are 64bits long */ | ||
276 | #define XFS_BTREE_ROOT_IN_INODE (1<<1) /* root may be variable size */ | ||
277 | #define XFS_BTREE_LASTREC_UPDATE (1<<2) /* track last rec externally */ | ||
278 | |||
279 | |||
178 | #define XFS_BTREE_NOERROR 0 | 280 | #define XFS_BTREE_NOERROR 0 |
179 | #define XFS_BTREE_ERROR 1 | 281 | #define XFS_BTREE_ERROR 1 |
180 | 282 | ||
181 | /* | 283 | /* |
182 | * Convert from buffer to btree block header. | 284 | * Convert from buffer to btree block header. |
183 | */ | 285 | */ |
184 | #define XFS_BUF_TO_BLOCK(bp) ((xfs_btree_block_t *)XFS_BUF_PTR(bp)) | 286 | #define XFS_BUF_TO_BLOCK(bp) ((struct xfs_btree_block *)XFS_BUF_PTR(bp)) |
185 | #define XFS_BUF_TO_LBLOCK(bp) ((xfs_btree_lblock_t *)XFS_BUF_PTR(bp)) | ||
186 | #define XFS_BUF_TO_SBLOCK(bp) ((xfs_btree_sblock_t *)XFS_BUF_PTR(bp)) | ||
187 | 287 | ||
188 | 288 | ||
189 | #ifdef __KERNEL__ | ||
190 | |||
191 | #ifdef DEBUG | ||
192 | /* | 289 | /* |
193 | * Debug routine: check that block header is ok. | 290 | * Check that block header is ok. |
194 | */ | 291 | */ |
195 | void | 292 | int |
196 | xfs_btree_check_block( | 293 | xfs_btree_check_block( |
197 | xfs_btree_cur_t *cur, /* btree cursor */ | 294 | struct xfs_btree_cur *cur, /* btree cursor */ |
198 | xfs_btree_block_t *block, /* generic btree block pointer */ | 295 | struct xfs_btree_block *block, /* generic btree block pointer */ |
199 | int level, /* level of the btree block */ | ||
200 | struct xfs_buf *bp); /* buffer containing block, if any */ | ||
201 | |||
202 | /* | ||
203 | * Debug routine: check that keys are in the right order. | ||
204 | */ | ||
205 | void | ||
206 | xfs_btree_check_key( | ||
207 | xfs_btnum_t btnum, /* btree identifier */ | ||
208 | void *ak1, /* pointer to left (lower) key */ | ||
209 | void *ak2); /* pointer to right (higher) key */ | ||
210 | |||
211 | /* | ||
212 | * Debug routine: check that records are in the right order. | ||
213 | */ | ||
214 | void | ||
215 | xfs_btree_check_rec( | ||
216 | xfs_btnum_t btnum, /* btree identifier */ | ||
217 | void *ar1, /* pointer to left (lower) record */ | ||
218 | void *ar2); /* pointer to right (higher) record */ | ||
219 | #else | ||
220 | #define xfs_btree_check_block(a,b,c,d) | ||
221 | #define xfs_btree_check_key(a,b,c) | ||
222 | #define xfs_btree_check_rec(a,b,c) | ||
223 | #endif /* DEBUG */ | ||
224 | |||
225 | /* | ||
226 | * Checking routine: check that long form block header is ok. | ||
227 | */ | ||
228 | int /* error (0 or EFSCORRUPTED) */ | ||
229 | xfs_btree_check_lblock( | ||
230 | xfs_btree_cur_t *cur, /* btree cursor */ | ||
231 | xfs_btree_lblock_t *block, /* btree long form block pointer */ | ||
232 | int level, /* level of the btree block */ | 296 | int level, /* level of the btree block */ |
233 | struct xfs_buf *bp); /* buffer containing block, if any */ | 297 | struct xfs_buf *bp); /* buffer containing block, if any */ |
234 | 298 | ||
235 | /* | 299 | /* |
236 | * Checking routine: check that (long) pointer is ok. | 300 | * Check that (long) pointer is ok. |
237 | */ | 301 | */ |
238 | int /* error (0 or EFSCORRUPTED) */ | 302 | int /* error (0 or EFSCORRUPTED) */ |
239 | xfs_btree_check_lptr( | 303 | xfs_btree_check_lptr( |
240 | xfs_btree_cur_t *cur, /* btree cursor */ | 304 | struct xfs_btree_cur *cur, /* btree cursor */ |
241 | xfs_dfsbno_t ptr, /* btree block disk address */ | 305 | xfs_dfsbno_t ptr, /* btree block disk address */ |
242 | int level); /* btree block level */ | 306 | int level); /* btree block level */ |
243 | 307 | ||
244 | #define xfs_btree_check_lptr_disk(cur, ptr, level) \ | ||
245 | xfs_btree_check_lptr(cur, be64_to_cpu(ptr), level) | ||
246 | |||
247 | /* | ||
248 | * Checking routine: check that short form block header is ok. | ||
249 | */ | ||
250 | int /* error (0 or EFSCORRUPTED) */ | ||
251 | xfs_btree_check_sblock( | ||
252 | xfs_btree_cur_t *cur, /* btree cursor */ | ||
253 | xfs_btree_sblock_t *block, /* btree short form block pointer */ | ||
254 | int level, /* level of the btree block */ | ||
255 | struct xfs_buf *bp); /* buffer containing block */ | ||
256 | |||
257 | /* | ||
258 | * Checking routine: check that (short) pointer is ok. | ||
259 | */ | ||
260 | int /* error (0 or EFSCORRUPTED) */ | ||
261 | xfs_btree_check_sptr( | ||
262 | xfs_btree_cur_t *cur, /* btree cursor */ | ||
263 | xfs_agblock_t ptr, /* btree block disk address */ | ||
264 | int level); /* btree block level */ | ||
265 | |||
266 | /* | 308 | /* |
267 | * Delete the btree cursor. | 309 | * Delete the btree cursor. |
268 | */ | 310 | */ |
@@ -281,15 +323,6 @@ xfs_btree_dup_cursor( | |||
281 | xfs_btree_cur_t **ncur);/* output cursor */ | 323 | xfs_btree_cur_t **ncur);/* output cursor */ |
282 | 324 | ||
283 | /* | 325 | /* |
284 | * Change the cursor to point to the first record in the current block | ||
285 | * at the given level. Other levels are unaffected. | ||
286 | */ | ||
287 | int /* success=1, failure=0 */ | ||
288 | xfs_btree_firstrec( | ||
289 | xfs_btree_cur_t *cur, /* btree cursor */ | ||
290 | int level); /* level to change */ | ||
291 | |||
292 | /* | ||
293 | * Get a buffer for the block, return it with no data read. | 326 | * Get a buffer for the block, return it with no data read. |
294 | * Long-form addressing. | 327 | * Long-form addressing. |
295 | */ | 328 | */ |
@@ -313,20 +346,6 @@ xfs_btree_get_bufs( | |||
313 | uint lock); /* lock flags for get_buf */ | 346 | uint lock); /* lock flags for get_buf */ |
314 | 347 | ||
315 | /* | 348 | /* |
316 | * Allocate a new btree cursor. | ||
317 | * The cursor is either for allocation (A) or bmap (B). | ||
318 | */ | ||
319 | xfs_btree_cur_t * /* new btree cursor */ | ||
320 | xfs_btree_init_cursor( | ||
321 | struct xfs_mount *mp, /* file system mount point */ | ||
322 | struct xfs_trans *tp, /* transaction pointer */ | ||
323 | struct xfs_buf *agbp, /* (A only) buffer for agf structure */ | ||
324 | xfs_agnumber_t agno, /* (A only) allocation group number */ | ||
325 | xfs_btnum_t btnum, /* btree identifier */ | ||
326 | struct xfs_inode *ip, /* (B only) inode owning the btree */ | ||
327 | int whichfork); /* (B only) data/attr fork */ | ||
328 | |||
329 | /* | ||
330 | * Check for the cursor referring to the last block at the given level. | 349 | * Check for the cursor referring to the last block at the given level. |
331 | */ | 350 | */ |
332 | int /* 1=is last block, 0=not last block */ | 351 | int /* 1=is last block, 0=not last block */ |
@@ -335,15 +354,6 @@ xfs_btree_islastblock( | |||
335 | int level); /* level to check */ | 354 | int level); /* level to check */ |
336 | 355 | ||
337 | /* | 356 | /* |
338 | * Change the cursor to point to the last record in the current block | ||
339 | * at the given level. Other levels are unaffected. | ||
340 | */ | ||
341 | int /* success=1, failure=0 */ | ||
342 | xfs_btree_lastrec( | ||
343 | xfs_btree_cur_t *cur, /* btree cursor */ | ||
344 | int level); /* level to change */ | ||
345 | |||
346 | /* | ||
347 | * Compute first and last byte offsets for the fields given. | 357 | * Compute first and last byte offsets for the fields given. |
348 | * Interprets the offsets table, which contains struct field offsets. | 358 | * Interprets the offsets table, which contains struct field offsets. |
349 | */ | 359 | */ |
@@ -404,39 +414,53 @@ xfs_btree_reada_bufs( | |||
404 | xfs_extlen_t count); /* count of filesystem blocks */ | 414 | xfs_extlen_t count); /* count of filesystem blocks */ |
405 | 415 | ||
406 | /* | 416 | /* |
407 | * Read-ahead btree blocks, at the given level. | 417 | * Set the buffer for level "lev" in the cursor to bp, releasing |
408 | * Bits in lr are set from XFS_BTCUR_{LEFT,RIGHT}RA. | 418 | * any previous buffer. |
409 | */ | 419 | */ |
410 | int /* readahead block count */ | 420 | void |
411 | xfs_btree_readahead_core( | 421 | xfs_btree_setbuf( |
412 | xfs_btree_cur_t *cur, /* btree cursor */ | 422 | xfs_btree_cur_t *cur, /* btree cursor */ |
413 | int lev, /* level in btree */ | 423 | int lev, /* level in btree */ |
414 | int lr); /* left/right bits */ | 424 | struct xfs_buf *bp); /* new buffer to set */ |
415 | 425 | ||
416 | static inline int /* readahead block count */ | ||
417 | xfs_btree_readahead( | ||
418 | xfs_btree_cur_t *cur, /* btree cursor */ | ||
419 | int lev, /* level in btree */ | ||
420 | int lr) /* left/right bits */ | ||
421 | { | ||
422 | if ((cur->bc_ra[lev] | lr) == cur->bc_ra[lev]) | ||
423 | return 0; | ||
424 | 426 | ||
425 | return xfs_btree_readahead_core(cur, lev, lr); | 427 | /* |
426 | } | 428 | * Common btree core entry points. |
429 | */ | ||
430 | int xfs_btree_increment(struct xfs_btree_cur *, int, int *); | ||
431 | int xfs_btree_decrement(struct xfs_btree_cur *, int, int *); | ||
432 | int xfs_btree_lookup(struct xfs_btree_cur *, xfs_lookup_t, int *); | ||
433 | int xfs_btree_update(struct xfs_btree_cur *, union xfs_btree_rec *); | ||
434 | int xfs_btree_new_iroot(struct xfs_btree_cur *, int *, int *); | ||
435 | int xfs_btree_kill_iroot(struct xfs_btree_cur *); | ||
436 | int xfs_btree_insert(struct xfs_btree_cur *, int *); | ||
437 | int xfs_btree_delete(struct xfs_btree_cur *, int *); | ||
438 | int xfs_btree_get_rec(struct xfs_btree_cur *, union xfs_btree_rec **, int *); | ||
427 | 439 | ||
440 | /* | ||
441 | * Internal btree helpers also used by xfs_bmap.c. | ||
442 | */ | ||
443 | void xfs_btree_log_block(struct xfs_btree_cur *, struct xfs_buf *, int); | ||
444 | void xfs_btree_log_recs(struct xfs_btree_cur *, struct xfs_buf *, int, int); | ||
428 | 445 | ||
429 | /* | 446 | /* |
430 | * Set the buffer for level "lev" in the cursor to bp, releasing | 447 | * Helpers. |
431 | * any previous buffer. | ||
432 | */ | 448 | */ |
433 | void | 449 | static inline int xfs_btree_get_numrecs(struct xfs_btree_block *block) |
434 | xfs_btree_setbuf( | 450 | { |
435 | xfs_btree_cur_t *cur, /* btree cursor */ | 451 | return be16_to_cpu(block->bb_numrecs); |
436 | int lev, /* level in btree */ | 452 | } |
437 | struct xfs_buf *bp); /* new buffer to set */ | 453 | |
454 | static inline void xfs_btree_set_numrecs(struct xfs_btree_block *block, | ||
455 | __uint16_t numrecs) | ||
456 | { | ||
457 | block->bb_numrecs = cpu_to_be16(numrecs); | ||
458 | } | ||
438 | 459 | ||
439 | #endif /* __KERNEL__ */ | 460 | static inline int xfs_btree_get_level(struct xfs_btree_block *block) |
461 | { | ||
462 | return be16_to_cpu(block->bb_level); | ||
463 | } | ||
440 | 464 | ||
441 | 465 | ||
442 | /* | 466 | /* |