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