xref: /linux/fs/xfs/libxfs/xfs_btree_mem.h (revision c532de5a67a70f8533d495f8f2aaa9a0491c3ad0)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3  * Copyright (c) 2021-2024 Oracle.  All Rights Reserved.
4  * Author: Darrick J. Wong <djwong@kernel.org>
5  */
6 #ifndef __XFS_BTREE_MEM_H__
7 #define __XFS_BTREE_MEM_H__
8 
9 typedef uint64_t xfbno_t;
10 
11 #define XFBNO_BLOCKSIZE			(XMBUF_BLOCKSIZE)
12 #define XFBNO_BBSHIFT			(XMBUF_BLOCKSHIFT - BBSHIFT)
13 #define XFBNO_BBSIZE			(XFBNO_BLOCKSIZE >> BBSHIFT)
14 
15 static inline xfs_daddr_t xfbno_to_daddr(xfbno_t blkno)
16 {
17 	return blkno << XFBNO_BBSHIFT;
18 }
19 
20 static inline xfbno_t xfs_daddr_to_xfbno(xfs_daddr_t daddr)
21 {
22 	return daddr >> XFBNO_BBSHIFT;
23 }
24 
25 struct xfbtree {
26 	/* buffer cache target for this in-memory btree */
27 	struct xfs_buftarg		*target;
28 
29 	/* Highest block number that has been written to. */
30 	xfbno_t				highest_bno;
31 
32 	/* Owner of this btree. */
33 	unsigned long long		owner;
34 
35 	/* Btree header */
36 	union xfs_btree_ptr		root;
37 	unsigned int			nlevels;
38 
39 	/* Minimum and maximum records per block. */
40 	unsigned int			maxrecs[2];
41 	unsigned int			minrecs[2];
42 };
43 
44 #ifdef CONFIG_XFS_BTREE_IN_MEM
45 static inline bool xfbtree_verify_bno(struct xfbtree *xfbt, xfbno_t bno)
46 {
47 	return xmbuf_verify_daddr(xfbt->target, xfbno_to_daddr(bno));
48 }
49 
50 void xfbtree_set_root(struct xfs_btree_cur *cur,
51 		const union xfs_btree_ptr *ptr, int inc);
52 void xfbtree_init_ptr_from_cur(struct xfs_btree_cur *cur,
53 		union xfs_btree_ptr *ptr);
54 struct xfs_btree_cur *xfbtree_dup_cursor(struct xfs_btree_cur *cur);
55 
56 int xfbtree_get_minrecs(struct xfs_btree_cur *cur, int level);
57 int xfbtree_get_maxrecs(struct xfs_btree_cur *cur, int level);
58 
59 int xfbtree_alloc_block(struct xfs_btree_cur *cur,
60 		const union xfs_btree_ptr *start, union xfs_btree_ptr *ptr,
61 		int *stat);
62 int xfbtree_free_block(struct xfs_btree_cur *cur, struct xfs_buf *bp);
63 
64 /* Callers must set xfbt->target and xfbt->owner before calling this */
65 int xfbtree_init(struct xfs_mount *mp, struct xfbtree *xfbt,
66 		struct xfs_buftarg *btp, const struct xfs_btree_ops *ops);
67 void xfbtree_destroy(struct xfbtree *xfbt);
68 
69 int xfbtree_trans_commit(struct xfbtree *xfbt, struct xfs_trans *tp);
70 void xfbtree_trans_cancel(struct xfbtree *xfbt, struct xfs_trans *tp);
71 #else
72 # define xfbtree_verify_bno(...)	(false)
73 #endif /* CONFIG_XFS_BTREE_IN_MEM */
74 
75 #endif /* __XFS_BTREE_MEM_H__ */
76