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 | |