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 11struct xfs_mount; 12struct xfs_perag; 13struct xfs_trans; 14struct 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 */ 20struct 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 */ 35struct 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 48void 49xfs_extent_busy_insert(struct xfs_trans *tp, struct xfs_perag *pag, 50 xfs_agblock_t bno, xfs_extlen_t len, unsigned int flags); 51 52void 53xfs_extent_busy_insert_discard(struct xfs_perag *pag, xfs_agblock_t bno, 54 xfs_extlen_t len, struct list_head *busy_list); 55 56void 57xfs_extent_busy_clear(struct xfs_mount *mp, struct list_head *list, 58 bool do_discard); 59 60int 61xfs_extent_busy_search(struct xfs_mount *mp, struct xfs_perag *pag, 62 xfs_agblock_t bno, xfs_extlen_t len); 63 64void 65xfs_extent_busy_reuse(struct xfs_mount *mp, struct xfs_perag *pag, 66 xfs_agblock_t fbno, xfs_extlen_t flen, bool userdata); 67 68bool 69xfs_extent_busy_trim(struct xfs_alloc_arg *args, xfs_agblock_t *bno, 70 xfs_extlen_t *len, unsigned *busy_gen); 71 72int 73xfs_extent_busy_flush(struct xfs_trans *tp, struct xfs_perag *pag, 74 unsigned busy_gen, uint32_t alloc_flags); 75 76void 77xfs_extent_busy_wait_all(struct xfs_mount *mp); 78 79int 80xfs_extent_busy_ag_cmp(void *priv, const struct list_head *a, 81 const struct list_head *b); 82 83static inline void xfs_extent_busy_sort(struct list_head *list) 84{ 85 list_sort(NULL, list, xfs_extent_busy_ag_cmp); 86} 87 88bool xfs_extent_busy_list_empty(struct xfs_perag *pag); 89 90#endif /* __XFS_EXTENT_BUSY_H__ */ 91