Commit | Line | Data |
---|---|---|
a095686a DW |
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); | |
0dc63c8a DW |
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); | |
a095686a DW |
71 | #else |
72 | # define xfbtree_verify_bno(...) (false) | |
73 | #endif /* CONFIG_XFS_BTREE_IN_MEM */ | |
74 | ||
75 | #endif /* __XFS_BTREE_MEM_H__ */ |