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