1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Copyright (c) 2018-2024 Oracle. All Rights Reserved. 4 * Author: Darrick J. Wong <djwong@kernel.org> 5 */ 6 #ifndef __XFS_RTRMAP_BTREE_H__ 7 #define __XFS_RTRMAP_BTREE_H__ 8 9 struct xfs_buf; 10 struct xfs_btree_cur; 11 struct xfs_mount; 12 struct xbtree_ifakeroot; 13 struct xfs_rtgroup; 14 15 /* rmaps only exist on crc enabled filesystems */ 16 #define XFS_RTRMAP_BLOCK_LEN XFS_BTREE_LBLOCK_CRC_LEN 17 18 struct xfs_btree_cur *xfs_rtrmapbt_init_cursor(struct xfs_trans *tp, 19 struct xfs_rtgroup *rtg); 20 struct xfs_btree_cur *xfs_rtrmapbt_stage_cursor(struct xfs_mount *mp, 21 struct xfs_rtgroup *rtg, struct xfs_inode *ip, 22 struct xbtree_ifakeroot *ifake); 23 void xfs_rtrmapbt_commit_staged_btree(struct xfs_btree_cur *cur, 24 struct xfs_trans *tp); 25 unsigned int xfs_rtrmapbt_maxrecs(struct xfs_mount *mp, unsigned int blocklen, 26 bool leaf); 27 void xfs_rtrmapbt_compute_maxlevels(struct xfs_mount *mp); 28 29 /* 30 * Addresses of records, keys, and pointers within an incore rtrmapbt block. 31 * 32 * (note that some of these may appear unused, but they are used in userspace) 33 */ 34 static inline struct xfs_rmap_rec * 35 xfs_rtrmap_rec_addr( 36 struct xfs_btree_block *block, 37 unsigned int index) 38 { 39 return (struct xfs_rmap_rec *) 40 ((char *)block + XFS_RTRMAP_BLOCK_LEN + 41 (index - 1) * sizeof(struct xfs_rmap_rec)); 42 } 43 44 static inline struct xfs_rmap_key * 45 xfs_rtrmap_key_addr( 46 struct xfs_btree_block *block, 47 unsigned int index) 48 { 49 return (struct xfs_rmap_key *) 50 ((char *)block + XFS_RTRMAP_BLOCK_LEN + 51 (index - 1) * 2 * sizeof(struct xfs_rmap_key)); 52 } 53 54 static inline struct xfs_rmap_key * 55 xfs_rtrmap_high_key_addr( 56 struct xfs_btree_block *block, 57 unsigned int index) 58 { 59 return (struct xfs_rmap_key *) 60 ((char *)block + XFS_RTRMAP_BLOCK_LEN + 61 sizeof(struct xfs_rmap_key) + 62 (index - 1) * 2 * sizeof(struct xfs_rmap_key)); 63 } 64 65 static inline xfs_rtrmap_ptr_t * 66 xfs_rtrmap_ptr_addr( 67 struct xfs_btree_block *block, 68 unsigned int index, 69 unsigned int maxrecs) 70 { 71 return (xfs_rtrmap_ptr_t *) 72 ((char *)block + XFS_RTRMAP_BLOCK_LEN + 73 maxrecs * 2 * sizeof(struct xfs_rmap_key) + 74 (index - 1) * sizeof(xfs_rtrmap_ptr_t)); 75 } 76 77 unsigned int xfs_rtrmapbt_maxlevels_ondisk(void); 78 79 int __init xfs_rtrmapbt_init_cur_cache(void); 80 void xfs_rtrmapbt_destroy_cur_cache(void); 81 82 xfs_filblks_t xfs_rtrmapbt_calc_reserves(struct xfs_mount *mp); 83 84 #endif /* __XFS_RTRMAP_BTREE_H__ */ 85