82 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * Copyright (c) 2022-2024 Oracle. All Rights Reserved.4 * Author: Darrick J. Wong <djwong@kernel.org>5 */6#ifndef __XFS_SCRUB_RCBAG_BTREE_H__7#define __XFS_SCRUB_RCBAG_BTREE_H__8 9#ifdef CONFIG_XFS_BTREE_IN_MEM10 11struct xfs_buf;12struct xfs_btree_cur;13struct xfs_mount;14 15#define RCBAG_MAGIC 0x74826671 /* 'JRBG' */16 17struct rcbag_key {18 uint32_t rbg_startblock;19 uint32_t rbg_blockcount;20};21 22struct rcbag_rec {23 uint32_t rbg_startblock;24 uint32_t rbg_blockcount;25 uint64_t rbg_refcount;26};27 28typedef __be64 rcbag_ptr_t;29 30/* reflinks only exist on crc enabled filesystems */31#define RCBAG_BLOCK_LEN XFS_BTREE_LBLOCK_CRC_LEN32 33/*34 * Record, key, and pointer address macros for btree blocks.35 *36 * (note that some of these may appear unused, but they are used in userspace)37 */38#define RCBAG_REC_ADDR(block, index) \39 ((struct rcbag_rec *) \40 ((char *)(block) + RCBAG_BLOCK_LEN + \41 (((index) - 1) * sizeof(struct rcbag_rec))))42 43#define RCBAG_KEY_ADDR(block, index) \44 ((struct rcbag_key *) \45 ((char *)(block) + RCBAG_BLOCK_LEN + \46 ((index) - 1) * sizeof(struct rcbag_key)))47 48#define RCBAG_PTR_ADDR(block, index, maxrecs) \49 ((rcbag_ptr_t *) \50 ((char *)(block) + RCBAG_BLOCK_LEN + \51 (maxrecs) * sizeof(struct rcbag_key) + \52 ((index) - 1) * sizeof(rcbag_ptr_t)))53 54unsigned int rcbagbt_maxrecs(struct xfs_mount *mp, unsigned int blocklen,55 bool leaf);56 57unsigned long long rcbagbt_calc_size(unsigned long long nr_records);58 59unsigned int rcbagbt_maxlevels_possible(void);60 61int __init rcbagbt_init_cur_cache(void);62void rcbagbt_destroy_cur_cache(void);63 64struct xfs_btree_cur *rcbagbt_mem_cursor(struct xfs_mount *mp,65 struct xfs_trans *tp, struct xfbtree *xfbtree);66int rcbagbt_mem_init(struct xfs_mount *mp, struct xfbtree *xfbtree,67 struct xfs_buftarg *btp);68 69int rcbagbt_lookup_eq(struct xfs_btree_cur *cur,70 const struct xfs_rmap_irec *rmap, int *success);71int rcbagbt_get_rec(struct xfs_btree_cur *cur, struct rcbag_rec *rec, int *has);72int rcbagbt_update(struct xfs_btree_cur *cur, const struct rcbag_rec *rec);73int rcbagbt_insert(struct xfs_btree_cur *cur, const struct rcbag_rec *rec,74 int *success);75 76#else77# define rcbagbt_init_cur_cache() 078# define rcbagbt_destroy_cur_cache() ((void)0)79#endif /* CONFIG_XFS_BTREE_IN_MEM */80 81#endif /* __XFS_SCRUB_RCBAG_BTREE_H__ */82