Link: https://lore.kernel.org/r/20260217200002.683975158@linuxfoundation.org Tested-by: Florian Fainelli <florian.fainelli@broadcom.com> Tested-by: Takeshi Ogasawara <takeshi.ogasawara@futuring-girl.com> Tested-by: Peter Schneider <pschneider1968@googlemail.com> Tested-by: Jon Hunter <jonathanh@nvidia.com> Tested-by: Salvatore Bonaccorso <carnil@debian.org> Tested-by: Brett A C Sheffield <bacs@librecast.net> Tested-by: Mark Brown <broonie@kernel.org> Tested-by: Luna Jernberg <droidbittin@gmail.com> Tested-by: Ronald Warsow <rwarsow@gmx.de> Tested-by: Justin M. Forbes <jforbes@fedoraproject.org> Tested-by: Ron Economos <re@w6rz.net> Tested-by: Miguel Ojeda <ojeda@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
76 lines
2.2 KiB
C
76 lines
2.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (c) 2021-2024 Oracle. All Rights Reserved.
|
|
* Author: Darrick J. Wong <djwong@kernel.org>
|
|
*/
|
|
#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__ */
|