1 | // SPDX-License-Identifier: GPL-2.0-or-later |
2 | /* |
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_MEM |
10 | |
11 | struct xfs_buf; |
12 | struct xfs_btree_cur; |
13 | struct xfs_mount; |
14 | |
15 | #define RCBAG_MAGIC 0x74826671 /* 'JRBG' */ |
16 | |
17 | struct rcbag_key { |
18 | uint32_t rbg_startblock; |
19 | uint32_t rbg_blockcount; |
20 | }; |
21 | |
22 | struct rcbag_rec { |
23 | uint32_t rbg_startblock; |
24 | uint32_t rbg_blockcount; |
25 | uint64_t rbg_refcount; |
26 | }; |
27 | |
28 | typedef __be64 rcbag_ptr_t; |
29 | |
30 | /* reflinks only exist on crc enabled filesystems */ |
31 | #define RCBAG_BLOCK_LEN XFS_BTREE_LBLOCK_CRC_LEN |
32 | |
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 | |
54 | unsigned int rcbagbt_maxrecs(struct xfs_mount *mp, unsigned int blocklen, |
55 | bool leaf); |
56 | |
57 | unsigned long long rcbagbt_calc_size(unsigned long long nr_records); |
58 | |
59 | unsigned int rcbagbt_maxlevels_possible(void); |
60 | |
61 | int __init rcbagbt_init_cur_cache(void); |
62 | void rcbagbt_destroy_cur_cache(void); |
63 | |
64 | struct xfs_btree_cur *rcbagbt_mem_cursor(struct xfs_mount *mp, |
65 | struct xfs_trans *tp, struct xfbtree *xfbtree); |
66 | int rcbagbt_mem_init(struct xfs_mount *mp, struct xfbtree *xfbtree, |
67 | struct xfs_buftarg *btp); |
68 | |
69 | int rcbagbt_lookup_eq(struct xfs_btree_cur *cur, |
70 | const struct xfs_rmap_irec *rmap, int *success); |
71 | int rcbagbt_get_rec(struct xfs_btree_cur *cur, struct rcbag_rec *rec, int *has); |
72 | int rcbagbt_update(struct xfs_btree_cur *cur, const struct rcbag_rec *rec); |
73 | int rcbagbt_insert(struct xfs_btree_cur *cur, const struct rcbag_rec *rec, |
74 | int *success); |
75 | |
76 | #else |
77 | # define rcbagbt_init_cur_cache() 0 |
78 | # define rcbagbt_destroy_cur_cache() ((void)0) |
79 | #endif /* CONFIG_XFS_BTREE_IN_MEM */ |
80 | |
81 | #endif /* __XFS_SCRUB_RCBAG_BTREE_H__ */ |
82 | |