]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/blame - include/xfs_bmap_btree.h
Undoes mod: xfs-cmds:slinx:120772a
[thirdparty/xfsprogs-dev.git] / include / xfs_bmap_btree.h
CommitLineData
2bd0ea18 1/*
9911e5dc 2 * Copyright (c) 2000 Silicon Graphics, Inc. All Rights Reserved.
2bd0ea18
NS
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of version 2 of the GNU General Public License as
6 * published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it would be useful, but
9 * WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11 *
12 * Further, this software is distributed without any warranty that it is
13 * free of the rightful claim of any third person regarding infringement
14 * or the like. Any license provided herein, whether implied or
15 * otherwise, applies only to this software file. Patent licenses, if
16 * any, provided herein do not apply to combinations of this program with
17 * other software, or any other product whatsoever.
18 *
19 * You should have received a copy of the GNU General Public License along
20 * with this program; if not, write the Free Software Foundation, Inc., 59
21 * Temple Place - Suite 330, Boston MA 02111-1307, USA.
22 *
23 * Contact information: Silicon Graphics, Inc., 1600 Amphitheatre Pkwy,
24 * Mountain View, CA 94043, or:
25 *
26 * http://www.sgi.com
27 *
28 * For further information regarding this notice, see:
29 *
30 * http://oss.sgi.com/projects/GenInfo/SGIGPLNoticeExplan/
31 */
32#ifndef __XFS_BMAP_BTREE_H__
33#define __XFS_BMAP_BTREE_H__
34
35#define XFS_BMAP_MAGIC 0x424d4150 /* 'BMAP' */
36
37struct xfs_btree_cur;
38struct xfs_btree_lblock;
39struct xfs_mount;
40struct xfs_inode;
41
42/*
43 * Bmap root header, on-disk form only.
44 */
45typedef struct xfs_bmdr_block
46{
47 __uint16_t bb_level; /* 0 is a leaf */
48 __uint16_t bb_numrecs; /* current # of data records */
49} xfs_bmdr_block_t;
50
51/*
52 * Bmap btree record and extent descriptor.
53 * For 32-bit kernels,
54 * l0:31 is an extent flag (value 1 indicates non-normal).
55 * l0:0-30 and l1:9-31 are startoff.
56 * l1:0-8, l2:0-31, and l3:21-31 are startblock.
57 * l3:0-20 are blockcount.
58 * For 64-bit kernels,
59 * l0:63 is an extent flag (value 1 indicates non-normal).
60 * l0:9-62 are startoff.
61 * l0:0-8 and l1:21-63 are startblock.
62 * l1:0-20 are blockcount.
63 */
64
65#if __BYTE_ORDER == __LITTLE_ENDIAN
66
67#define BMBT_TOTAL_BITLEN 128 /* 128 bits, 16 bytes */
68#define BMBT_EXNTFLAG_BITOFF 0
69#define BMBT_EXNTFLAG_BITLEN 1
70#define BMBT_STARTOFF_BITOFF (BMBT_EXNTFLAG_BITOFF + BMBT_EXNTFLAG_BITLEN)
71#define BMBT_STARTOFF_BITLEN 54
72#define BMBT_STARTBLOCK_BITOFF (BMBT_STARTOFF_BITOFF + BMBT_STARTOFF_BITLEN)
73#define BMBT_STARTBLOCK_BITLEN 52
74#define BMBT_BLOCKCOUNT_BITOFF \
75 (BMBT_STARTBLOCK_BITOFF + BMBT_STARTBLOCK_BITLEN)
76#define BMBT_BLOCKCOUNT_BITLEN (BMBT_TOTAL_BITLEN - BMBT_BLOCKCOUNT_BITOFF)
77
78#else
79
80#define BMBT_TOTAL_BITLEN 128 /* 128 bits, 16 bytes */
81#define BMBT_EXNTFLAG_BITOFF 63
82#define BMBT_EXNTFLAG_BITLEN 1
83#define BMBT_STARTOFF_BITOFF (BMBT_EXNTFLAG_BITOFF - BMBT_STARTOFF_BITLEN)
84#define BMBT_STARTOFF_BITLEN 54
85#define BMBT_STARTBLOCK_BITOFF 85 /* 128 - 43 (other 9 is in first word) */
86#define BMBT_STARTBLOCK_BITLEN 52
87#define BMBT_BLOCKCOUNT_BITOFF 64 /* Start of second 64 bit container */
88#define BMBT_BLOCKCOUNT_BITLEN 21
89
90#endif
91
92
93#define BMBT_USE_64 1
94
95typedef struct xfs_bmbt_rec_32
96{
97 __uint32_t l0, l1, l2, l3;
98} xfs_bmbt_rec_32_t;
99typedef struct xfs_bmbt_rec_64
100{
101 __uint64_t l0, l1;
102} xfs_bmbt_rec_64_t;
103
104#if BMBT_USE_64
105typedef __uint64_t xfs_bmbt_rec_base_t; /* use this for casts */
106typedef xfs_bmbt_rec_64_t xfs_bmbt_rec_t, xfs_bmdr_rec_t;
107#else /* !BMBT_USE_64 */
108typedef __uint32_t xfs_bmbt_rec_base_t; /* use this for casts */
109typedef xfs_bmbt_rec_32_t xfs_bmbt_rec_t, xfs_bmdr_rec_t;
110#endif /* BMBT_USE_64 */
111
112/*
113 * Values and macros for delayed-allocation startblock fields.
114 */
115#define STARTBLOCKVALBITS 17
116#define STARTBLOCKMASKBITS (15 + XFS_BIG_FILESYSTEMS * 20)
117#define DSTARTBLOCKMASKBITS (15 + 20)
118#define STARTBLOCKMASK \
119 (((((xfs_fsblock_t)1) << STARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS)
120#define DSTARTBLOCKMASK \
121 (((((xfs_dfsbno_t)1) << DSTARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS)
122#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_ISNULLSTARTBLOCK)
123int isnullstartblock(xfs_fsblock_t x);
124#define ISNULLSTARTBLOCK(x) isnullstartblock(x)
125#else
126#define ISNULLSTARTBLOCK(x) (((x) & STARTBLOCKMASK) == STARTBLOCKMASK)
127#endif
128#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_ISNULLDSTARTBLOCK)
129int isnulldstartblock(xfs_dfsbno_t x);
130#define ISNULLDSTARTBLOCK(x) isnulldstartblock(x)
131#else
132#define ISNULLDSTARTBLOCK(x) (((x) & DSTARTBLOCKMASK) == DSTARTBLOCKMASK)
133#endif
134#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_NULLSTARTBLOCK)
135xfs_fsblock_t nullstartblock(int k);
136#define NULLSTARTBLOCK(k) nullstartblock(k)
137#else
138#define NULLSTARTBLOCK(k) \
139 ((ASSERT(k < (1 << STARTBLOCKVALBITS))), (STARTBLOCKMASK | (k)))
140#endif
141#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_STARTBLOCKVAL)
142xfs_filblks_t startblockval(xfs_fsblock_t x);
143#define STARTBLOCKVAL(x) startblockval(x)
144#else
145#define STARTBLOCKVAL(x) ((xfs_filblks_t)((x) & ~STARTBLOCKMASK))
146#endif
147
148/*
149 * Possible extent formats.
150 */
151typedef enum {
152 XFS_EXTFMT_NOSTATE = 0,
153 XFS_EXTFMT_HASSTATE
154} xfs_exntfmt_t;
155
156/*
157 * Possible extent states.
158 */
159typedef enum {
160 XFS_EXT_NORM, XFS_EXT_UNWRITTEN,
161 XFS_EXT_DMAPI_OFFLINE
162} xfs_exntst_t;
163
164/*
165 * Extent state and extent format macros.
166 */
167#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_EXTFMT_INODE )
168xfs_exntfmt_t xfs_extfmt_inode(struct xfs_inode *ip);
169#define XFS_EXTFMT_INODE(x) xfs_extfmt_inode(x)
170#else
171#define XFS_EXTFMT_INODE(x) \
172 (XFS_SB_VERSION_HASEXTFLGBIT(&((x)->i_mount->m_sb)) ? \
173 XFS_EXTFMT_HASSTATE : XFS_EXTFMT_NOSTATE)
174#endif
175#define ISUNWRITTEN(x) ((x) == XFS_EXT_UNWRITTEN)
176
177/*
178 * Incore version of above.
179 */
180typedef struct xfs_bmbt_irec
181{
182 xfs_fileoff_t br_startoff; /* starting file offset */
183 xfs_fsblock_t br_startblock; /* starting block number */
184 xfs_filblks_t br_blockcount; /* number of blocks */
185 xfs_exntst_t br_state; /* extent state */
186} xfs_bmbt_irec_t;
187
188/*
189 * Key structure for non-leaf levels of the tree.
190 */
191typedef struct xfs_bmbt_key
192{
193 xfs_dfiloff_t br_startoff; /* starting file offset */
194} xfs_bmbt_key_t, xfs_bmdr_key_t;
195
196typedef xfs_dfsbno_t xfs_bmbt_ptr_t, xfs_bmdr_ptr_t; /* btree pointer type */
197 /* btree block header type */
198typedef struct xfs_btree_lblock xfs_bmbt_block_t;
199
200#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BUF_TO_BMBT_BLOCK)
201xfs_bmbt_block_t *xfs_buf_to_bmbt_block(struct xfs_buf *bp);
202#define XFS_BUF_TO_BMBT_BLOCK(bp) xfs_buf_to_bmbt_block(bp)
203#else
204#define XFS_BUF_TO_BMBT_BLOCK(bp) ((xfs_bmbt_block_t *)(XFS_BUF_PTR(bp)))
205#endif
206
207#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_RBLOCK_DSIZE)
208int xfs_bmap_rblock_dsize(int lev, struct xfs_btree_cur *cur);
209#define XFS_BMAP_RBLOCK_DSIZE(lev,cur) xfs_bmap_rblock_dsize(lev,cur)
210#else
211#define XFS_BMAP_RBLOCK_DSIZE(lev,cur) ((cur)->bc_private.b.forksize)
212#endif
213#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_RBLOCK_ISIZE)
214int xfs_bmap_rblock_isize(int lev, struct xfs_btree_cur *cur);
215#define XFS_BMAP_RBLOCK_ISIZE(lev,cur) xfs_bmap_rblock_isize(lev,cur)
216#else
217#define XFS_BMAP_RBLOCK_ISIZE(lev,cur) \
218 ((int)XFS_IFORK_PTR((cur)->bc_private.b.ip, \
219 (cur)->bc_private.b.whichfork)->if_broot_bytes)
220#endif
221#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_IBLOCK_SIZE)
222int xfs_bmap_iblock_size(int lev, struct xfs_btree_cur *cur);
223#define XFS_BMAP_IBLOCK_SIZE(lev,cur) xfs_bmap_iblock_size(lev,cur)
224#else
225#define XFS_BMAP_IBLOCK_SIZE(lev,cur) (1 << (cur)->bc_blocklog)
226#endif
227
228#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_BLOCK_DSIZE)
229int xfs_bmap_block_dsize(int lev, struct xfs_btree_cur *cur);
230#define XFS_BMAP_BLOCK_DSIZE(lev,cur) xfs_bmap_block_dsize(lev,cur)
231#else
232#define XFS_BMAP_BLOCK_DSIZE(lev,cur) \
233 ((lev) == (cur)->bc_nlevels - 1 ? \
234 XFS_BMAP_RBLOCK_DSIZE(lev,cur) : \
235 XFS_BMAP_IBLOCK_SIZE(lev,cur))
236#endif
237#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_BLOCK_ISIZE)
238int xfs_bmap_block_isize(int lev, struct xfs_btree_cur *cur);
239#define XFS_BMAP_BLOCK_ISIZE(lev,cur) xfs_bmap_block_isize(lev,cur)
240#else
241#define XFS_BMAP_BLOCK_ISIZE(lev,cur) \
242 ((lev) == (cur)->bc_nlevels - 1 ? \
243 XFS_BMAP_RBLOCK_ISIZE(lev,cur) : \
244 XFS_BMAP_IBLOCK_SIZE(lev,cur))
245#endif
246
247#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_BLOCK_DMAXRECS)
248int xfs_bmap_block_dmaxrecs(int lev, struct xfs_btree_cur *cur);
249#define XFS_BMAP_BLOCK_DMAXRECS(lev,cur) xfs_bmap_block_dmaxrecs(lev,cur)
250#else
251#define XFS_BMAP_BLOCK_DMAXRECS(lev,cur) \
252 ((lev) == (cur)->bc_nlevels - 1 ? \
253 XFS_BTREE_BLOCK_MAXRECS(XFS_BMAP_RBLOCK_DSIZE(lev,cur), \
254 xfs_bmdr, (lev) == 0) : \
255 ((cur)->bc_mp->m_bmap_dmxr[(lev) != 0]))
256#endif
257#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_BLOCK_IMAXRECS)
258int xfs_bmap_block_imaxrecs(int lev, struct xfs_btree_cur *cur);
259#define XFS_BMAP_BLOCK_IMAXRECS(lev,cur) xfs_bmap_block_imaxrecs(lev,cur)
260#else
261#define XFS_BMAP_BLOCK_IMAXRECS(lev,cur) \
262 ((lev) == (cur)->bc_nlevels - 1 ? \
263 XFS_BTREE_BLOCK_MAXRECS(XFS_BMAP_RBLOCK_ISIZE(lev,cur), \
264 xfs_bmbt, (lev) == 0) : \
265 ((cur)->bc_mp->m_bmap_dmxr[(lev) != 0]))
266#endif
267
268#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_BLOCK_DMINRECS)
269int xfs_bmap_block_dminrecs(int lev, struct xfs_btree_cur *cur);
270#define XFS_BMAP_BLOCK_DMINRECS(lev,cur) xfs_bmap_block_dminrecs(lev,cur)
271#else
272#define XFS_BMAP_BLOCK_DMINRECS(lev,cur) \
273 ((lev) == (cur)->bc_nlevels - 1 ? \
274 XFS_BTREE_BLOCK_MINRECS(XFS_BMAP_RBLOCK_DSIZE(lev,cur), \
275 xfs_bmdr, (lev) == 0) : \
276 ((cur)->bc_mp->m_bmap_dmnr[(lev) != 0]))
277#endif
278#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_BLOCK_IMINRECS)
279int xfs_bmap_block_iminrecs(int lev, struct xfs_btree_cur *cur);
280#define XFS_BMAP_BLOCK_IMINRECS(lev,cur) xfs_bmap_block_iminrecs(lev,cur)
281#else
282#define XFS_BMAP_BLOCK_IMINRECS(lev,cur) \
283 ((lev) == (cur)->bc_nlevels - 1 ? \
284 XFS_BTREE_BLOCK_MINRECS(XFS_BMAP_RBLOCK_ISIZE(lev,cur), \
285 xfs_bmbt, (lev) == 0) : \
286 ((cur)->bc_mp->m_bmap_dmnr[(lev) != 0]))
287#endif
288
289#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_REC_DADDR)
290xfs_bmbt_rec_t *
291xfs_bmap_rec_daddr(xfs_bmbt_block_t *bb, int i, struct xfs_btree_cur *cur);
292#define XFS_BMAP_REC_DADDR(bb,i,cur) xfs_bmap_rec_daddr(bb,i,cur)
293#else
294#define XFS_BMAP_REC_DADDR(bb,i,cur) \
295 XFS_BTREE_REC_ADDR(XFS_BMAP_BLOCK_DSIZE( \
296 INT_GET((bb)->bb_level, ARCH_CONVERT), cur), \
297 xfs_bmbt, bb, i, XFS_BMAP_BLOCK_DMAXRECS( \
298 INT_GET((bb)->bb_level, ARCH_CONVERT), cur))
299#endif
300#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_REC_IADDR)
301xfs_bmbt_rec_t *
302xfs_bmap_rec_iaddr(xfs_bmbt_block_t *bb, int i, struct xfs_btree_cur *cur);
303#define XFS_BMAP_REC_IADDR(bb,i,cur) xfs_bmap_rec_iaddr(bb,i,cur)
304#else
305#define XFS_BMAP_REC_IADDR(bb,i,cur) \
306 XFS_BTREE_REC_ADDR(XFS_BMAP_BLOCK_ISIZE( \
307 INT_GET((bb)->bb_level, ARCH_CONVERT), cur), \
308 xfs_bmbt, bb, i, XFS_BMAP_BLOCK_IMAXRECS( \
309 INT_GET((bb)->bb_level, ARCH_CONVERT), cur))
310#endif
311
312#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_KEY_DADDR)
313xfs_bmbt_key_t *
314xfs_bmap_key_daddr(xfs_bmbt_block_t *bb, int i, struct xfs_btree_cur *cur);
315#define XFS_BMAP_KEY_DADDR(bb,i,cur) xfs_bmap_key_daddr(bb,i,cur)
316#else
317#define XFS_BMAP_KEY_DADDR(bb,i,cur) \
318 XFS_BTREE_KEY_ADDR(XFS_BMAP_BLOCK_DSIZE( \
319 INT_GET((bb)->bb_level, ARCH_CONVERT), cur), \
320 xfs_bmbt, bb, i, XFS_BMAP_BLOCK_DMAXRECS( \
321 INT_GET((bb)->bb_level, ARCH_CONVERT), cur))
322#endif
323#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_KEY_IADDR)
324xfs_bmbt_key_t *
325xfs_bmap_key_iaddr(xfs_bmbt_block_t *bb, int i, struct xfs_btree_cur *cur);
326#define XFS_BMAP_KEY_IADDR(bb,i,cur) xfs_bmap_key_iaddr(bb,i,cur)
327#else
328#define XFS_BMAP_KEY_IADDR(bb,i,cur) \
329 XFS_BTREE_KEY_ADDR(XFS_BMAP_BLOCK_ISIZE( \
330 INT_GET((bb)->bb_level, ARCH_CONVERT), cur), \
331 xfs_bmbt, bb, i, XFS_BMAP_BLOCK_IMAXRECS( \
332 INT_GET((bb)->bb_level, ARCH_CONVERT), cur))
333#endif
334
335#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_PTR_DADDR)
336xfs_bmbt_ptr_t *
337xfs_bmap_ptr_daddr(xfs_bmbt_block_t *bb, int i, struct xfs_btree_cur *cur);
338#define XFS_BMAP_PTR_DADDR(bb,i,cur) xfs_bmap_ptr_daddr(bb,i,cur)
339#else
340#define XFS_BMAP_PTR_DADDR(bb,i,cur) \
341 XFS_BTREE_PTR_ADDR(XFS_BMAP_BLOCK_DSIZE( \
342 INT_GET((bb)->bb_level, ARCH_CONVERT), cur), \
343 xfs_bmbt, bb, i, XFS_BMAP_BLOCK_DMAXRECS( \
344 INT_GET((bb)->bb_level, ARCH_CONVERT), cur))
345#endif
346#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_PTR_IADDR)
347xfs_bmbt_ptr_t *
348xfs_bmap_ptr_iaddr(xfs_bmbt_block_t *bb, int i, struct xfs_btree_cur *cur);
349#define XFS_BMAP_PTR_IADDR(bb,i,cur) xfs_bmap_ptr_iaddr(bb,i,cur)
350#else
351#define XFS_BMAP_PTR_IADDR(bb,i,cur) \
352 XFS_BTREE_PTR_ADDR(XFS_BMAP_BLOCK_ISIZE( \
353 INT_GET((bb)->bb_level, ARCH_CONVERT), cur), \
354 xfs_bmbt, bb, i, XFS_BMAP_BLOCK_IMAXRECS( \
355 INT_GET((bb)->bb_level, ARCH_CONVERT), cur))
356#endif
357
358/*
359 * These are to be used when we know the size of the block and
360 * we don't have a cursor.
361 */
362#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_BROOT_REC_ADDR)
363xfs_bmbt_rec_t *xfs_bmap_broot_rec_addr(xfs_bmbt_block_t *bb, int i, int sz);
364#define XFS_BMAP_BROOT_REC_ADDR(bb,i,sz) xfs_bmap_broot_rec_addr(bb,i,sz)
365#else
366#define XFS_BMAP_BROOT_REC_ADDR(bb,i,sz) \
367 XFS_BTREE_REC_ADDR(sz,xfs_bmbt,bb,i,XFS_BMAP_BROOT_MAXRECS(sz))
368#endif
369#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_BROOT_KEY_ADDR)
370xfs_bmbt_key_t *xfs_bmap_broot_key_addr(xfs_bmbt_block_t *bb, int i, int sz);
371#define XFS_BMAP_BROOT_KEY_ADDR(bb,i,sz) xfs_bmap_broot_key_addr(bb,i,sz)
372#else
373#define XFS_BMAP_BROOT_KEY_ADDR(bb,i,sz) \
374 XFS_BTREE_KEY_ADDR(sz,xfs_bmbt,bb,i,XFS_BMAP_BROOT_MAXRECS(sz))
375#endif
376#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_BROOT_PTR_ADDR)
377xfs_bmbt_ptr_t *xfs_bmap_broot_ptr_addr(xfs_bmbt_block_t *bb, int i, int sz);
378#define XFS_BMAP_BROOT_PTR_ADDR(bb,i,sz) xfs_bmap_broot_ptr_addr(bb,i,sz)
379#else
380#define XFS_BMAP_BROOT_PTR_ADDR(bb,i,sz) \
381 XFS_BTREE_PTR_ADDR(sz,xfs_bmbt,bb,i,XFS_BMAP_BROOT_MAXRECS(sz))
382#endif
383
384#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_BROOT_NUMRECS)
385int xfs_bmap_broot_numrecs(xfs_bmdr_block_t *bb);
386#define XFS_BMAP_BROOT_NUMRECS(bb) xfs_bmap_broot_numrecs(bb)
387#else
388#define XFS_BMAP_BROOT_NUMRECS(bb) (INT_GET((bb)->bb_numrecs, ARCH_CONVERT))
389#endif
390#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_BROOT_MAXRECS)
391int xfs_bmap_broot_maxrecs(int sz);
392#define XFS_BMAP_BROOT_MAXRECS(sz) xfs_bmap_broot_maxrecs(sz)
393#else
394#define XFS_BMAP_BROOT_MAXRECS(sz) XFS_BTREE_BLOCK_MAXRECS(sz,xfs_bmbt,0)
395#endif
396#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_BROOT_SPACE_CALC)
397int xfs_bmap_broot_space_calc(int nrecs);
398#define XFS_BMAP_BROOT_SPACE_CALC(nrecs) xfs_bmap_broot_space_calc(nrecs)
399#else
400#define XFS_BMAP_BROOT_SPACE_CALC(nrecs) \
401 ((int)(sizeof(xfs_bmbt_block_t) + \
402 ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t)))))
403#endif
404#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_BROOT_SPACE)
405int xfs_bmap_broot_space(xfs_bmdr_block_t *bb);
406#define XFS_BMAP_BROOT_SPACE(bb) xfs_bmap_broot_space(bb)
407#else
408#define XFS_BMAP_BROOT_SPACE(bb) \
409 XFS_BMAP_BROOT_SPACE_CALC(INT_GET((bb)->bb_numrecs, ARCH_CONVERT))
410#endif
411#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMDR_SPACE_CALC)
412int xfs_bmdr_space_calc(int nrecs);
413#define XFS_BMDR_SPACE_CALC(nrecs) xfs_bmdr_space_calc(nrecs)
414#else
415#define XFS_BMDR_SPACE_CALC(nrecs) \
416 ((int)(sizeof(xfs_bmdr_block_t) + \
417 ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t)))))
418#endif
419
420/*
421 * Maximum number of bmap btree levels.
422 */
423#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BM_MAXLEVELS)
424int xfs_bm_maxlevels(struct xfs_mount *mp, int w);
425#define XFS_BM_MAXLEVELS(mp,w) xfs_bm_maxlevels(mp,w)
426#else
427#define XFS_BM_MAXLEVELS(mp,w) ((mp)->m_bm_maxlevels[w])
428#endif
429
430#if XFS_WANT_FUNCS || (XFS_WANT_SPACE && XFSSO_XFS_BMAP_SANITY_CHECK)
431int xfs_bmap_sanity_check(struct xfs_mount *mp, xfs_bmbt_block_t *bb,
432 int level);
433#define XFS_BMAP_SANITY_CHECK(mp,bb,level) \
434 xfs_bmap_sanity_check(mp,bb,level)
435#else
436#define XFS_BMAP_SANITY_CHECK(mp,bb,level) \
437 (INT_GET((bb)->bb_magic, ARCH_CONVERT) == XFS_BMAP_MAGIC && \
438 INT_GET((bb)->bb_level, ARCH_CONVERT) == level && \
439 INT_GET((bb)->bb_numrecs, ARCH_CONVERT) > 0 && \
440 INT_GET((bb)->bb_numrecs, ARCH_CONVERT) <= (mp)->m_bmap_dmxr[(level) != 0])
441#endif
442
443/*
444 * Trace buffer entry types.
445 */
446#define XFS_BMBT_KTRACE_ARGBI 1
447#define XFS_BMBT_KTRACE_ARGBII 2
448#define XFS_BMBT_KTRACE_ARGFFFI 3
449#define XFS_BMBT_KTRACE_ARGI 4
450#define XFS_BMBT_KTRACE_ARGIFK 5
451#define XFS_BMBT_KTRACE_ARGIFR 6
452#define XFS_BMBT_KTRACE_ARGIK 7
453#define XFS_BMBT_KTRACE_CUR 8
454
455#define XFS_BMBT_TRACE_SIZE 4096 /* size of global trace buffer */
456#define XFS_BMBT_KTRACE_SIZE 32 /* size of per-inode trace buffer */
457
458#if defined(XFS_ALL_TRACE)
459#define XFS_BMBT_TRACE
460#endif
461
462#if !defined(DEBUG)
463#undef XFS_BMBT_TRACE
464#endif
465
466
467/*
468 * Prototypes for xfs_bmap.c to call.
469 */
470
471void
472xfs_bmdr_to_bmbt(
473 xfs_bmdr_block_t *,
474 int,
475 xfs_bmbt_block_t *,
476 int);
477
478int
479xfs_bmbt_decrement(
480 struct xfs_btree_cur *,
481 int,
482 int *);
483
484int
485xfs_bmbt_delete(
486 struct xfs_btree_cur *,
487 int,
488 int *);
489
490void
491xfs_bmbt_get_all(
492 xfs_bmbt_rec_t *r,
493 xfs_bmbt_irec_t *s);
494
495xfs_bmbt_block_t *
496xfs_bmbt_get_block(
497 struct xfs_btree_cur *cur,
498 int level,
499 struct xfs_buf **bpp);
500
501xfs_filblks_t
502xfs_bmbt_get_blockcount(
503 xfs_bmbt_rec_t *r);
504
505xfs_fsblock_t
506xfs_bmbt_get_startblock(
507 xfs_bmbt_rec_t *r);
508
509xfs_fileoff_t
510xfs_bmbt_get_startoff(
511 xfs_bmbt_rec_t *r);
512
513xfs_exntst_t
514xfs_bmbt_get_state(
515 xfs_bmbt_rec_t *r);
516
517int
518xfs_bmbt_increment(
519 struct xfs_btree_cur *,
520 int,
521 int *);
522
523int
524xfs_bmbt_insert(
525 struct xfs_btree_cur *,
526 int *);
527
528int
529xfs_bmbt_insert_many(
530 struct xfs_btree_cur *,
531 int,
532 xfs_bmbt_rec_t *,
533 int *);
534
535void
536xfs_bmbt_log_block(
537 struct xfs_btree_cur *,
538 struct xfs_buf *,
539 int);
540
541void
542xfs_bmbt_log_recs(
543 struct xfs_btree_cur *,
544 struct xfs_buf *,
545 int,
546 int);
547
548int
549xfs_bmbt_lookup_eq(
550 struct xfs_btree_cur *,
551 xfs_fileoff_t,
552 xfs_fsblock_t,
553 xfs_filblks_t,
554 int *);
555
556int
557xfs_bmbt_lookup_ge(
558 struct xfs_btree_cur *,
559 xfs_fileoff_t,
560 xfs_fsblock_t,
561 xfs_filblks_t,
562 int *);
563
564int
565xfs_bmbt_lookup_le(
566 struct xfs_btree_cur *,
567 xfs_fileoff_t,
568 xfs_fsblock_t,
569 xfs_filblks_t,
570 int *);
571
572/*
573 * Give the bmap btree a new root block. Copy the old broot contents
574 * down into a real block and make the broot point to it.
575 */
576int /* error */
577xfs_bmbt_newroot(
578 struct xfs_btree_cur *cur, /* btree cursor */
579 int *logflags, /* logging flags for inode */
580 int *stat); /* return status - 0 fail */
581
582void
583xfs_bmbt_set_all(
584 xfs_bmbt_rec_t *r,
585 xfs_bmbt_irec_t *s);
586
587void
588xfs_bmbt_set_allf(
589 xfs_bmbt_rec_t *r,
590 xfs_fileoff_t o,
591 xfs_fsblock_t b,
592 xfs_filblks_t c,
593 xfs_exntst_t v);
594
595void
596xfs_bmbt_set_blockcount(
597 xfs_bmbt_rec_t *r,
598 xfs_filblks_t v);
599
600void
601xfs_bmbt_set_startblock(
602 xfs_bmbt_rec_t *r,
603 xfs_fsblock_t v);
604
605void
606xfs_bmbt_set_startoff(
607 xfs_bmbt_rec_t *r,
608 xfs_fileoff_t v);
609
610void
611xfs_bmbt_set_state(
612 xfs_bmbt_rec_t *r,
613 xfs_exntst_t v);
614
615void
616xfs_bmbt_to_bmdr(
617 xfs_bmbt_block_t *,
618 int,
619 xfs_bmdr_block_t *,
620 int);
621
622int
623xfs_bmbt_update(
624 struct xfs_btree_cur *,
625 xfs_fileoff_t,
626 xfs_fsblock_t,
627 xfs_filblks_t,
628 xfs_exntst_t);
629
630#ifdef XFSDEBUG
631/*
632 * Get the data from the pointed-to record.
633 */
634int
635xfs_bmbt_get_rec(
636 struct xfs_btree_cur *,
637 xfs_fileoff_t *,
638 xfs_fsblock_t *,
639 xfs_filblks_t *,
640 xfs_exntst_t *,
641 int *);
642#endif
643
644
645/*
646 * Search an extent list for the extent which includes block
647 * bno.
648 */
649xfs_bmbt_rec_t *
650xfs_bmap_do_search_extents(
651 xfs_bmbt_rec_t *,
652 xfs_extnum_t,
653 xfs_extnum_t,
654 xfs_fileoff_t,
655 int *,
656 xfs_extnum_t *,
657 xfs_bmbt_irec_t *,
658 xfs_bmbt_irec_t *);
659
660
661#endif /* __XFS_BMAP_BTREE_H__ */