xref: /linux/fs/xfs/libxfs/xfs_rtrefcount_btree.h (revision 9abe03a0e4f978615a2b1b484b8d09ca84c16ea0)
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 #endif	/* __XFS_RTREFCOUNT_BTREE_H__ */
71