xref: /linux/fs/xfs/libxfs/xfs_rtrmap_btree.h (revision b477ff98d903618a1ab8247861f2ea6e70c0f0f8)
1fc6856c6SDarrick J. Wong /* SPDX-License-Identifier: GPL-2.0-or-later */
2fc6856c6SDarrick J. Wong /*
3fc6856c6SDarrick J. Wong  * Copyright (c) 2018-2024 Oracle.  All Rights Reserved.
4fc6856c6SDarrick J. Wong  * Author: Darrick J. Wong <djwong@kernel.org>
5fc6856c6SDarrick J. Wong  */
6fc6856c6SDarrick J. Wong #ifndef __XFS_RTRMAP_BTREE_H__
7fc6856c6SDarrick J. Wong #define __XFS_RTRMAP_BTREE_H__
8fc6856c6SDarrick J. Wong 
9fc6856c6SDarrick J. Wong struct xfs_buf;
10fc6856c6SDarrick J. Wong struct xfs_btree_cur;
11fc6856c6SDarrick J. Wong struct xfs_mount;
12fc6856c6SDarrick J. Wong struct xbtree_ifakeroot;
13fc6856c6SDarrick J. Wong struct xfs_rtgroup;
14*4a61f12eSDarrick J. Wong struct xfbtree;
15fc6856c6SDarrick J. Wong 
16fc6856c6SDarrick J. Wong /* rmaps only exist on crc enabled filesystems */
17fc6856c6SDarrick J. Wong #define XFS_RTRMAP_BLOCK_LEN	XFS_BTREE_LBLOCK_CRC_LEN
18fc6856c6SDarrick J. Wong 
19fc6856c6SDarrick J. Wong struct xfs_btree_cur *xfs_rtrmapbt_init_cursor(struct xfs_trans *tp,
20fc6856c6SDarrick J. Wong 		struct xfs_rtgroup *rtg);
21fc6856c6SDarrick J. Wong struct xfs_btree_cur *xfs_rtrmapbt_stage_cursor(struct xfs_mount *mp,
22fc6856c6SDarrick J. Wong 		struct xfs_rtgroup *rtg, struct xfs_inode *ip,
23fc6856c6SDarrick J. Wong 		struct xbtree_ifakeroot *ifake);
24fc6856c6SDarrick J. Wong void xfs_rtrmapbt_commit_staged_btree(struct xfs_btree_cur *cur,
25fc6856c6SDarrick J. Wong 		struct xfs_trans *tp);
26fc6856c6SDarrick J. Wong unsigned int xfs_rtrmapbt_maxrecs(struct xfs_mount *mp, unsigned int blocklen,
27fc6856c6SDarrick J. Wong 		bool leaf);
28fc6856c6SDarrick J. Wong void xfs_rtrmapbt_compute_maxlevels(struct xfs_mount *mp);
29f33659e8SDarrick J. Wong unsigned int xfs_rtrmapbt_droot_maxrecs(unsigned int blocklen, bool leaf);
30fc6856c6SDarrick J. Wong 
31fc6856c6SDarrick J. Wong /*
32fc6856c6SDarrick J. Wong  * Addresses of records, keys, and pointers within an incore rtrmapbt block.
33fc6856c6SDarrick J. Wong  *
34fc6856c6SDarrick J. Wong  * (note that some of these may appear unused, but they are used in userspace)
35fc6856c6SDarrick J. Wong  */
36fc6856c6SDarrick J. Wong static inline struct xfs_rmap_rec *
xfs_rtrmap_rec_addr(struct xfs_btree_block * block,unsigned int index)37fc6856c6SDarrick J. Wong xfs_rtrmap_rec_addr(
38fc6856c6SDarrick J. Wong 	struct xfs_btree_block	*block,
39fc6856c6SDarrick J. Wong 	unsigned int		index)
40fc6856c6SDarrick J. Wong {
41fc6856c6SDarrick J. Wong 	return (struct xfs_rmap_rec *)
42fc6856c6SDarrick J. Wong 		((char *)block + XFS_RTRMAP_BLOCK_LEN +
43fc6856c6SDarrick J. Wong 		 (index - 1) * sizeof(struct xfs_rmap_rec));
44fc6856c6SDarrick J. Wong }
45fc6856c6SDarrick J. Wong 
46fc6856c6SDarrick J. Wong static inline struct xfs_rmap_key *
xfs_rtrmap_key_addr(struct xfs_btree_block * block,unsigned int index)47fc6856c6SDarrick J. Wong xfs_rtrmap_key_addr(
48fc6856c6SDarrick J. Wong 	struct xfs_btree_block	*block,
49fc6856c6SDarrick J. Wong 	unsigned int		index)
50fc6856c6SDarrick J. Wong {
51fc6856c6SDarrick J. Wong 	return (struct xfs_rmap_key *)
52fc6856c6SDarrick J. Wong 		((char *)block + XFS_RTRMAP_BLOCK_LEN +
53fc6856c6SDarrick J. Wong 		 (index - 1) * 2 * sizeof(struct xfs_rmap_key));
54fc6856c6SDarrick J. Wong }
55fc6856c6SDarrick J. Wong 
56fc6856c6SDarrick J. Wong static inline struct xfs_rmap_key *
xfs_rtrmap_high_key_addr(struct xfs_btree_block * block,unsigned int index)57fc6856c6SDarrick J. Wong xfs_rtrmap_high_key_addr(
58fc6856c6SDarrick J. Wong 	struct xfs_btree_block	*block,
59fc6856c6SDarrick J. Wong 	unsigned int		index)
60fc6856c6SDarrick J. Wong {
61fc6856c6SDarrick J. Wong 	return (struct xfs_rmap_key *)
62fc6856c6SDarrick J. Wong 		((char *)block + XFS_RTRMAP_BLOCK_LEN +
63fc6856c6SDarrick J. Wong 		 sizeof(struct xfs_rmap_key) +
64fc6856c6SDarrick J. Wong 		 (index - 1) * 2 * sizeof(struct xfs_rmap_key));
65fc6856c6SDarrick J. Wong }
66fc6856c6SDarrick J. Wong 
67fc6856c6SDarrick J. Wong static inline xfs_rtrmap_ptr_t *
xfs_rtrmap_ptr_addr(struct xfs_btree_block * block,unsigned int index,unsigned int maxrecs)68fc6856c6SDarrick J. Wong xfs_rtrmap_ptr_addr(
69fc6856c6SDarrick J. Wong 	struct xfs_btree_block	*block,
70fc6856c6SDarrick J. Wong 	unsigned int		index,
71fc6856c6SDarrick J. Wong 	unsigned int		maxrecs)
72fc6856c6SDarrick J. Wong {
73fc6856c6SDarrick J. Wong 	return (xfs_rtrmap_ptr_t *)
74fc6856c6SDarrick J. Wong 		((char *)block + XFS_RTRMAP_BLOCK_LEN +
75fc6856c6SDarrick J. Wong 		 maxrecs * 2 * sizeof(struct xfs_rmap_key) +
76fc6856c6SDarrick J. Wong 		 (index - 1) * sizeof(xfs_rtrmap_ptr_t));
77fc6856c6SDarrick J. Wong }
78fc6856c6SDarrick J. Wong 
79fc6856c6SDarrick J. Wong unsigned int xfs_rtrmapbt_maxlevels_ondisk(void);
80fc6856c6SDarrick J. Wong 
81fc6856c6SDarrick J. Wong int __init xfs_rtrmapbt_init_cur_cache(void);
82fc6856c6SDarrick J. Wong void xfs_rtrmapbt_destroy_cur_cache(void);
83fc6856c6SDarrick J. Wong 
848491a55cSDarrick J. Wong xfs_filblks_t xfs_rtrmapbt_calc_reserves(struct xfs_mount *mp);
858491a55cSDarrick J. Wong 
86f33659e8SDarrick J. Wong /* Addresses of key, pointers, and records within an ondisk rtrmapbt block. */
87f33659e8SDarrick J. Wong 
88f33659e8SDarrick J. Wong static inline struct xfs_rmap_rec *
xfs_rtrmap_droot_rec_addr(struct xfs_rtrmap_root * block,unsigned int index)89f33659e8SDarrick J. Wong xfs_rtrmap_droot_rec_addr(
90f33659e8SDarrick J. Wong 	struct xfs_rtrmap_root	*block,
91f33659e8SDarrick J. Wong 	unsigned int		index)
92f33659e8SDarrick J. Wong {
93f33659e8SDarrick J. Wong 	return (struct xfs_rmap_rec *)
94f33659e8SDarrick J. Wong 		((char *)(block + 1) +
95f33659e8SDarrick J. Wong 		 (index - 1) * sizeof(struct xfs_rmap_rec));
96f33659e8SDarrick J. Wong }
97f33659e8SDarrick J. Wong 
98f33659e8SDarrick J. Wong static inline struct xfs_rmap_key *
xfs_rtrmap_droot_key_addr(struct xfs_rtrmap_root * block,unsigned int index)99f33659e8SDarrick J. Wong xfs_rtrmap_droot_key_addr(
100f33659e8SDarrick J. Wong 	struct xfs_rtrmap_root	*block,
101f33659e8SDarrick J. Wong 	unsigned int		index)
102f33659e8SDarrick J. Wong {
103f33659e8SDarrick J. Wong 	return (struct xfs_rmap_key *)
104f33659e8SDarrick J. Wong 		((char *)(block + 1) +
105f33659e8SDarrick J. Wong 		 (index - 1) * 2 * sizeof(struct xfs_rmap_key));
106f33659e8SDarrick J. Wong }
107f33659e8SDarrick J. Wong 
108f33659e8SDarrick J. Wong static inline xfs_rtrmap_ptr_t *
xfs_rtrmap_droot_ptr_addr(struct xfs_rtrmap_root * block,unsigned int index,unsigned int maxrecs)109f33659e8SDarrick J. Wong xfs_rtrmap_droot_ptr_addr(
110f33659e8SDarrick J. Wong 	struct xfs_rtrmap_root	*block,
111f33659e8SDarrick J. Wong 	unsigned int		index,
112f33659e8SDarrick J. Wong 	unsigned int		maxrecs)
113f33659e8SDarrick J. Wong {
114f33659e8SDarrick J. Wong 	return (xfs_rtrmap_ptr_t *)
115f33659e8SDarrick J. Wong 		((char *)(block + 1) +
116f33659e8SDarrick J. Wong 		 maxrecs * 2 * sizeof(struct xfs_rmap_key) +
117f33659e8SDarrick J. Wong 		 (index - 1) * sizeof(xfs_rtrmap_ptr_t));
118f33659e8SDarrick J. Wong }
119f33659e8SDarrick J. Wong 
120f33659e8SDarrick J. Wong /*
121f33659e8SDarrick J. Wong  * Address of pointers within the incore btree root.
122f33659e8SDarrick J. Wong  *
123f33659e8SDarrick J. Wong  * These are to be used when we know the size of the block and
124f33659e8SDarrick J. Wong  * we don't have a cursor.
125f33659e8SDarrick J. Wong  */
126f33659e8SDarrick J. Wong static inline xfs_rtrmap_ptr_t *
xfs_rtrmap_broot_ptr_addr(struct xfs_mount * mp,struct xfs_btree_block * bb,unsigned int index,unsigned int block_size)127f33659e8SDarrick J. Wong xfs_rtrmap_broot_ptr_addr(
128f33659e8SDarrick J. Wong 	struct xfs_mount	*mp,
129f33659e8SDarrick J. Wong 	struct xfs_btree_block	*bb,
130f33659e8SDarrick J. Wong 	unsigned int		index,
131f33659e8SDarrick J. Wong 	unsigned int		block_size)
132f33659e8SDarrick J. Wong {
133f33659e8SDarrick J. Wong 	return xfs_rtrmap_ptr_addr(bb, index,
134f33659e8SDarrick J. Wong 			xfs_rtrmapbt_maxrecs(mp, block_size, false));
135f33659e8SDarrick J. Wong }
136f33659e8SDarrick J. Wong 
137f33659e8SDarrick J. Wong /*
138f33659e8SDarrick J. Wong  * Compute the space required for the incore btree root containing the given
139f33659e8SDarrick J. Wong  * number of records.
140f33659e8SDarrick J. Wong  */
141f33659e8SDarrick J. Wong static inline size_t
xfs_rtrmap_broot_space_calc(struct xfs_mount * mp,unsigned int level,unsigned int nrecs)142f33659e8SDarrick J. Wong xfs_rtrmap_broot_space_calc(
143f33659e8SDarrick J. Wong 	struct xfs_mount	*mp,
144f33659e8SDarrick J. Wong 	unsigned int		level,
145f33659e8SDarrick J. Wong 	unsigned int		nrecs)
146f33659e8SDarrick J. Wong {
147f33659e8SDarrick J. Wong 	size_t			sz = XFS_RTRMAP_BLOCK_LEN;
148f33659e8SDarrick J. Wong 
149f33659e8SDarrick J. Wong 	if (level > 0)
150f33659e8SDarrick J. Wong 		return sz + nrecs * (2 * sizeof(struct xfs_rmap_key) +
151f33659e8SDarrick J. Wong 					 sizeof(xfs_rtrmap_ptr_t));
152f33659e8SDarrick J. Wong 	return sz + nrecs * sizeof(struct xfs_rmap_rec);
153f33659e8SDarrick J. Wong }
154f33659e8SDarrick J. Wong 
155f33659e8SDarrick J. Wong /*
156f33659e8SDarrick J. Wong  * Compute the space required for the incore btree root given the ondisk
157f33659e8SDarrick J. Wong  * btree root block.
158f33659e8SDarrick J. Wong  */
159f33659e8SDarrick J. Wong static inline size_t
xfs_rtrmap_broot_space(struct xfs_mount * mp,struct xfs_rtrmap_root * bb)160f33659e8SDarrick J. Wong xfs_rtrmap_broot_space(struct xfs_mount *mp, struct xfs_rtrmap_root *bb)
161f33659e8SDarrick J. Wong {
162f33659e8SDarrick J. Wong 	return xfs_rtrmap_broot_space_calc(mp, be16_to_cpu(bb->bb_level),
163f33659e8SDarrick J. Wong 			be16_to_cpu(bb->bb_numrecs));
164f33659e8SDarrick J. Wong }
165f33659e8SDarrick J. Wong 
166f33659e8SDarrick J. Wong /* Compute the space required for the ondisk root block. */
167f33659e8SDarrick J. Wong static inline size_t
xfs_rtrmap_droot_space_calc(unsigned int level,unsigned int nrecs)168f33659e8SDarrick J. Wong xfs_rtrmap_droot_space_calc(
169f33659e8SDarrick J. Wong 	unsigned int		level,
170f33659e8SDarrick J. Wong 	unsigned int		nrecs)
171f33659e8SDarrick J. Wong {
172f33659e8SDarrick J. Wong 	size_t			sz = sizeof(struct xfs_rtrmap_root);
173f33659e8SDarrick J. Wong 
174f33659e8SDarrick J. Wong 	if (level > 0)
175f33659e8SDarrick J. Wong 		return sz + nrecs * (2 * sizeof(struct xfs_rmap_key) +
176f33659e8SDarrick J. Wong 					 sizeof(xfs_rtrmap_ptr_t));
177f33659e8SDarrick J. Wong 	return sz + nrecs * sizeof(struct xfs_rmap_rec);
178f33659e8SDarrick J. Wong }
179f33659e8SDarrick J. Wong 
180f33659e8SDarrick J. Wong /*
181f33659e8SDarrick J. Wong  * Compute the space required for the ondisk root block given an incore root
182f33659e8SDarrick J. Wong  * block.
183f33659e8SDarrick J. Wong  */
184f33659e8SDarrick J. Wong static inline size_t
xfs_rtrmap_droot_space(struct xfs_btree_block * bb)185f33659e8SDarrick J. Wong xfs_rtrmap_droot_space(struct xfs_btree_block *bb)
186f33659e8SDarrick J. Wong {
187f33659e8SDarrick J. Wong 	return xfs_rtrmap_droot_space_calc(be16_to_cpu(bb->bb_level),
188f33659e8SDarrick J. Wong 			be16_to_cpu(bb->bb_numrecs));
189f33659e8SDarrick J. Wong }
190f33659e8SDarrick J. Wong 
191f33659e8SDarrick J. Wong int xfs_iformat_rtrmap(struct xfs_inode *ip, struct xfs_dinode *dip);
192f33659e8SDarrick J. Wong void xfs_rtrmapbt_to_disk(struct xfs_mount *mp, struct xfs_btree_block *rblock,
193f33659e8SDarrick J. Wong 		unsigned int rblocklen, struct xfs_rtrmap_root *dblock,
194f33659e8SDarrick J. Wong 		unsigned int dblocklen);
195f33659e8SDarrick J. Wong void xfs_iflush_rtrmap(struct xfs_inode *ip, struct xfs_dinode *dip);
196f33659e8SDarrick J. Wong 
19771b8acb4SDarrick J. Wong int xfs_rtrmapbt_create(struct xfs_rtgroup *rtg, struct xfs_inode *ip,
19871b8acb4SDarrick J. Wong 		struct xfs_trans *tp, bool init);
19971b8acb4SDarrick J. Wong int xfs_rtrmapbt_init_rtsb(struct xfs_mount *mp, struct xfs_rtgroup *rtg,
20071b8acb4SDarrick J. Wong 		struct xfs_trans *tp);
20171b8acb4SDarrick J. Wong 
2026a849bd8SDarrick J. Wong unsigned long long xfs_rtrmapbt_calc_size(struct xfs_mount *mp,
2036a849bd8SDarrick J. Wong 		unsigned long long len);
2046a849bd8SDarrick J. Wong 
205*4a61f12eSDarrick J. Wong struct xfs_btree_cur *xfs_rtrmapbt_mem_cursor(struct xfs_rtgroup *rtg,
206*4a61f12eSDarrick J. Wong 		struct xfs_trans *tp, struct xfbtree *xfbtree);
207*4a61f12eSDarrick J. Wong int xfs_rtrmapbt_mem_init(struct xfs_mount *mp, struct xfbtree *xfbtree,
208*4a61f12eSDarrick J. Wong 		struct xfs_buftarg *btp, xfs_rgnumber_t rgno);
209*4a61f12eSDarrick J. Wong 
210fc6856c6SDarrick J. Wong #endif /* __XFS_RTRMAP_BTREE_H__ */
211