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
xfbno_to_daddr(xfbno_t blkno)15 static inline xfs_daddr_t xfbno_to_daddr(xfbno_t blkno)
16 {
17 return blkno << XFBNO_BBSHIFT;
18 }
19
xfs_daddr_to_xfbno(xfs_daddr_t daddr)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
xfbtree_verify_bno(struct xfbtree * xfbt,xfbno_t bno)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