/* SPDX-License-Identifier: GPL-2.0 */ /* * Copyright (c) 2021-2024 Oracle. All Rights Reserved. * Author: Darrick J. Wong */ #ifndef __XFS_BTREE_MEM_H__ #define __XFS_BTREE_MEM_H__ typedef uint64_t xfbno_t; #define XFBNO_BLOCKSIZE (XMBUF_BLOCKSIZE) #define XFBNO_BBSHIFT (XMBUF_BLOCKSHIFT - BBSHIFT) #define XFBNO_BBSIZE (XFBNO_BLOCKSIZE >> BBSHIFT) static inline xfs_daddr_t xfbno_to_daddr(xfbno_t blkno) { return blkno << XFBNO_BBSHIFT; } static inline xfbno_t xfs_daddr_to_xfbno(xfs_daddr_t daddr) { return daddr >> XFBNO_BBSHIFT; } struct xfbtree { /* buffer cache target for this in-memory btree */ struct xfs_buftarg *target; /* Highest block number that has been written to. */ xfbno_t highest_bno; /* Owner of this btree. */ unsigned long long owner; /* Btree header */ union xfs_btree_ptr root; unsigned int nlevels; /* Minimum and maximum records per block. */ unsigned int maxrecs[2]; unsigned int minrecs[2]; }; #ifdef CONFIG_XFS_BTREE_IN_MEM static inline bool xfbtree_verify_bno(struct xfbtree *xfbt, xfbno_t bno) { return xmbuf_verify_daddr(xfbt->target, xfbno_to_daddr(bno)); } void xfbtree_set_root(struct xfs_btree_cur *cur, const union xfs_btree_ptr *ptr, int inc); void xfbtree_init_ptr_from_cur(struct xfs_btree_cur *cur, union xfs_btree_ptr *ptr); struct xfs_btree_cur *xfbtree_dup_cursor(struct xfs_btree_cur *cur); int xfbtree_get_minrecs(struct xfs_btree_cur *cur, int level); int xfbtree_get_maxrecs(struct xfs_btree_cur *cur, int level); int xfbtree_alloc_block(struct xfs_btree_cur *cur, const union xfs_btree_ptr *start, union xfs_btree_ptr *ptr, int *stat); int xfbtree_free_block(struct xfs_btree_cur *cur, struct xfs_buf *bp); /* Callers must set xfbt->target and xfbt->owner before calling this */ int xfbtree_init(struct xfs_mount *mp, struct xfbtree *xfbt, struct xfs_buftarg *btp, const struct xfs_btree_ops *ops); void xfbtree_destroy(struct xfbtree *xfbt); int xfbtree_trans_commit(struct xfbtree *xfbt, struct xfs_trans *tp); void xfbtree_trans_cancel(struct xfbtree *xfbt, struct xfs_trans *tp); #else # define xfbtree_verify_bno(...) (false) #endif /* CONFIG_XFS_BTREE_IN_MEM */ #endif /* __XFS_BTREE_MEM_H__ */