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