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_group; 12 struct xfs_mount; 13 struct xfs_trans; 14 15 /* 16 * Busy block/extent entry. Indexed by a rbtree in the group to mark blocks 17 * that have been freed but whose transactions aren't committed to disk yet. 18 */ 19 struct xfs_extent_busy { 20 struct rb_node rb_node; /* group by-bno indexed search tree */ 21 struct list_head list; /* transaction busy extent list */ 22 struct xfs_group *group; 23 xfs_agblock_t bno; 24 xfs_extlen_t length; 25 unsigned int flags; 26 #define XFS_EXTENT_BUSY_DISCARDED 0x01 /* undergoing a discard op. */ 27 #define XFS_EXTENT_BUSY_SKIP_DISCARD 0x02 /* do not discard */ 28 }; 29 30 /* 31 * List used to track groups of related busy extents all the way through 32 * to discard completion. 33 */ 34 struct xfs_busy_extents { 35 struct list_head extent_list; 36 struct work_struct endio_work; 37 38 /* 39 * Owner is the object containing the struct xfs_busy_extents to free 40 * once the busy extents have been processed. If only the 41 * xfs_busy_extents object needs freeing, then point this at itself. 42 */ 43 void *owner; 44 }; 45 46 void xfs_extent_busy_insert(struct xfs_trans *tp, struct xfs_group *xg, 47 xfs_agblock_t bno, xfs_extlen_t len, unsigned int flags); 48 void xfs_extent_busy_insert_discard(struct xfs_group *xg, xfs_agblock_t bno, 49 xfs_extlen_t len, struct list_head *busy_list); 50 void xfs_extent_busy_clear(struct list_head *list, bool do_discard); 51 int xfs_extent_busy_search(struct xfs_group *xg, xfs_agblock_t bno, 52 xfs_extlen_t len); 53 void xfs_extent_busy_reuse(struct xfs_group *xg, xfs_agblock_t fbno, 54 xfs_extlen_t flen, bool userdata); 55 bool xfs_extent_busy_trim(struct xfs_group *xg, xfs_extlen_t minlen, 56 xfs_extlen_t maxlen, xfs_agblock_t *bno, xfs_extlen_t *len, 57 unsigned *busy_gen); 58 int xfs_extent_busy_flush(struct xfs_trans *tp, struct xfs_group *xg, 59 unsigned busy_gen, uint32_t alloc_flags); 60 void xfs_extent_busy_wait_all(struct xfs_mount *mp); 61 bool xfs_extent_busy_list_empty(struct xfs_group *xg, unsigned int *busy_gen); 62 struct xfs_extent_busy_tree *xfs_extent_busy_alloc(void); 63 64 int xfs_extent_busy_ag_cmp(void *priv, const struct list_head *a, 65 const struct list_head *b); 66 static inline void xfs_extent_busy_sort(struct list_head *list) 67 { 68 list_sort(NULL, list, xfs_extent_busy_ag_cmp); 69 } 70 71 #endif /* __XFS_EXTENT_BUSY_H__ */ 72