GNU Linux-libre 6.9-gnu
[releases.git] / fs / xfs / libxfs / xfs_btree_mem.h
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__ */