2018-06-05 19:42:14 -07:00
// SPDX-License-Identifier: GPL-2.0+
2016-10-03 09:11:19 -07:00
/*
* Copyright ( C ) 2016 Oracle . All Rights Reserved .
* Author : Darrick J . Wong < darrick . wong @ oracle . com >
*/
# ifndef __XFS_REFCOUNT_H__
# define __XFS_REFCOUNT_H__
2021-06-02 10:48:24 +10:00
struct xfs_trans ;
struct xfs_mount ;
struct xfs_perag ;
struct xfs_btree_cur ;
struct xfs_bmbt_irec ;
struct xfs_refcount_irec ;
2016-10-03 09:11:19 -07:00
extern int xfs_refcount_lookup_le ( struct xfs_btree_cur * cur ,
xfs_agblock_t bno , int * stat ) ;
extern int xfs_refcount_lookup_ge ( struct xfs_btree_cur * cur ,
xfs_agblock_t bno , int * stat ) ;
2018-05-09 10:02:03 -07:00
extern int xfs_refcount_lookup_eq ( struct xfs_btree_cur * cur ,
xfs_agblock_t bno , int * stat ) ;
2016-10-03 09:11:19 -07:00
extern int xfs_refcount_get_rec ( struct xfs_btree_cur * cur ,
struct xfs_refcount_irec * irec , int * stat ) ;
2016-10-03 09:11:21 -07:00
enum xfs_refcount_intent_type {
XFS_REFCOUNT_INCREASE = 1 ,
XFS_REFCOUNT_DECREASE ,
XFS_REFCOUNT_ALLOC_COW ,
XFS_REFCOUNT_FREE_COW ,
} ;
struct xfs_refcount_intent {
struct list_head ri_list ;
enum xfs_refcount_intent_type ri_type ;
xfs_extlen_t ri_blockcount ;
2021-10-12 15:29:33 -07:00
xfs_fsblock_t ri_startblock ;
2016-10-03 09:11:21 -07:00
} ;
2019-08-26 17:06:04 -07:00
void xfs_refcount_increase_extent ( struct xfs_trans * tp ,
2018-08-01 07:20:34 -07:00
struct xfs_bmbt_irec * irec ) ;
2019-08-26 17:06:04 -07:00
void xfs_refcount_decrease_extent ( struct xfs_trans * tp ,
2018-08-01 07:20:34 -07:00
struct xfs_bmbt_irec * irec ) ;
2016-10-03 09:11:22 -07:00
extern void xfs_refcount_finish_one_cleanup ( struct xfs_trans * tp ,
struct xfs_btree_cur * rcur , int error ) ;
extern int xfs_refcount_finish_one ( struct xfs_trans * tp ,
2018-08-01 07:20:32 -07:00
enum xfs_refcount_intent_type type , xfs_fsblock_t startblock ,
xfs_extlen_t blockcount , xfs_fsblock_t * new_fsb ,
xfs_extlen_t * new_len , struct xfs_btree_cur * * pcur ) ;
2016-10-03 09:11:22 -07:00
2016-10-03 09:11:25 -07:00
extern int xfs_refcount_find_shared ( struct xfs_btree_cur * cur ,
xfs_agblock_t agbno , xfs_extlen_t aglen , xfs_agblock_t * fbno ,
xfs_extlen_t * flen , bool find_end_of_shared ) ;
2019-08-26 17:06:04 -07:00
void xfs_refcount_alloc_cow_extent ( struct xfs_trans * tp , xfs_fsblock_t fsb ,
xfs_extlen_t len ) ;
void xfs_refcount_free_cow_extent ( struct xfs_trans * tp , xfs_fsblock_t fsb ,
xfs_extlen_t len ) ;
2016-10-03 09:11:39 -07:00
extern int xfs_refcount_recover_cow_leftovers ( struct xfs_mount * mp ,
2021-06-02 10:48:24 +10:00
struct xfs_perag * pag ) ;
2016-10-03 09:11:39 -07:00
2017-06-14 21:25:57 -07:00
/*
* While we ' re adjusting the refcounts records of an extent , we have
* to keep an eye on the number of extents we ' re dirtying - - run too
* many in a single transaction and we ' ll exceed the transaction ' s
* reservation and crash the fs . Each record adds 12 bytes to the
* log ( plus any key updates ) so we ' ll conservatively assume 32 bytes
* per record . We must also leave space for btree splits on both ends
* of the range and space for the CUD and a new CUI .
2022-04-26 15:29:54 -07:00
*
* Each EFI that we attach to the transaction is assumed to consume ~ 32 bytes .
* This is a low estimate for an EFI tracking a single extent ( 16 bytes for the
* EFI header , 16 for the extent , and 12 for the xlog op header ) , but the
* estimate is acceptable if there ' s more than one extent being freed .
* In the worst case of freeing every other block during a refcount decrease
* operation , we amortize the space used for one EFI log item across 16
* extents .
2017-06-14 21:25:57 -07:00
*/
# define XFS_REFCOUNT_ITEM_OVERHEAD 32
2018-01-16 18:52:14 -08:00
extern int xfs_refcount_has_record ( struct xfs_btree_cur * cur ,
xfs_agblock_t bno , xfs_extlen_t len , bool * exists ) ;
2018-05-09 10:02:02 -07:00
union xfs_btree_rec ;
2021-08-10 17:02:16 -07:00
extern void xfs_refcount_btrec_to_irec ( const union xfs_btree_rec * rec ,
2018-05-09 10:02:02 -07:00
struct xfs_refcount_irec * irec ) ;
extern int xfs_refcount_insert ( struct xfs_btree_cur * cur ,
struct xfs_refcount_irec * irec , int * stat ) ;
2018-01-16 18:52:14 -08:00
2021-10-12 14:11:01 -07:00
extern struct kmem_cache * xfs_refcount_intent_cache ;
int __init xfs_refcount_intent_init_cache ( void ) ;
void xfs_refcount_intent_destroy_cache ( void ) ;
2016-10-03 09:11:19 -07:00
# endif /* __XFS_REFCOUNT_H__ */