xfs_extent_busy.h 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  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_perag;
  12. struct xfs_trans;
  13. struct xfs_alloc_arg;
  14. /*
  15. * Busy block/extent entry. Indexed by a rbtree in perag to mark blocks that
  16. * have been freed but whose transactions aren't committed to disk yet.
  17. *
  18. * Note that we use the transaction ID to record the transaction, not the
  19. * transaction structure itself. See xfs_extent_busy_insert() for details.
  20. */
  21. struct xfs_extent_busy {
  22. struct rb_node rb_node; /* ag by-bno indexed search tree */
  23. struct list_head list; /* transaction busy extent list */
  24. xfs_agnumber_t agno;
  25. xfs_agblock_t bno;
  26. xfs_extlen_t length;
  27. unsigned int flags;
  28. #define XFS_EXTENT_BUSY_DISCARDED 0x01 /* undergoing a discard op. */
  29. #define XFS_EXTENT_BUSY_SKIP_DISCARD 0x02 /* do not discard */
  30. };
  31. void
  32. xfs_extent_busy_insert(struct xfs_trans *tp, struct xfs_perag *pag,
  33. xfs_agblock_t bno, xfs_extlen_t len, unsigned int flags);
  34. void
  35. xfs_extent_busy_clear(struct xfs_mount *mp, struct list_head *list,
  36. bool do_discard);
  37. int
  38. xfs_extent_busy_search(struct xfs_mount *mp, struct xfs_perag *pag,
  39. xfs_agblock_t bno, xfs_extlen_t len);
  40. void
  41. xfs_extent_busy_reuse(struct xfs_mount *mp, struct xfs_perag *pag,
  42. xfs_agblock_t fbno, xfs_extlen_t flen, bool userdata);
  43. bool
  44. xfs_extent_busy_trim(struct xfs_alloc_arg *args, xfs_agblock_t *bno,
  45. xfs_extlen_t *len, unsigned *busy_gen);
  46. void
  47. xfs_extent_busy_flush(struct xfs_mount *mp, struct xfs_perag *pag,
  48. unsigned busy_gen);
  49. void
  50. xfs_extent_busy_wait_all(struct xfs_mount *mp);
  51. int
  52. xfs_extent_busy_ag_cmp(void *priv, const struct list_head *a,
  53. const struct list_head *b);
  54. static inline void xfs_extent_busy_sort(struct list_head *list)
  55. {
  56. list_sort(NULL, list, xfs_extent_busy_ag_cmp);
  57. }
  58. #endif /* __XFS_EXTENT_BUSY_H__ */