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