xfs_refcount_item.h 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. * This is the "refcount update intent" log item. It is used to log
  32. * the fact that some reverse mappings need to change. It is used in
  33. * conjunction with the "refcount update done" log item described
  34. * below.
  35. *
  36. * These log items follow the same rules as struct xfs_efi_log_item;
  37. * see the comments about that structure (in xfs_extfree_item.h) for
  38. * more details.
  39. */
  40. struct xfs_cui_log_item {
  41. struct xfs_log_item cui_item;
  42. atomic_t cui_refcount;
  43. atomic_t cui_next_extent;
  44. struct xfs_cui_log_format cui_format;
  45. };
  46. static inline size_t
  47. xfs_cui_log_item_sizeof(
  48. unsigned int nr)
  49. {
  50. return offsetof(struct xfs_cui_log_item, cui_format) +
  51. xfs_cui_log_format_sizeof(nr);
  52. }
  53. /*
  54. * This is the "refcount update done" log item. It is used to log the
  55. * fact that some refcountbt updates mentioned in an earlier cui item
  56. * have been performed.
  57. */
  58. struct xfs_cud_log_item {
  59. struct xfs_log_item cud_item;
  60. struct xfs_cui_log_item *cud_cuip;
  61. struct xfs_cud_log_format cud_format;
  62. };
  63. extern struct kmem_zone *xfs_cui_zone;
  64. extern struct kmem_zone *xfs_cud_zone;
  65. #endif /* __XFS_REFCOUNT_ITEM_H__ */