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 11 struct xfs_mount; 12 struct xfs_perag; 13 struct xfs_trans; 14 struct xfs_alloc_arg; 15 16 /* 17 * Busy block/extent entry. Indexed by a rbtree in perag to mark blocks that 18 * have been freed but whose transactions aren't committed to disk yet. 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 31 /* 32 * List used to track groups of related busy extents all the way through 33 * to discard completion. 34 */ 35 struct xfs_busy_extents { 36 struct xfs_mount *mount; 37 struct list_head extent_list; 38 struct work_struct endio_work; 39 40 /* 41 * Owner is the object containing the struct xfs_busy_extents to free 42 * once the busy extents have been processed. If only the 43 * xfs_busy_extents object needs freeing, then point this at itself. 44 */ 45 void *owner; 46 }; 47 48 void 49 xfs_extent_busy_insert(struct xfs_trans *tp, struct xfs_perag *pag, 50 xfs_agblock_t bno, xfs_extlen_t len, unsigned int flags); 51 52 void 53 xfs_extent_busy_insert_discard(struct xfs_perag *pag, xfs_agblock_t bno, 54 xfs_extlen_t len, struct list_head *busy_list); 55 56 void 57 xfs_extent_busy_clear(struct xfs_mount *mp, struct list_head *list, 58 bool do_discard); 59 60 int 61 xfs_extent_busy_search(struct xfs_mount *mp, struct xfs_perag *pag, 62 xfs_agblock_t bno, xfs_extlen_t len); 63 64 void 65 xfs_extent_busy_reuse(struct xfs_mount *mp, struct xfs_perag *pag, 66 xfs_agblock_t fbno, xfs_extlen_t flen, bool userdata); 67 68 bool 69 xfs_extent_busy_trim(struct xfs_alloc_arg *args, xfs_agblock_t *bno, 70 xfs_extlen_t *len, unsigned *busy_gen); 71 72 int 73 xfs_extent_busy_flush(struct xfs_trans *tp, struct xfs_perag *pag, 74 unsigned busy_gen, uint32_t alloc_flags); 75 76 void 77 xfs_extent_busy_wait_all(struct xfs_mount *mp); 78 79 int 80 xfs_extent_busy_ag_cmp(void *priv, const struct list_head *a, 81 const struct list_head *b); 82 83 static inline void xfs_extent_busy_sort(struct list_head *list) 84 { 85 list_sort(NULL, list, xfs_extent_busy_ag_cmp); 86 } 87 88 bool xfs_extent_busy_list_empty(struct xfs_perag *pag); 89 90 #endif /* __XFS_EXTENT_BUSY_H__ */ 91