rcbag_btree.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  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. #ifdef CONFIG_XFS_BTREE_IN_MEM
  9. struct xfs_buf;
  10. struct xfs_btree_cur;
  11. struct xfs_mount;
  12. #define RCBAG_MAGIC 0x74826671 /* 'JRBG' */
  13. struct rcbag_key {
  14. uint32_t rbg_startblock;
  15. uint32_t rbg_blockcount;
  16. };
  17. struct rcbag_rec {
  18. uint32_t rbg_startblock;
  19. uint32_t rbg_blockcount;
  20. uint64_t rbg_refcount;
  21. };
  22. typedef __be64 rcbag_ptr_t;
  23. /* reflinks only exist on crc enabled filesystems */
  24. #define RCBAG_BLOCK_LEN XFS_BTREE_LBLOCK_CRC_LEN
  25. /*
  26. * Record, key, and pointer address macros for btree blocks.
  27. *
  28. * (note that some of these may appear unused, but they are used in userspace)
  29. */
  30. #define RCBAG_REC_ADDR(block, index) \
  31. ((struct rcbag_rec *) \
  32. ((char *)(block) + RCBAG_BLOCK_LEN + \
  33. (((index) - 1) * sizeof(struct rcbag_rec))))
  34. #define RCBAG_KEY_ADDR(block, index) \
  35. ((struct rcbag_key *) \
  36. ((char *)(block) + RCBAG_BLOCK_LEN + \
  37. ((index) - 1) * sizeof(struct rcbag_key)))
  38. #define RCBAG_PTR_ADDR(block, index, maxrecs) \
  39. ((rcbag_ptr_t *) \
  40. ((char *)(block) + RCBAG_BLOCK_LEN + \
  41. (maxrecs) * sizeof(struct rcbag_key) + \
  42. ((index) - 1) * sizeof(rcbag_ptr_t)))
  43. unsigned int rcbagbt_maxrecs(struct xfs_mount *mp, unsigned int blocklen,
  44. bool leaf);
  45. unsigned long long rcbagbt_calc_size(unsigned long long nr_records);
  46. unsigned int rcbagbt_maxlevels_possible(void);
  47. int __init rcbagbt_init_cur_cache(void);
  48. void rcbagbt_destroy_cur_cache(void);
  49. struct xfs_btree_cur *rcbagbt_mem_cursor(struct xfs_mount *mp,
  50. struct xfs_trans *tp, struct xfbtree *xfbtree);
  51. int rcbagbt_mem_init(struct xfs_mount *mp, struct xfbtree *xfbtree,
  52. struct xfs_buftarg *btp);
  53. int rcbagbt_lookup_eq(struct xfs_btree_cur *cur,
  54. const struct xfs_rmap_irec *rmap, int *success);
  55. int rcbagbt_get_rec(struct xfs_btree_cur *cur, struct rcbag_rec *rec, int *has);
  56. int rcbagbt_update(struct xfs_btree_cur *cur, const struct rcbag_rec *rec);
  57. int rcbagbt_insert(struct xfs_btree_cur *cur, const struct rcbag_rec *rec,
  58. int *success);
  59. #else
  60. # define rcbagbt_init_cur_cache() 0
  61. # define rcbagbt_destroy_cur_cache() ((void)0)
  62. #endif /* CONFIG_XFS_BTREE_IN_MEM */
  63. #endif /* __XFS_SCRUB_RCBAG_BTREE_H__ */