1153323Srodrigc/*
2159451Srodrigc * Copyright (c) 2000,2002-2005 Silicon Graphics, Inc.
3159451Srodrigc * All Rights Reserved.
4153323Srodrigc *
5159451Srodrigc * This program is free software; you can redistribute it and/or
6159451Srodrigc * modify it under the terms of the GNU General Public License as
7153323Srodrigc * published by the Free Software Foundation.
8153323Srodrigc *
9159451Srodrigc * This program is distributed in the hope that it would be useful,
10159451Srodrigc * but WITHOUT ANY WARRANTY; without even the implied warranty of
11159451Srodrigc * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12159451Srodrigc * GNU General Public License for more details.
13153323Srodrigc *
14159451Srodrigc * You should have received a copy of the GNU General Public License
15159451Srodrigc * along with this program; if not, write the Free Software Foundation,
16159451Srodrigc * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
17153323Srodrigc */
18153323Srodrigc#ifndef __XFS_BMAP_BTREE_H__
19153323Srodrigc#define __XFS_BMAP_BTREE_H__
20153323Srodrigc
21153323Srodrigc#define XFS_BMAP_MAGIC	0x424d4150	/* 'BMAP' */
22153323Srodrigc
23153323Srodrigcstruct xfs_btree_cur;
24153323Srodrigcstruct xfs_btree_lblock;
25153323Srodrigcstruct xfs_mount;
26153323Srodrigcstruct xfs_inode;
27153323Srodrigc
28153323Srodrigc/*
29153323Srodrigc * Bmap root header, on-disk form only.
30153323Srodrigc */
31159451Srodrigctypedef struct xfs_bmdr_block {
32159451Srodrigc	__be16		bb_level;	/* 0 is a leaf */
33159451Srodrigc	__be16		bb_numrecs;	/* current # of data records */
34153323Srodrigc} xfs_bmdr_block_t;
35153323Srodrigc
36153323Srodrigc/*
37153323Srodrigc * Bmap btree record and extent descriptor.
38153323Srodrigc * For 32-bit kernels,
39153323Srodrigc *  l0:31 is an extent flag (value 1 indicates non-normal).
40153323Srodrigc *  l0:0-30 and l1:9-31 are startoff.
41153323Srodrigc *  l1:0-8, l2:0-31, and l3:21-31 are startblock.
42153323Srodrigc *  l3:0-20 are blockcount.
43153323Srodrigc * For 64-bit kernels,
44153323Srodrigc *  l0:63 is an extent flag (value 1 indicates non-normal).
45153323Srodrigc *  l0:9-62 are startoff.
46153323Srodrigc *  l0:0-8 and l1:21-63 are startblock.
47153323Srodrigc *  l1:0-20 are blockcount.
48153323Srodrigc */
49153323Srodrigc
50159451Srodrigc#ifndef XFS_NATIVE_HOST
51153323Srodrigc
52153323Srodrigc#define BMBT_TOTAL_BITLEN	128	/* 128 bits, 16 bytes */
53153323Srodrigc#define BMBT_EXNTFLAG_BITOFF	0
54153323Srodrigc#define BMBT_EXNTFLAG_BITLEN	1
55153323Srodrigc#define BMBT_STARTOFF_BITOFF	(BMBT_EXNTFLAG_BITOFF + BMBT_EXNTFLAG_BITLEN)
56153323Srodrigc#define BMBT_STARTOFF_BITLEN	54
57153323Srodrigc#define BMBT_STARTBLOCK_BITOFF	(BMBT_STARTOFF_BITOFF + BMBT_STARTOFF_BITLEN)
58153323Srodrigc#define BMBT_STARTBLOCK_BITLEN	52
59153323Srodrigc#define BMBT_BLOCKCOUNT_BITOFF	\
60153323Srodrigc	(BMBT_STARTBLOCK_BITOFF + BMBT_STARTBLOCK_BITLEN)
61153323Srodrigc#define BMBT_BLOCKCOUNT_BITLEN	(BMBT_TOTAL_BITLEN - BMBT_BLOCKCOUNT_BITOFF)
62153323Srodrigc
63153323Srodrigc#else
64153323Srodrigc
65153323Srodrigc#define BMBT_TOTAL_BITLEN	128	/* 128 bits, 16 bytes */
66153323Srodrigc#define BMBT_EXNTFLAG_BITOFF	63
67153323Srodrigc#define BMBT_EXNTFLAG_BITLEN	1
68153323Srodrigc#define BMBT_STARTOFF_BITOFF	(BMBT_EXNTFLAG_BITOFF - BMBT_STARTOFF_BITLEN)
69153323Srodrigc#define BMBT_STARTOFF_BITLEN	54
70153323Srodrigc#define BMBT_STARTBLOCK_BITOFF	85 /* 128 - 43 (other 9 is in first word) */
71153323Srodrigc#define BMBT_STARTBLOCK_BITLEN	52
72153323Srodrigc#define BMBT_BLOCKCOUNT_BITOFF	64 /* Start of second 64 bit container */
73153323Srodrigc#define BMBT_BLOCKCOUNT_BITLEN	21
74153323Srodrigc
75159451Srodrigc#endif /* XFS_NATIVE_HOST */
76153323Srodrigc
77153323Srodrigc
78153323Srodrigc#define BMBT_USE_64	1
79153323Srodrigc
80153323Srodrigctypedef struct xfs_bmbt_rec_32
81153323Srodrigc{
82153323Srodrigc	__uint32_t		l0, l1, l2, l3;
83153323Srodrigc} xfs_bmbt_rec_32_t;
84153323Srodrigctypedef struct xfs_bmbt_rec_64
85153323Srodrigc{
86153323Srodrigc	__uint64_t		l0, l1;
87153323Srodrigc} xfs_bmbt_rec_64_t;
88153323Srodrigc
89153323Srodrigctypedef __uint64_t	xfs_bmbt_rec_base_t;	/* use this for casts */
90153323Srodrigctypedef xfs_bmbt_rec_64_t xfs_bmbt_rec_t, xfs_bmdr_rec_t;
91153323Srodrigc
92153323Srodrigc/*
93153323Srodrigc * Values and macros for delayed-allocation startblock fields.
94153323Srodrigc */
95153323Srodrigc#define STARTBLOCKVALBITS	17
96153323Srodrigc#define STARTBLOCKMASKBITS	(15 + XFS_BIG_BLKNOS * 20)
97153323Srodrigc#define DSTARTBLOCKMASKBITS	(15 + 20)
98153323Srodrigc#define STARTBLOCKMASK		\
99153323Srodrigc	(((((xfs_fsblock_t)1) << STARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS)
100153323Srodrigc#define DSTARTBLOCKMASK		\
101153323Srodrigc	(((((xfs_dfsbno_t)1) << DSTARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS)
102153323Srodrigc
103153323Srodrigc#define ISNULLSTARTBLOCK(x)	isnullstartblock(x)
104159451Srodrigcstatic inline int isnullstartblock(xfs_fsblock_t x)
105159451Srodrigc{
106159451Srodrigc	return ((x) & STARTBLOCKMASK) == STARTBLOCKMASK;
107159451Srodrigc}
108153323Srodrigc
109153323Srodrigc#define ISNULLDSTARTBLOCK(x)	isnulldstartblock(x)
110159451Srodrigcstatic inline int isnulldstartblock(xfs_dfsbno_t x)
111159451Srodrigc{
112159451Srodrigc	return ((x) & DSTARTBLOCKMASK) == DSTARTBLOCKMASK;
113159451Srodrigc}
114153323Srodrigc
115153323Srodrigc#define NULLSTARTBLOCK(k)	nullstartblock(k)
116159451Srodrigcstatic inline xfs_fsblock_t nullstartblock(int k)
117159451Srodrigc{
118159451Srodrigc	ASSERT(k < (1 << STARTBLOCKVALBITS));
119159451Srodrigc	return STARTBLOCKMASK | (k);
120159451Srodrigc}
121153323Srodrigc
122153323Srodrigc#define STARTBLOCKVAL(x)	startblockval(x)
123159451Srodrigcstatic inline xfs_filblks_t startblockval(xfs_fsblock_t x)
124159451Srodrigc{
125159451Srodrigc	return (xfs_filblks_t)((x) & ~STARTBLOCKMASK);
126159451Srodrigc}
127153323Srodrigc
128153323Srodrigc/*
129153323Srodrigc * Possible extent formats.
130153323Srodrigc */
131153323Srodrigctypedef enum {
132153323Srodrigc	XFS_EXTFMT_NOSTATE = 0,
133153323Srodrigc	XFS_EXTFMT_HASSTATE
134153323Srodrigc} xfs_exntfmt_t;
135153323Srodrigc
136153323Srodrigc/*
137153323Srodrigc * Possible extent states.
138153323Srodrigc */
139153323Srodrigctypedef enum {
140153323Srodrigc	XFS_EXT_NORM, XFS_EXT_UNWRITTEN,
141159451Srodrigc	XFS_EXT_DMAPI_OFFLINE, XFS_EXT_INVALID
142153323Srodrigc} xfs_exntst_t;
143153323Srodrigc
144153323Srodrigc/*
145153323Srodrigc * Extent state and extent format macros.
146153323Srodrigc */
147159451Srodrigc#define XFS_EXTFMT_INODE(x)	\
148159451Srodrigc	(XFS_SB_VERSION_HASEXTFLGBIT(&((x)->i_mount->m_sb)) ? \
149159451Srodrigc		XFS_EXTFMT_HASSTATE : XFS_EXTFMT_NOSTATE)
150153323Srodrigc#define ISUNWRITTEN(x)	((x)->br_state == XFS_EXT_UNWRITTEN)
151153323Srodrigc
152153323Srodrigc/*
153153323Srodrigc * Incore version of above.
154153323Srodrigc */
155153323Srodrigctypedef struct xfs_bmbt_irec
156153323Srodrigc{
157153323Srodrigc	xfs_fileoff_t	br_startoff;	/* starting file offset */
158153323Srodrigc	xfs_fsblock_t	br_startblock;	/* starting block number */
159153323Srodrigc	xfs_filblks_t	br_blockcount;	/* number of blocks */
160153323Srodrigc	xfs_exntst_t	br_state;	/* extent state */
161153323Srodrigc} xfs_bmbt_irec_t;
162153323Srodrigc
163153323Srodrigc/*
164153323Srodrigc * Key structure for non-leaf levels of the tree.
165153323Srodrigc */
166153323Srodrigctypedef struct xfs_bmbt_key
167153323Srodrigc{
168153323Srodrigc	xfs_dfiloff_t	br_startoff;	/* starting file offset */
169153323Srodrigc} xfs_bmbt_key_t, xfs_bmdr_key_t;
170153323Srodrigc
171153323Srodrigctypedef xfs_dfsbno_t xfs_bmbt_ptr_t, xfs_bmdr_ptr_t;	/* btree pointer type */
172153323Srodrigc					/* btree block header type */
173153323Srodrigctypedef struct xfs_btree_lblock xfs_bmbt_block_t;
174153323Srodrigc
175159451Srodrigc#define XFS_BUF_TO_BMBT_BLOCK(bp)	((xfs_bmbt_block_t *)XFS_BUF_PTR(bp))
176153323Srodrigc
177159451Srodrigc#define XFS_BMAP_IBLOCK_SIZE(lev,cur)	(1 << (cur)->bc_blocklog)
178159451Srodrigc#define XFS_BMAP_RBLOCK_DSIZE(lev,cur)	((cur)->bc_private.b.forksize)
179159451Srodrigc#define XFS_BMAP_RBLOCK_ISIZE(lev,cur)	\
180153323Srodrigc	((int)XFS_IFORK_PTR((cur)->bc_private.b.ip, \
181159451Srodrigc		    (cur)->bc_private.b.whichfork)->if_broot_bytes)
182153323Srodrigc
183159451Srodrigc#define XFS_BMAP_BLOCK_DSIZE(lev,cur)	\
184159451Srodrigc	(((lev) == (cur)->bc_nlevels - 1 ? \
185159451Srodrigc		XFS_BMAP_RBLOCK_DSIZE(lev,cur) : XFS_BMAP_IBLOCK_SIZE(lev,cur)))
186159451Srodrigc#define XFS_BMAP_BLOCK_ISIZE(lev,cur)	\
187159451Srodrigc	(((lev) == (cur)->bc_nlevels - 1 ? \
188159451Srodrigc		XFS_BMAP_RBLOCK_ISIZE(lev,cur) : XFS_BMAP_IBLOCK_SIZE(lev,cur)))
189153323Srodrigc
190153323Srodrigc#define XFS_BMAP_BLOCK_DMAXRECS(lev,cur) \
191159451Srodrigc	(((lev) == (cur)->bc_nlevels - 1 ? \
192153323Srodrigc		XFS_BTREE_BLOCK_MAXRECS(XFS_BMAP_RBLOCK_DSIZE(lev,cur), \
193153323Srodrigc			xfs_bmdr, (lev) == 0) : \
194159451Srodrigc		((cur)->bc_mp->m_bmap_dmxr[(lev) != 0])))
195153323Srodrigc#define XFS_BMAP_BLOCK_IMAXRECS(lev,cur) \
196159451Srodrigc	(((lev) == (cur)->bc_nlevels - 1 ? \
197159451Srodrigc			XFS_BTREE_BLOCK_MAXRECS(XFS_BMAP_RBLOCK_ISIZE(lev,cur),\
198159451Srodrigc				xfs_bmbt, (lev) == 0) : \
199159451Srodrigc			((cur)->bc_mp->m_bmap_dmxr[(lev) != 0])))
200153323Srodrigc
201153323Srodrigc#define XFS_BMAP_BLOCK_DMINRECS(lev,cur) \
202159451Srodrigc	(((lev) == (cur)->bc_nlevels - 1 ? \
203159451Srodrigc			XFS_BTREE_BLOCK_MINRECS(XFS_BMAP_RBLOCK_DSIZE(lev,cur),\
204159451Srodrigc				xfs_bmdr, (lev) == 0) : \
205159451Srodrigc			((cur)->bc_mp->m_bmap_dmnr[(lev) != 0])))
206153323Srodrigc#define XFS_BMAP_BLOCK_IMINRECS(lev,cur) \
207159451Srodrigc	(((lev) == (cur)->bc_nlevels - 1 ? \
208159451Srodrigc			XFS_BTREE_BLOCK_MINRECS(XFS_BMAP_RBLOCK_ISIZE(lev,cur),\
209159451Srodrigc				xfs_bmbt, (lev) == 0) : \
210159451Srodrigc			((cur)->bc_mp->m_bmap_dmnr[(lev) != 0])))
211153323Srodrigc
212159451Srodrigc#define XFS_BMAP_REC_DADDR(bb,i,cur)	\
213159451Srodrigc	(XFS_BTREE_REC_ADDR(XFS_BMAP_BLOCK_DSIZE(			\
214159451Srodrigc			be16_to_cpu((bb)->bb_level), cur),		\
215159451Srodrigc			xfs_bmbt, bb, i, XFS_BMAP_BLOCK_DMAXRECS(	\
216159451Srodrigc				be16_to_cpu((bb)->bb_level), cur)))
217159451Srodrigc#define XFS_BMAP_REC_IADDR(bb,i,cur)	\
218159451Srodrigc	(XFS_BTREE_REC_ADDR(XFS_BMAP_BLOCK_ISIZE(			\
219159451Srodrigc			be16_to_cpu((bb)->bb_level), cur),		\
220159451Srodrigc			xfs_bmbt, bb, i, XFS_BMAP_BLOCK_IMAXRECS(	\
221159451Srodrigc				be16_to_cpu((bb)->bb_level), cur)))
222153323Srodrigc
223159451Srodrigc#define XFS_BMAP_KEY_DADDR(bb,i,cur)	\
224159451Srodrigc	(XFS_BTREE_KEY_ADDR(XFS_BMAP_BLOCK_DSIZE(			\
225159451Srodrigc			be16_to_cpu((bb)->bb_level), cur),		\
226159451Srodrigc			xfs_bmbt, bb, i, XFS_BMAP_BLOCK_DMAXRECS(	\
227159451Srodrigc				be16_to_cpu((bb)->bb_level), cur)))
228159451Srodrigc#define XFS_BMAP_KEY_IADDR(bb,i,cur)	\
229159451Srodrigc	(XFS_BTREE_KEY_ADDR(XFS_BMAP_BLOCK_ISIZE(			\
230159451Srodrigc			be16_to_cpu((bb)->bb_level), cur),		\
231159451Srodrigc			xfs_bmbt, bb, i, XFS_BMAP_BLOCK_IMAXRECS(	\
232159451Srodrigc				be16_to_cpu((bb)->bb_level), cur)))
233153323Srodrigc
234159451Srodrigc#define XFS_BMAP_PTR_DADDR(bb,i,cur)	\
235159451Srodrigc	(XFS_BTREE_PTR_ADDR(XFS_BMAP_BLOCK_DSIZE(			\
236159451Srodrigc			be16_to_cpu((bb)->bb_level), cur),		\
237159451Srodrigc			xfs_bmbt, bb, i, XFS_BMAP_BLOCK_DMAXRECS(	\
238159451Srodrigc				be16_to_cpu((bb)->bb_level), cur)))
239159451Srodrigc#define XFS_BMAP_PTR_IADDR(bb,i,cur)	\
240159451Srodrigc	(XFS_BTREE_PTR_ADDR(XFS_BMAP_BLOCK_ISIZE(			\
241159451Srodrigc			be16_to_cpu((bb)->bb_level), cur),		\
242159451Srodrigc			xfs_bmbt, bb, i, XFS_BMAP_BLOCK_IMAXRECS(	\
243159451Srodrigc				be16_to_cpu((bb)->bb_level), cur)))
244153323Srodrigc
245153323Srodrigc/*
246153323Srodrigc * These are to be used when we know the size of the block and
247153323Srodrigc * we don't have a cursor.
248153323Srodrigc */
249153323Srodrigc#define XFS_BMAP_BROOT_REC_ADDR(bb,i,sz) \
250159451Srodrigc	(XFS_BTREE_REC_ADDR(sz,xfs_bmbt,bb,i,XFS_BMAP_BROOT_MAXRECS(sz)))
251153323Srodrigc#define XFS_BMAP_BROOT_KEY_ADDR(bb,i,sz) \
252159451Srodrigc	(XFS_BTREE_KEY_ADDR(sz,xfs_bmbt,bb,i,XFS_BMAP_BROOT_MAXRECS(sz)))
253153323Srodrigc#define XFS_BMAP_BROOT_PTR_ADDR(bb,i,sz) \
254159451Srodrigc	(XFS_BTREE_PTR_ADDR(sz,xfs_bmbt,bb,i,XFS_BMAP_BROOT_MAXRECS(sz)))
255153323Srodrigc
256159451Srodrigc#define XFS_BMAP_BROOT_NUMRECS(bb)	be16_to_cpu((bb)->bb_numrecs)
257159451Srodrigc#define XFS_BMAP_BROOT_MAXRECS(sz)	XFS_BTREE_BLOCK_MAXRECS(sz,xfs_bmbt,0)
258153323Srodrigc
259153323Srodrigc#define XFS_BMAP_BROOT_SPACE_CALC(nrecs) \
260159451Srodrigc	(int)(sizeof(xfs_bmbt_block_t) + \
261159451Srodrigc	       ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t))))
262153323Srodrigc
263153323Srodrigc#define XFS_BMAP_BROOT_SPACE(bb) \
264159451Srodrigc	(XFS_BMAP_BROOT_SPACE_CALC(be16_to_cpu((bb)->bb_numrecs)))
265159451Srodrigc#define XFS_BMDR_SPACE_CALC(nrecs) \
266159451Srodrigc	(int)(sizeof(xfs_bmdr_block_t) + \
267159451Srodrigc	       ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t))))
268153323Srodrigc
269153323Srodrigc/*
270153323Srodrigc * Maximum number of bmap btree levels.
271153323Srodrigc */
272159451Srodrigc#define XFS_BM_MAXLEVELS(mp,w)		((mp)->m_bm_maxlevels[(w)])
273153323Srodrigc
274159451Srodrigc#define XFS_BMAP_SANITY_CHECK(mp,bb,level) \
275159451Srodrigc	(be32_to_cpu((bb)->bb_magic) == XFS_BMAP_MAGIC && \
276159451Srodrigc	 be16_to_cpu((bb)->bb_level) == level && \
277159451Srodrigc	 be16_to_cpu((bb)->bb_numrecs) > 0 && \
278159451Srodrigc	 be16_to_cpu((bb)->bb_numrecs) <= (mp)->m_bmap_dmxr[(level) != 0])
279153323Srodrigc
280153323Srodrigc
281153323Srodrigc#ifdef __KERNEL__
282153323Srodrigc
283153323Srodrigc#if defined(XFS_BMBT_TRACE)
284153323Srodrigc/*
285153323Srodrigc * Trace buffer entry types.
286153323Srodrigc */
287153323Srodrigc#define XFS_BMBT_KTRACE_ARGBI	1
288153323Srodrigc#define XFS_BMBT_KTRACE_ARGBII	2
289153323Srodrigc#define XFS_BMBT_KTRACE_ARGFFFI 3
290153323Srodrigc#define XFS_BMBT_KTRACE_ARGI	4
291153323Srodrigc#define XFS_BMBT_KTRACE_ARGIFK	5
292153323Srodrigc#define XFS_BMBT_KTRACE_ARGIFR	6
293153323Srodrigc#define XFS_BMBT_KTRACE_ARGIK	7
294153323Srodrigc#define XFS_BMBT_KTRACE_CUR	8
295153323Srodrigc
296153323Srodrigc#define XFS_BMBT_TRACE_SIZE	4096	/* size of global trace buffer */
297153323Srodrigc#define XFS_BMBT_KTRACE_SIZE	32	/* size of per-inode trace buffer */
298153323Srodrigcextern ktrace_t	*xfs_bmbt_trace_buf;
299153323Srodrigc#endif
300153323Srodrigc
301153323Srodrigc/*
302153323Srodrigc * Prototypes for xfs_bmap.c to call.
303153323Srodrigc */
304159451Srodrigcextern void xfs_bmdr_to_bmbt(xfs_bmdr_block_t *, int, xfs_bmbt_block_t *, int);
305159451Srodrigcextern int xfs_bmbt_decrement(struct xfs_btree_cur *, int, int *);
306159451Srodrigcextern int xfs_bmbt_delete(struct xfs_btree_cur *, int *);
307159451Srodrigcextern void xfs_bmbt_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s);
308159451Srodrigcextern xfs_bmbt_block_t *xfs_bmbt_get_block(struct xfs_btree_cur *cur,
309159451Srodrigc						int, struct xfs_buf **bpp);
310159451Srodrigcextern xfs_filblks_t xfs_bmbt_get_blockcount(xfs_bmbt_rec_t *r);
311159451Srodrigcextern xfs_fsblock_t xfs_bmbt_get_startblock(xfs_bmbt_rec_t *r);
312159451Srodrigcextern xfs_fileoff_t xfs_bmbt_get_startoff(xfs_bmbt_rec_t *r);
313159451Srodrigcextern xfs_exntst_t xfs_bmbt_get_state(xfs_bmbt_rec_t *r);
314153323Srodrigc
315159451Srodrigc#ifndef XFS_NATIVE_HOST
316159451Srodrigcextern void xfs_bmbt_disk_get_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s);
317159451Srodrigcextern xfs_exntst_t xfs_bmbt_disk_get_state(xfs_bmbt_rec_t *r);
318159451Srodrigcextern xfs_filblks_t xfs_bmbt_disk_get_blockcount(xfs_bmbt_rec_t *r);
319159451Srodrigcextern xfs_fsblock_t xfs_bmbt_disk_get_startblock(xfs_bmbt_rec_t *r);
320159451Srodrigcextern xfs_fileoff_t xfs_bmbt_disk_get_startoff(xfs_bmbt_rec_t *r);
321153323Srodrigc#else
322159451Srodrigc#define xfs_bmbt_disk_get_all(r, s)	xfs_bmbt_get_all(r, s)
323159451Srodrigc#define xfs_bmbt_disk_get_state(r)	xfs_bmbt_get_state(r)
324159451Srodrigc#define xfs_bmbt_disk_get_blockcount(r)	xfs_bmbt_get_blockcount(r)
325159451Srodrigc#define xfs_bmbt_disk_get_startblock(r)	xfs_bmbt_get_blockcount(r)
326159451Srodrigc#define xfs_bmbt_disk_get_startoff(r)	xfs_bmbt_get_startoff(r)
327159451Srodrigc#endif /* XFS_NATIVE_HOST */
328153323Srodrigc
329159451Srodrigcextern int xfs_bmbt_increment(struct xfs_btree_cur *, int, int *);
330159451Srodrigcextern int xfs_bmbt_insert(struct xfs_btree_cur *, int *);
331159451Srodrigcextern void xfs_bmbt_log_block(struct xfs_btree_cur *, struct xfs_buf *, int);
332159451Srodrigcextern void xfs_bmbt_log_recs(struct xfs_btree_cur *, struct xfs_buf *, int,
333159451Srodrigc				int);
334159451Srodrigcextern int xfs_bmbt_lookup_eq(struct xfs_btree_cur *, xfs_fileoff_t,
335159451Srodrigc				xfs_fsblock_t, xfs_filblks_t, int *);
336159451Srodrigcextern int xfs_bmbt_lookup_ge(struct xfs_btree_cur *, xfs_fileoff_t,
337159451Srodrigc				xfs_fsblock_t, xfs_filblks_t, int *);
338153323Srodrigc
339153323Srodrigc/*
340153323Srodrigc * Give the bmap btree a new root block.  Copy the old broot contents
341153323Srodrigc * down into a real block and make the broot point to it.
342153323Srodrigc */
343159451Srodrigcextern int xfs_bmbt_newroot(struct xfs_btree_cur *cur, int *lflags, int *stat);
344153323Srodrigc
345159451Srodrigcextern void xfs_bmbt_set_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s);
346159451Srodrigcextern void xfs_bmbt_set_allf(xfs_bmbt_rec_t *r, xfs_fileoff_t o,
347159451Srodrigc			xfs_fsblock_t b, xfs_filblks_t c, xfs_exntst_t v);
348159451Srodrigcextern void xfs_bmbt_set_blockcount(xfs_bmbt_rec_t *r, xfs_filblks_t v);
349159451Srodrigcextern void xfs_bmbt_set_startblock(xfs_bmbt_rec_t *r, xfs_fsblock_t v);
350159451Srodrigcextern void xfs_bmbt_set_startoff(xfs_bmbt_rec_t *r, xfs_fileoff_t v);
351159451Srodrigcextern void xfs_bmbt_set_state(xfs_bmbt_rec_t *r, xfs_exntst_t v);
352153323Srodrigc
353159451Srodrigc#ifndef XFS_NATIVE_HOST
354159451Srodrigcextern void xfs_bmbt_disk_set_all(xfs_bmbt_rec_t *r, xfs_bmbt_irec_t *s);
355159451Srodrigcextern void xfs_bmbt_disk_set_allf(xfs_bmbt_rec_t *r, xfs_fileoff_t o,
356159451Srodrigc			xfs_fsblock_t b, xfs_filblks_t c, xfs_exntst_t v);
357153323Srodrigc#else
358159451Srodrigc#define xfs_bmbt_disk_set_all(r, s)		xfs_bmbt_set_all(r, s)
359159451Srodrigc#define xfs_bmbt_disk_set_allf(r, o, b, c, v)	xfs_bmbt_set_allf(r, o, b, c, v)
360159451Srodrigc#endif /* XFS_NATIVE_HOST */
361153323Srodrigc
362159451Srodrigcextern void xfs_bmbt_to_bmdr(xfs_bmbt_block_t *, int, xfs_bmdr_block_t *, int);
363159451Srodrigcextern int xfs_bmbt_update(struct xfs_btree_cur *, xfs_fileoff_t,
364159451Srodrigc				xfs_fsblock_t, xfs_filblks_t, xfs_exntst_t);
365153323Srodrigc
366159451Srodrigc#ifdef DEBUG
367153323Srodrigc/*
368153323Srodrigc * Get the data from the pointed-to record.
369153323Srodrigc */
370159451Srodrigcextern int xfs_bmbt_get_rec(struct xfs_btree_cur *, xfs_fileoff_t *,
371159451Srodrigc				xfs_fsblock_t *, xfs_filblks_t *,
372159451Srodrigc				xfs_exntst_t *, int *);
373153323Srodrigc#endif
374153323Srodrigc
375153323Srodrigc#endif	/* __KERNEL__ */
376153323Srodrigc
377153323Srodrigc#endif	/* __XFS_BMAP_BTREE_H__ */
378