xfs_extent_busy.h 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
  4. * Copyright (c) 2010 David Chinner.
  5. * Copyright (c) 2011 Christoph Hellwig.
  6. * All Rights Reserved.
  7. */
  8. #ifndef __XFS_EXTENT_BUSY_H__
  9. #define __XFS_EXTENT_BUSY_H__
  10. struct xfs_mount;
  11. struct xfs_trans;
  12. struct xfs_alloc_arg;
  13. /*
  14. * Busy block/extent entry. Indexed by a rbtree in perag to mark blocks that
  15. * have been freed but whose transactions aren't committed to disk yet.
  16. *
  17. * Note that we use the transaction ID to record the transaction, not the
  18. * transaction structure itself. See xfs_extent_busy_insert() for details.
  19. */
  20. struct xfs_extent_busy {
  21. struct rb_node rb_node; /* ag by-bno indexed search tree */
  22. struct list_head list; /* transaction busy extent list */
  23. xfs_agnumber_t agno;
  24. xfs_agblock_t bno;
  25. xfs_extlen_t length;
  26. unsigned int flags;
  27. #define XFS_EXTENT_BUSY_DISCARDED 0x01 /* undergoing a discard op. */
  28. #define XFS_EXTENT_BUSY_SKIP_DISCARD 0x02 /* do not discard */
  29. };
  30. void
  31. xfs_extent_busy_insert(struct xfs_trans *tp, xfs_agnumber_t agno,
  32. xfs_agblock_t bno, xfs_extlen_t len, unsigned int flags);
  33. void
  34. xfs_extent_busy_clear(struct xfs_mount *mp, struct list_head *list,
  35. bool do_discard);
  36. int
  37. xfs_extent_busy_search(struct xfs_mount *mp, xfs_agnumber_t agno,
  38. xfs_agblock_t bno, xfs_extlen_t len);
  39. void
  40. xfs_extent_busy_reuse(struct xfs_mount *mp, xfs_agnumber_t agno,
  41. xfs_agblock_t fbno, xfs_extlen_t flen, bool userdata);
  42. bool
  43. xfs_extent_busy_trim(struct xfs_alloc_arg *args, xfs_agblock_t *bno,
  44. xfs_extlen_t *len, unsigned *busy_gen);
  45. void
  46. xfs_extent_busy_flush(struct xfs_mount *mp, struct xfs_perag *pag,
  47. unsigned busy_gen);
  48. void
  49. xfs_extent_busy_wait_all(struct xfs_mount *mp);
  50. int
  51. xfs_extent_busy_ag_cmp(void *priv, struct list_head *a, struct list_head *b);
  52. static inline void xfs_extent_busy_sort(struct list_head *list)
  53. {
  54. list_sort(NULL, list, xfs_extent_busy_ag_cmp);
  55. }
  56. #endif /* __XFS_EXTENT_BUSY_H__ */