2018-06-06 05:42:14 +03:00
// SPDX-License-Identifier: GPL-2.0
2012-04-29 14:39:43 +04:00
/*
* Copyright ( c ) 2000 - 2002 , 2005 Silicon Graphics , Inc .
* Copyright ( c ) 2010 David Chinner .
* Copyright ( c ) 2011 Christoph Hellwig .
* All Rights Reserved .
*/
# ifndef __XFS_EXTENT_BUSY_H__
# define __XFS_EXTENT_BUSY_H__
2013-10-23 03:51:50 +04:00
struct xfs_mount ;
struct xfs_trans ;
struct xfs_alloc_arg ;
2012-04-29 14:39:43 +04:00
/*
* Busy block / extent entry . Indexed by a rbtree in perag to mark blocks that
* have been freed but whose transactions aren ' t committed to disk yet .
*
* Note that we use the transaction ID to record the transaction , not the
* transaction structure itself . See xfs_extent_busy_insert ( ) for details .
*/
2012-04-29 14:41:10 +04:00
struct xfs_extent_busy {
2012-04-29 14:39:43 +04:00
struct rb_node rb_node ; /* ag by-bno indexed search tree */
struct list_head list ; /* transaction busy extent list */
xfs_agnumber_t agno ;
xfs_agblock_t bno ;
xfs_extlen_t length ;
unsigned int flags ;
2012-04-29 14:41:10 +04:00
# define XFS_EXTENT_BUSY_DISCARDED 0x01 /* undergoing a discard op. */
# define XFS_EXTENT_BUSY_SKIP_DISCARD 0x02 /* do not discard */
2012-04-29 14:39:43 +04:00
} ;
void
2012-04-29 14:41:10 +04:00
xfs_extent_busy_insert ( struct xfs_trans * tp , xfs_agnumber_t agno ,
2012-04-29 14:39:43 +04:00
xfs_agblock_t bno , xfs_extlen_t len , unsigned int flags ) ;
void
2012-04-29 14:41:10 +04:00
xfs_extent_busy_clear ( struct xfs_mount * mp , struct list_head * list ,
2012-04-29 14:39:43 +04:00
bool do_discard ) ;
int
2012-04-29 14:41:10 +04:00
xfs_extent_busy_search ( struct xfs_mount * mp , xfs_agnumber_t agno ,
2012-04-29 14:39:43 +04:00
xfs_agblock_t bno , xfs_extlen_t len ) ;
void
2012-04-29 14:41:10 +04:00
xfs_extent_busy_reuse ( struct xfs_mount * mp , xfs_agnumber_t agno ,
2012-04-29 14:39:43 +04:00
xfs_agblock_t fbno , xfs_extlen_t flen , bool userdata ) ;
2017-02-08 01:06:57 +03:00
bool
xfs_extent_busy_trim ( struct xfs_alloc_arg * args , xfs_agblock_t * bno ,
xfs_extlen_t * len , unsigned * busy_gen ) ;
void
xfs_extent_busy_flush ( struct xfs_mount * mp , struct xfs_perag * pag ,
unsigned busy_gen ) ;
2012-05-10 22:55:33 +04:00
void
2017-02-08 01:06:57 +03:00
xfs_extent_busy_wait_all ( struct xfs_mount * mp ) ;
2012-05-10 22:55:33 +04:00
2012-04-29 14:39:43 +04:00
int
2012-04-29 14:41:10 +04:00
xfs_extent_busy_ag_cmp ( void * priv , struct list_head * a , struct list_head * b ) ;
2012-04-29 14:39:43 +04:00
2012-04-29 14:41:10 +04:00
static inline void xfs_extent_busy_sort ( struct list_head * list )
2012-04-29 14:39:43 +04:00
{
2012-04-29 14:41:10 +04:00
list_sort ( NULL , list , xfs_extent_busy_ag_cmp ) ;
2012-04-29 14:39:43 +04:00
}
# endif /* __XFS_EXTENT_BUSY_H__ */