xref: /linux/fs/xfs/libxfs/xfs_rtrmap_btree.h (revision 8491a55cfc73ff5c2c637a70ade51d4d08abb90a)
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