Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Copyright (c) 2000,2002-2005 Silicon Graphics, Inc.
0004  * All Rights Reserved.
0005  */
0006 #ifndef __XFS_BMAP_BTREE_H__
0007 #define __XFS_BMAP_BTREE_H__
0008 
0009 struct xfs_btree_cur;
0010 struct xfs_btree_block;
0011 struct xfs_mount;
0012 struct xfs_inode;
0013 struct xfs_trans;
0014 
0015 /*
0016  * Btree block header size depends on a superblock flag.
0017  */
0018 #define XFS_BMBT_BLOCK_LEN(mp) \
0019     (xfs_has_crc(((mp))) ? \
0020         XFS_BTREE_LBLOCK_CRC_LEN : XFS_BTREE_LBLOCK_LEN)
0021 
0022 #define XFS_BMBT_REC_ADDR(mp, block, index) \
0023     ((xfs_bmbt_rec_t *) \
0024         ((char *)(block) + \
0025          XFS_BMBT_BLOCK_LEN(mp) + \
0026          ((index) - 1) * sizeof(xfs_bmbt_rec_t)))
0027 
0028 #define XFS_BMBT_KEY_ADDR(mp, block, index) \
0029     ((xfs_bmbt_key_t *) \
0030         ((char *)(block) + \
0031          XFS_BMBT_BLOCK_LEN(mp) + \
0032          ((index) - 1) * sizeof(xfs_bmbt_key_t)))
0033 
0034 #define XFS_BMBT_PTR_ADDR(mp, block, index, maxrecs) \
0035     ((xfs_bmbt_ptr_t *) \
0036         ((char *)(block) + \
0037          XFS_BMBT_BLOCK_LEN(mp) + \
0038          (maxrecs) * sizeof(xfs_bmbt_key_t) + \
0039          ((index) - 1) * sizeof(xfs_bmbt_ptr_t)))
0040 
0041 #define XFS_BMDR_REC_ADDR(block, index) \
0042     ((xfs_bmdr_rec_t *) \
0043         ((char *)(block) + \
0044          sizeof(struct xfs_bmdr_block) + \
0045              ((index) - 1) * sizeof(xfs_bmdr_rec_t)))
0046 
0047 #define XFS_BMDR_KEY_ADDR(block, index) \
0048     ((xfs_bmdr_key_t *) \
0049         ((char *)(block) + \
0050          sizeof(struct xfs_bmdr_block) + \
0051          ((index) - 1) * sizeof(xfs_bmdr_key_t)))
0052 
0053 #define XFS_BMDR_PTR_ADDR(block, index, maxrecs) \
0054     ((xfs_bmdr_ptr_t *) \
0055         ((char *)(block) + \
0056          sizeof(struct xfs_bmdr_block) + \
0057          (maxrecs) * sizeof(xfs_bmdr_key_t) + \
0058          ((index) - 1) * sizeof(xfs_bmdr_ptr_t)))
0059 
0060 /*
0061  * These are to be used when we know the size of the block and
0062  * we don't have a cursor.
0063  */
0064 #define XFS_BMAP_BROOT_PTR_ADDR(mp, bb, i, sz) \
0065     XFS_BMBT_PTR_ADDR(mp, bb, i, xfs_bmbt_maxrecs(mp, sz, 0))
0066 
0067 #define XFS_BMAP_BROOT_SPACE_CALC(mp, nrecs) \
0068     (int)(XFS_BMBT_BLOCK_LEN(mp) + \
0069            ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t))))
0070 
0071 #define XFS_BMAP_BROOT_SPACE(mp, bb) \
0072     (XFS_BMAP_BROOT_SPACE_CALC(mp, be16_to_cpu((bb)->bb_numrecs)))
0073 #define XFS_BMDR_SPACE_CALC(nrecs) \
0074     (int)(sizeof(xfs_bmdr_block_t) + \
0075            ((nrecs) * (sizeof(xfs_bmbt_key_t) + sizeof(xfs_bmbt_ptr_t))))
0076 #define XFS_BMAP_BMDR_SPACE(bb) \
0077     (XFS_BMDR_SPACE_CALC(be16_to_cpu((bb)->bb_numrecs)))
0078 
0079 /*
0080  * Maximum number of bmap btree levels.
0081  */
0082 #define XFS_BM_MAXLEVELS(mp,w)      ((mp)->m_bm_maxlevels[(w)])
0083 
0084 /*
0085  * Prototypes for xfs_bmap.c to call.
0086  */
0087 extern void xfs_bmdr_to_bmbt(struct xfs_inode *, xfs_bmdr_block_t *, int,
0088             struct xfs_btree_block *, int);
0089 
0090 void xfs_bmbt_disk_set_all(struct xfs_bmbt_rec *r, struct xfs_bmbt_irec *s);
0091 extern xfs_filblks_t xfs_bmbt_disk_get_blockcount(const struct xfs_bmbt_rec *r);
0092 extern xfs_fileoff_t xfs_bmbt_disk_get_startoff(const struct xfs_bmbt_rec *r);
0093 void xfs_bmbt_disk_get_all(const struct xfs_bmbt_rec *r,
0094         struct xfs_bmbt_irec *s);
0095 
0096 extern void xfs_bmbt_to_bmdr(struct xfs_mount *, struct xfs_btree_block *, int,
0097             xfs_bmdr_block_t *, int);
0098 
0099 extern int xfs_bmbt_get_maxrecs(struct xfs_btree_cur *, int level);
0100 extern int xfs_bmdr_maxrecs(int blocklen, int leaf);
0101 extern int xfs_bmbt_maxrecs(struct xfs_mount *, int blocklen, int leaf);
0102 
0103 extern int xfs_bmbt_change_owner(struct xfs_trans *tp, struct xfs_inode *ip,
0104                  int whichfork, xfs_ino_t new_owner,
0105                  struct list_head *buffer_list);
0106 
0107 extern struct xfs_btree_cur *xfs_bmbt_init_cursor(struct xfs_mount *,
0108         struct xfs_trans *, struct xfs_inode *, int);
0109 
0110 extern unsigned long long xfs_bmbt_calc_size(struct xfs_mount *mp,
0111         unsigned long long len);
0112 
0113 unsigned int xfs_bmbt_maxlevels_ondisk(void);
0114 
0115 int __init xfs_bmbt_init_cur_cache(void);
0116 void xfs_bmbt_destroy_cur_cache(void);
0117 
0118 #endif  /* __XFS_BMAP_BTREE_H__ */