xfs_refcount_item.h 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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_ITEM_H__
  7. #define __XFS_REFCOUNT_ITEM_H__
  8. /*
  9. * There are (currently) two pairs of refcount btree redo item types:
  10. * increase and decrease. The log items for these are CUI (refcount
  11. * update intent) and CUD (refcount update done). The redo item type
  12. * is encoded in the flags field of each xfs_map_extent.
  13. *
  14. * *I items should be recorded in the *first* of a series of rolled
  15. * transactions, and the *D items should be recorded in the same
  16. * transaction that records the associated refcountbt updates.
  17. *
  18. * Should the system crash after the commit of the first transaction
  19. * but before the commit of the final transaction in a series, log
  20. * recovery will use the redo information recorded by the intent items
  21. * to replay the refcountbt metadata updates.
  22. */
  23. /* kernel only CUI/CUD definitions */
  24. struct xfs_mount;
  25. struct kmem_zone;
  26. /*
  27. * Max number of extents in fast allocation path.
  28. */
  29. #define XFS_CUI_MAX_FAST_EXTENTS 16
  30. /*
  31. * Define CUI flag bits. Manipulated by set/clear/test_bit operators.
  32. */
  33. #define XFS_CUI_RECOVERED 1
  34. /*
  35. * This is the "refcount update intent" log item. It is used to log
  36. * the fact that some reverse mappings need to change. It is used in
  37. * conjunction with the "refcount update done" log item described
  38. * below.
  39. *
  40. * These log items follow the same rules as struct xfs_efi_log_item;
  41. * see the comments about that structure (in xfs_extfree_item.h) for
  42. * more details.
  43. */
  44. struct xfs_cui_log_item {
  45. struct xfs_log_item cui_item;
  46. atomic_t cui_refcount;
  47. atomic_t cui_next_extent;
  48. unsigned long cui_flags; /* misc flags */
  49. struct xfs_cui_log_format cui_format;
  50. };
  51. static inline size_t
  52. xfs_cui_log_item_sizeof(
  53. unsigned int nr)
  54. {
  55. return offsetof(struct xfs_cui_log_item, cui_format) +
  56. xfs_cui_log_format_sizeof(nr);
  57. }
  58. /*
  59. * This is the "refcount update done" log item. It is used to log the
  60. * fact that some refcountbt updates mentioned in an earlier cui item
  61. * have been performed.
  62. */
  63. struct xfs_cud_log_item {
  64. struct xfs_log_item cud_item;
  65. struct xfs_cui_log_item *cud_cuip;
  66. struct xfs_cud_log_format cud_format;
  67. };
  68. extern struct kmem_zone *xfs_cui_zone;
  69. extern struct kmem_zone *xfs_cud_zone;
  70. struct xfs_cui_log_item *xfs_cui_init(struct xfs_mount *, uint);
  71. struct xfs_cud_log_item *xfs_cud_init(struct xfs_mount *,
  72. struct xfs_cui_log_item *);
  73. void xfs_cui_item_free(struct xfs_cui_log_item *);
  74. void xfs_cui_release(struct xfs_cui_log_item *);
  75. int xfs_cui_recover(struct xfs_trans *parent_tp, struct xfs_cui_log_item *cuip);
  76. #endif /* __XFS_REFCOUNT_ITEM_H__ */