// SPDX-License-Identifier: GPL-2.0-or-later /* * Copyright (c) 2022-2024 Oracle. All Rights Reserved. * Author: Darrick J. Wong */ #ifndef __XFS_SCRUB_RCBAG_BTREE_H__ #define __XFS_SCRUB_RCBAG_BTREE_H__ #ifdef CONFIG_XFS_BTREE_IN_MEM struct xfs_buf; struct xfs_btree_cur; struct xfs_mount; #define RCBAG_MAGIC 0x74826671 /* 'JRBG' */ struct rcbag_key { uint32_t rbg_startblock; uint32_t rbg_blockcount; }; struct rcbag_rec { uint32_t rbg_startblock; uint32_t rbg_blockcount; uint64_t rbg_refcount; }; typedef __be64 rcbag_ptr_t; /* reflinks only exist on crc enabled filesystems */ #define RCBAG_BLOCK_LEN XFS_BTREE_LBLOCK_CRC_LEN /* * Record, key, and pointer address macros for btree blocks. * * (note that some of these may appear unused, but they are used in userspace) */ #define RCBAG_REC_ADDR(block, index) \ ((struct rcbag_rec *) \ ((char *)(block) + RCBAG_BLOCK_LEN + \ (((index) - 1) * sizeof(struct rcbag_rec)))) #define RCBAG_KEY_ADDR(block, index) \ ((struct rcbag_key *) \ ((char *)(block) + RCBAG_BLOCK_LEN + \ ((index) - 1) * sizeof(struct rcbag_key))) #define RCBAG_PTR_ADDR(block, index, maxrecs) \ ((rcbag_ptr_t *) \ ((char *)(block) + RCBAG_BLOCK_LEN + \ (maxrecs) * sizeof(struct rcbag_key) + \ ((index) - 1) * sizeof(rcbag_ptr_t))) unsigned int rcbagbt_maxrecs(struct xfs_mount *mp, unsigned int blocklen, bool leaf); unsigned long long rcbagbt_calc_size(unsigned long long nr_records); unsigned int rcbagbt_maxlevels_possible(void); int __init rcbagbt_init_cur_cache(void); void rcbagbt_destroy_cur_cache(void); struct xfs_btree_cur *rcbagbt_mem_cursor(struct xfs_mount *mp, struct xfs_trans *tp, struct xfbtree *xfbtree); int rcbagbt_mem_init(struct xfs_mount *mp, struct xfbtree *xfbtree, struct xfs_buftarg *btp); int rcbagbt_lookup_eq(struct xfs_btree_cur *cur, const struct xfs_rmap_irec *rmap, int *success); int rcbagbt_get_rec(struct xfs_btree_cur *cur, struct rcbag_rec *rec, int *has); int rcbagbt_update(struct xfs_btree_cur *cur, const struct rcbag_rec *rec); int rcbagbt_insert(struct xfs_btree_cur *cur, const struct rcbag_rec *rec, int *success); #else # define rcbagbt_init_cur_cache() 0 # define rcbagbt_destroy_cur_cache() ((void)0) #endif /* CONFIG_XFS_BTREE_IN_MEM */ #endif /* __XFS_SCRUB_RCBAG_BTREE_H__ */