1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * Copyright (c) 2014 Red Hat, Inc. |
4 | * All Rights Reserved. |
5 | */ |
6 | #ifndef __XFS_RMAP_BTREE_H__ |
7 | #define __XFS_RMAP_BTREE_H__ |
8 | |
9 | struct xfs_buf; |
10 | struct xfs_btree_cur; |
11 | struct xfs_mount; |
12 | struct xbtree_afakeroot; |
13 | struct xfbtree; |
14 | |
15 | /* rmaps only exist on crc enabled filesystems */ |
16 | #define XFS_RMAP_BLOCK_LEN XFS_BTREE_SBLOCK_CRC_LEN |
17 | |
18 | /* |
19 | * Record, key, and pointer address macros for btree blocks. |
20 | * |
21 | * (note that some of these may appear unused, but they are used in userspace) |
22 | */ |
23 | #define XFS_RMAP_REC_ADDR(block, index) \ |
24 | ((struct xfs_rmap_rec *) \ |
25 | ((char *)(block) + XFS_RMAP_BLOCK_LEN + \ |
26 | (((index) - 1) * sizeof(struct xfs_rmap_rec)))) |
27 | |
28 | #define XFS_RMAP_KEY_ADDR(block, index) \ |
29 | ((struct xfs_rmap_key *) \ |
30 | ((char *)(block) + XFS_RMAP_BLOCK_LEN + \ |
31 | ((index) - 1) * 2 * sizeof(struct xfs_rmap_key))) |
32 | |
33 | #define XFS_RMAP_HIGH_KEY_ADDR(block, index) \ |
34 | ((struct xfs_rmap_key *) \ |
35 | ((char *)(block) + XFS_RMAP_BLOCK_LEN + \ |
36 | sizeof(struct xfs_rmap_key) + \ |
37 | ((index) - 1) * 2 * sizeof(struct xfs_rmap_key))) |
38 | |
39 | #define XFS_RMAP_PTR_ADDR(block, index, maxrecs) \ |
40 | ((xfs_rmap_ptr_t *) \ |
41 | ((char *)(block) + XFS_RMAP_BLOCK_LEN + \ |
42 | (maxrecs) * 2 * sizeof(struct xfs_rmap_key) + \ |
43 | ((index) - 1) * sizeof(xfs_rmap_ptr_t))) |
44 | |
45 | struct xfs_btree_cur *xfs_rmapbt_init_cursor(struct xfs_mount *mp, |
46 | struct xfs_trans *tp, struct xfs_buf *bp, |
47 | struct xfs_perag *pag); |
48 | void xfs_rmapbt_commit_staged_btree(struct xfs_btree_cur *cur, |
49 | struct xfs_trans *tp, struct xfs_buf *agbp); |
50 | int xfs_rmapbt_maxrecs(int blocklen, int leaf); |
51 | extern void xfs_rmapbt_compute_maxlevels(struct xfs_mount *mp); |
52 | |
53 | extern xfs_extlen_t xfs_rmapbt_calc_size(struct xfs_mount *mp, |
54 | unsigned long long len); |
55 | extern xfs_extlen_t xfs_rmapbt_max_size(struct xfs_mount *mp, |
56 | xfs_agblock_t agblocks); |
57 | |
58 | extern int xfs_rmapbt_calc_reserves(struct xfs_mount *mp, struct xfs_trans *tp, |
59 | struct xfs_perag *pag, xfs_extlen_t *ask, xfs_extlen_t *used); |
60 | |
61 | unsigned int xfs_rmapbt_maxlevels_ondisk(void); |
62 | |
63 | int __init xfs_rmapbt_init_cur_cache(void); |
64 | void xfs_rmapbt_destroy_cur_cache(void); |
65 | |
66 | struct xfs_btree_cur *xfs_rmapbt_mem_cursor(struct xfs_perag *pag, |
67 | struct xfs_trans *tp, struct xfbtree *xfbtree); |
68 | int xfs_rmapbt_mem_init(struct xfs_mount *mp, struct xfbtree *xfbtree, |
69 | struct xfs_buftarg *btp, xfs_agnumber_t agno); |
70 | |
71 | #endif /* __XFS_RMAP_BTREE_H__ */ |
72 | |