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, head: list, cmp: 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 | |