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
9typedef 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
15static inline xfs_daddr_t xfbno_to_daddr(xfbno_t blkno)
16{
17	return blkno << XFBNO_BBSHIFT;
18}
19
20static inline xfbno_t xfs_daddr_to_xfbno(xfs_daddr_t daddr)
21{
22	return daddr >> XFBNO_BBSHIFT;
23}
24
25struct 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
45static 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
50void xfbtree_set_root(struct xfs_btree_cur *cur,
51		const union xfs_btree_ptr *ptr, int inc);
52void xfbtree_init_ptr_from_cur(struct xfs_btree_cur *cur,
53		union xfs_btree_ptr *ptr);
54struct xfs_btree_cur *xfbtree_dup_cursor(struct xfs_btree_cur *cur);
55
56int xfbtree_get_minrecs(struct xfs_btree_cur *cur, int level);
57int xfbtree_get_maxrecs(struct xfs_btree_cur *cur, int level);
58
59int xfbtree_alloc_block(struct xfs_btree_cur *cur,
60		const union xfs_btree_ptr *start, union xfs_btree_ptr *ptr,
61		int *stat);
62int 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 */
65int xfbtree_init(struct xfs_mount *mp, struct xfbtree *xfbt,
66		struct xfs_buftarg *btp, const struct xfs_btree_ops *ops);
67void xfbtree_destroy(struct xfbtree *xfbt);
68
69int xfbtree_trans_commit(struct xfbtree *xfbt, struct xfs_trans *tp);
70void 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