1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Copyright (c) 2021-2024 Oracle. All Rights Reserved. 4 * Author: Darrick J. Wong <djwong@kernel.org> 5 */ 6 #ifndef __XFS_RTREFCOUNT_BTREE_H__ 7 #define __XFS_RTREFCOUNT_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 /* refcounts only exist on crc enabled filesystems */ 16 #define XFS_RTREFCOUNT_BLOCK_LEN XFS_BTREE_LBLOCK_CRC_LEN 17 18 struct xfs_btree_cur *xfs_rtrefcountbt_init_cursor(struct xfs_trans *tp, 19 struct xfs_rtgroup *rtg); 20 struct xfs_btree_cur *xfs_rtrefcountbt_stage_cursor(struct xfs_mount *mp, 21 struct xfs_rtgroup *rtg, struct xfs_inode *ip, 22 struct xbtree_ifakeroot *ifake); 23 void xfs_rtrefcountbt_commit_staged_btree(struct xfs_btree_cur *cur, 24 struct xfs_trans *tp); 25 unsigned int xfs_rtrefcountbt_maxrecs(struct xfs_mount *mp, 26 unsigned int blocklen, bool leaf); 27 void xfs_rtrefcountbt_compute_maxlevels(struct xfs_mount *mp); 28 29 /* 30 * Addresses of records, keys, and pointers within an incore rtrefcountbt block. 31 * 32 * (note that some of these may appear unused, but they are used in userspace) 33 */ 34 static inline struct xfs_refcount_rec * 35 xfs_rtrefcount_rec_addr( 36 struct xfs_btree_block *block, 37 unsigned int index) 38 { 39 return (struct xfs_refcount_rec *) 40 ((char *)block + XFS_RTREFCOUNT_BLOCK_LEN + 41 (index - 1) * sizeof(struct xfs_refcount_rec)); 42 } 43 44 static inline struct xfs_refcount_key * 45 xfs_rtrefcount_key_addr( 46 struct xfs_btree_block *block, 47 unsigned int index) 48 { 49 return (struct xfs_refcount_key *) 50 ((char *)block + XFS_RTREFCOUNT_BLOCK_LEN + 51 (index - 1) * sizeof(struct xfs_refcount_key)); 52 } 53 54 static inline xfs_rtrefcount_ptr_t * 55 xfs_rtrefcount_ptr_addr( 56 struct xfs_btree_block *block, 57 unsigned int index, 58 unsigned int maxrecs) 59 { 60 return (xfs_rtrefcount_ptr_t *) 61 ((char *)block + XFS_RTREFCOUNT_BLOCK_LEN + 62 maxrecs * sizeof(struct xfs_refcount_key) + 63 (index - 1) * sizeof(xfs_rtrefcount_ptr_t)); 64 } 65 66 unsigned int xfs_rtrefcountbt_maxlevels_ondisk(void); 67 int __init xfs_rtrefcountbt_init_cur_cache(void); 68 void xfs_rtrefcountbt_destroy_cur_cache(void); 69 70 xfs_filblks_t xfs_rtrefcountbt_calc_reserves(struct xfs_mount *mp); 71 unsigned long long xfs_rtrefcountbt_calc_size(struct xfs_mount *mp, 72 unsigned long long len); 73 74 #endif /* __XFS_RTREFCOUNT_BTREE_H__ */ 75