1 | // SPDX-License-Identifier: GPL-2.0+ |
2 | /* |
3 | * Copyright (C) 2016 Oracle. All Rights Reserved. |
4 | * Author: Darrick J. Wong <darrick.wong@oracle.com> |
5 | */ |
6 | #ifndef __XFS_REFCOUNT_BTREE_H__ |
7 | #define __XFS_REFCOUNT_BTREE_H__ |
8 | |
9 | /* |
10 | * Reference Count Btree on-disk structures |
11 | */ |
12 | |
13 | struct xfs_buf; |
14 | struct xfs_btree_cur; |
15 | struct xfs_mount; |
16 | struct xfs_perag; |
17 | struct xbtree_afakeroot; |
18 | |
19 | /* |
20 | * Btree block header size |
21 | */ |
22 | #define XFS_REFCOUNT_BLOCK_LEN XFS_BTREE_SBLOCK_CRC_LEN |
23 | |
24 | /* |
25 | * Record, key, and pointer address macros for btree blocks. |
26 | * |
27 | * (note that some of these may appear unused, but they are used in userspace) |
28 | */ |
29 | #define XFS_REFCOUNT_REC_ADDR(block, index) \ |
30 | ((struct xfs_refcount_rec *) \ |
31 | ((char *)(block) + \ |
32 | XFS_REFCOUNT_BLOCK_LEN + \ |
33 | (((index) - 1) * sizeof(struct xfs_refcount_rec)))) |
34 | |
35 | #define XFS_REFCOUNT_KEY_ADDR(block, index) \ |
36 | ((struct xfs_refcount_key *) \ |
37 | ((char *)(block) + \ |
38 | XFS_REFCOUNT_BLOCK_LEN + \ |
39 | ((index) - 1) * sizeof(struct xfs_refcount_key))) |
40 | |
41 | #define XFS_REFCOUNT_PTR_ADDR(block, index, maxrecs) \ |
42 | ((xfs_refcount_ptr_t *) \ |
43 | ((char *)(block) + \ |
44 | XFS_REFCOUNT_BLOCK_LEN + \ |
45 | (maxrecs) * sizeof(struct xfs_refcount_key) + \ |
46 | ((index) - 1) * sizeof(xfs_refcount_ptr_t))) |
47 | |
48 | extern struct xfs_btree_cur *xfs_refcountbt_init_cursor(struct xfs_mount *mp, |
49 | struct xfs_trans *tp, struct xfs_buf *agbp, |
50 | struct xfs_perag *pag); |
51 | extern int xfs_refcountbt_maxrecs(int blocklen, bool leaf); |
52 | extern void xfs_refcountbt_compute_maxlevels(struct xfs_mount *mp); |
53 | |
54 | extern xfs_extlen_t xfs_refcountbt_calc_size(struct xfs_mount *mp, |
55 | unsigned long long len); |
56 | extern xfs_extlen_t xfs_refcountbt_max_size(struct xfs_mount *mp, |
57 | xfs_agblock_t agblocks); |
58 | |
59 | extern int xfs_refcountbt_calc_reserves(struct xfs_mount *mp, |
60 | struct xfs_trans *tp, struct xfs_perag *pag, xfs_extlen_t *ask, |
61 | xfs_extlen_t *used); |
62 | |
63 | void xfs_refcountbt_commit_staged_btree(struct xfs_btree_cur *cur, |
64 | struct xfs_trans *tp, struct xfs_buf *agbp); |
65 | |
66 | unsigned int xfs_refcountbt_maxlevels_ondisk(void); |
67 | |
68 | int __init xfs_refcountbt_init_cur_cache(void); |
69 | void xfs_refcountbt_destroy_cur_cache(void); |
70 | |
71 | #endif /* __XFS_REFCOUNT_BTREE_H__ */ |
72 | |