linux/fs/xfs/xfs_bmap_btree.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000,2002-2005 Silicon Graphics, Inc.
   3 * All Rights Reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it would be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write the Free Software Foundation,
  16 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  17 */
  18#ifndef __XFS_BMAP_BTREE_H__
  19#define __XFS_BMAP_BTREE_H__
  20
  21#define XFS_BMAP_MAGIC          0x424d4150      /* 'BMAP' */
  22#define XFS_BMAP_CRC_MAGIC      0x424d4133      /* 'BMA3' */
  23
  24struct xfs_btree_cur;
  25struct xfs_btree_block;
  26struct xfs_mount;
  27struct xfs_inode;
  28struct xfs_trans;
  29
  30/*
  31 * Bmap root header, on-disk form only.
  32 */
  33typedef struct xfs_bmdr_block {
  34        __be16          bb_level;       /* 0 is a leaf */
  35        __be16          bb_numrecs;     /* current # of data records */
  36} xfs_bmdr_block_t;
  37
  38/*
  39 * Bmap btree record and extent descriptor.
  40 *  l0:63 is an extent flag (value 1 indicates non-normal).
  41 *  l0:9-62 are startoff.
  42 *  l0:0-8 and l1:21-63 are startblock.
  43 *  l1:0-20 are blockcount.
  44 */
  45#define BMBT_EXNTFLAG_BITLEN    1
  46#define BMBT_STARTOFF_BITLEN    54
  47#define BMBT_STARTBLOCK_BITLEN  52
  48#define BMBT_BLOCKCOUNT_BITLEN  21
  49
  50typedef struct xfs_bmbt_rec {
  51        __be64                  l0, l1;
  52} xfs_bmbt_rec_t;
  53
  54typedef __uint64_t      xfs_bmbt_rec_base_t;    /* use this for casts */
  55typedef xfs_bmbt_rec_t xfs_bmdr_rec_t;
  56
  57typedef struct xfs_bmbt_rec_host {
  58        __uint64_t              l0, l1;
  59} xfs_bmbt_rec_host_t;
  60
  61/*
  62 * Values and macros for delayed-allocation startblock fields.
  63 */
  64#define STARTBLOCKVALBITS       17
  65#define STARTBLOCKMASKBITS      (15 + XFS_BIG_BLKNOS * 20)
  66#define DSTARTBLOCKMASKBITS     (15 + 20)
  67#define STARTBLOCKMASK          \
  68        (((((xfs_fsblock_t)1) << STARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS)
  69#define DSTARTBLOCKMASK         \
  70        (((((xfs_dfsbno_t)1) << DSTARTBLOCKMASKBITS) - 1) << STARTBLOCKVALBITS)
  71
  72static inline int isnullstartblock(xfs_fsblock_t x)
  73{
  74        return ((x) & STARTBLOCKMASK) == STARTBLOCKMASK;
  75}
  76
  77static inline int isnulldstartblock(xfs_dfsbno_t x)
  78{
  79        return ((x) & DSTARTBLOCKMASK) == DSTARTBLOCKMASK;
  80}
  81
  82static inline xfs_fsblock_t nullstartblock(int k)
  83{
  84        ASSERT(k < (1 << STARTBLOCKVALBITS));
  85        return STARTBLOCKMASK | (k);
  86}
  87
  88static inline xfs_filblks_t startblockval(xfs_fsblock_t x)
  89{
  90        return (xfs_filblks_t)((x) & ~STARTBLOCKMASK);
  91}
  92
  93/*
  94 * Possible extent formats.
  95 */
  96typedef enum {
  97        XFS_EXTFMT_NOSTATE = 0,
  98        XFS_EXTFMT_HASSTATE
  99} xfs_exntfmt_t;
 100
 101/*
 102 * Possible extent states.
 103 */
 104typedef enum {
 105        XFS_EXT_NORM, XFS_EXT_UNWRITTEN,
 106        XFS_EXT_DMAPI_OFFLINE, XFS_EXT_INVALID
 107} xfs_exntst_t;
 108
 109/*
 110 * Extent state and extent format macros.
 111 */
 112#define XFS_EXTFMT_INODE(x)     \
 113        (xfs_sb_version_hasextflgbit(&((x)->i_mount->m_sb)) ? \
 114                XFS_EXTFMT_HASSTATE : XFS_EXTFMT_NOSTATE)
 115#define ISUNWRITTEN(x)  ((x)->br_state == XFS_EXT_UNWRITTEN)
 116
 117/*
 118 * Incore version of above.
 119 */
 120typedef struct xfs_bmbt_irec
 121{
 122        xfs_fileoff_t   br_startoff;    /* starting file offset */
 123        xfs_fsblock_t   br_startblock;  /* starting block number */
 124        xfs_filblks_t   br_blockcount;  /* number of blocks */
 125        xfs_exntst_t    br_state;       /* extent state */
 126} xfs_bmbt_irec_t;
 127
 128/*
 129 * Key structure for non-leaf levels of the tree.
 130 */
 131typedef struct xfs_bmbt_key {
 132        __be64          br_startoff;    /* starting file offset */
 133} xfs_bmbt_key_t, xfs_bmdr_key_t;
 134
 135/* btree pointer type */
 136typedef __be64 xfs_bmbt_ptr_t, xfs_bmdr_ptr_t;
 137
 138/*
 139 * Btree block header size depends on a superblock flag.
 140 */
 141#define XFS_BMBT_BLOCK_LEN(mp) \
 142        (xfs_sb_version_hascrc(&((mp)->m_sb)) ? \
 143                XFS_BTREE_LBLOCK_CRC_LEN : XFS_BTREE_LBLOCK_LEN)
 144
 145#define XFS_BMBT_REC_ADDR(mp, block, index) \
 146        ((xfs_bmbt_rec_t *) \
 147                ((char *)(block) + \
 148                 XFS_BMBT_BLOCK_LEN(mp) + \
 149                 ((index) - 1) * sizeof(xfs_bmbt_rec_t)))
 150
 151#define XFS_BMBT_KEY_ADDR(mp, block, index) \
 152        ((xfs_bmbt_key_t *) \
 153                ((char *)(block) + \
 154                 XFS_BMBT_BLOCK_LEN(mp) + \
 155                 ((index) - 1) * sizeof(xfs_bmbt_key_t)))
 156
 157#define XFS_BMBT_PTR_ADDR(mp, block, index, maxrecs) \
 158        ((xfs_bmbt_ptr_t *) \
 159                ((char *)(block) + \
 160                 XFS_BMBT_BLOCK_LEN(mp) + \
 161                 (maxrecs) * sizeof(xfs_bmbt_key_t) + \
 162                 ((index) - 1) * sizeof(xfs_bmbt_ptr_t)))
 163
 164#define XFS_BMDR_REC_ADDR(block, index) \
 165        ((xfs_bmdr_rec_t *) \
 166                ((char *)(block) + \
 167                 sizeof(struct xfs_bmdr_block) + \
 168                 ((index) - 1) * sizeof(xfs_bmdr_rec_t)))
 169
 170#define XFS_BMDR_KEY_ADDR(block, index) \
 171        ((xfs_bmdr_key_t *) \
 172                ((char *)(block) + \
 173                 sizeof(struct xfs_bmdr_block) + \
 174                 ((index) - 1) * sizeof(xfs_bmdr_key_t)))
 175
 176#define XFS_BMDR_PTR_ADDR(block, index, maxrecs) \
 177        ((xfs_bmdr_ptr_t *) \
 178                ((char *)(block) + \
 179                 sizeof(struct xfs_bmdr_block) + \
 180                 (maxrecs) * sizeof(xfs_bmdr_key_t) + \
 181                 ((index) - 1) * sizeof(xfs_bmdr_ptr_t)))
 182
 183/*
 184 * These are to be used when we know the size of the block and
 185 * we don't have a cursor.
 186 */
 187#define XFS_BMAP_BROOT_PTR_ADDR(mp, bb, i, sz) \
 188        XFS_BMBT_PTR_ADDR(mp, bb, i, xfs_bmbt_maxrecs(mp, sz, 0))
 189
 190#define XFS_BMAP_BROOT_SPACE_CALC(mp, nrecs) \
 191        (int)(XFS_BMBT_BLOCK_LEN(mp) + \
 192               ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t))))
 193
 194#define XFS_BMAP_BROOT_SPACE(mp, bb) \
 195        (XFS_BMAP_BROOT_SPACE_CALC(mp, be16_to_cpu((bb)->bb_numrecs)))
 196#define XFS_BMDR_SPACE_CALC(nrecs) \
 197        (int)(sizeof(xfs_bmdr_block_t) + \
 198               ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t))))
 199#define XFS_BMAP_BMDR_SPACE(bb) \
 200        (XFS_BMDR_SPACE_CALC(be16_to_cpu((bb)->bb_numrecs)))
 201
 202/*
 203 * Maximum number of bmap btree levels.
 204 */
 205#define XFS_BM_MAXLEVELS(mp,w)          ((mp)->m_bm_maxlevels[(w)])
 206
 207/*
 208 * Prototypes for xfs_bmap.c to call.
 209 */
 210extern void xfs_bmdr_to_bmbt(struct xfs_inode *, xfs_bmdr_block_t *, int,
 211                        struct xfs_btree_block *, int);
 212extern void xfs_bmbt_get_all(xfs_bmbt_rec_host_t *r, xfs_bmbt_irec_t *s);
 213extern xfs_filblks_t xfs_bmbt_get_blockcount(xfs_bmbt_rec_host_t *r);
 214extern xfs_fsblock_t xfs_bmbt_get_startblock(xfs_bmbt_rec_host_t *r);
 215extern xfs_fileoff_t xfs_bmbt_get_startoff(xfs_bmbt_rec_host_t *r);
 216extern xfs_exntst_t xfs_bmbt_get_state(xfs_bmbt_rec_host_t *r);
 217
 218extern xfs_filblks_t xfs_bmbt_disk_get_blockcount(xfs_bmbt_rec_t *r);
 219extern xfs_fileoff_t xfs_bmbt_disk_get_startoff(xfs_bmbt_rec_t *r);
 220
 221extern void xfs_bmbt_set_all(xfs_bmbt_rec_host_t *r, xfs_bmbt_irec_t *s);
 222extern void xfs_bmbt_set_allf(xfs_bmbt_rec_host_t *r, xfs_fileoff_t o,
 223                        xfs_fsblock_t b, xfs_filblks_t c, xfs_exntst_t v);
 224extern void xfs_bmbt_set_blockcount(xfs_bmbt_rec_host_t *r, xfs_filblks_t v);
 225extern void xfs_bmbt_set_startblock(xfs_bmbt_rec_host_t *r, xfs_fsblock_t v);
 226extern void xfs_bmbt_set_startoff(xfs_bmbt_rec_host_t *r, xfs_fileoff_t v);
 227extern void xfs_bmbt_set_state(xfs_bmbt_rec_host_t *r, xfs_exntst_t v);
 228
 229extern void xfs_bmbt_disk_set_allf(xfs_bmbt_rec_t *r, xfs_fileoff_t o,
 230                        xfs_fsblock_t b, xfs_filblks_t c, xfs_exntst_t v);
 231
 232extern void xfs_bmbt_to_bmdr(struct xfs_mount *, struct xfs_btree_block *, int,
 233                        xfs_bmdr_block_t *, int);
 234
 235extern int xfs_bmbt_get_maxrecs(struct xfs_btree_cur *, int level);
 236extern int xfs_bmdr_maxrecs(struct xfs_mount *, int blocklen, int leaf);
 237extern int xfs_bmbt_maxrecs(struct xfs_mount *, int blocklen, int leaf);
 238
 239extern struct xfs_btree_cur *xfs_bmbt_init_cursor(struct xfs_mount *,
 240                struct xfs_trans *, struct xfs_inode *, int);
 241
 242extern const struct xfs_buf_ops xfs_bmbt_buf_ops;
 243
 244#endif  /* __XFS_BMAP_BTREE_H__ */
 245
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.