76 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| // SPDX-License-Identifier: GPL-2.0-or-later
 | |
| /*
 | |
|  * Copyright (C) 2022-2023 Oracle.  All Rights Reserved.
 | |
|  * Author: Darrick J. Wong <djwong@kernel.org>
 | |
|  */
 | |
| #ifndef __XFS_SCRUB_NEWBT_H__
 | |
| #define __XFS_SCRUB_NEWBT_H__
 | |
| 
 | |
| struct xfs_alloc_arg;
 | |
| 
 | |
| struct xrep_newbt_resv {
 | |
| 	/* Link to list of extents that we've reserved. */
 | |
| 	struct list_head	list;
 | |
| 
 | |
| 	struct xfs_perag	*pag;
 | |
| 
 | |
| 	/* Auto-freeing this reservation if we don't commit. */
 | |
| 	struct xfs_alloc_autoreap autoreap;
 | |
| 
 | |
| 	/* AG block of the extent we reserved. */
 | |
| 	xfs_agblock_t		agbno;
 | |
| 
 | |
| 	/* Length of the reservation. */
 | |
| 	xfs_extlen_t		len;
 | |
| 
 | |
| 	/* How much of this reservation has been used. */
 | |
| 	xfs_extlen_t		used;
 | |
| };
 | |
| 
 | |
| struct xrep_newbt {
 | |
| 	struct xfs_scrub	*sc;
 | |
| 
 | |
| 	/* Custom allocation function, or NULL for xfs_alloc_vextent */
 | |
| 	int			(*alloc_vextent)(struct xfs_scrub *sc,
 | |
| 						 struct xfs_alloc_arg *args,
 | |
| 						 xfs_fsblock_t alloc_hint);
 | |
| 
 | |
| 	/* List of extents that we've reserved. */
 | |
| 	struct list_head	resv_list;
 | |
| 
 | |
| 	/* Fake root for new btree. */
 | |
| 	union {
 | |
| 		struct xbtree_afakeroot	afake;
 | |
| 		struct xbtree_ifakeroot	ifake;
 | |
| 	};
 | |
| 
 | |
| 	/* rmap owner of these blocks */
 | |
| 	struct xfs_owner_info	oinfo;
 | |
| 
 | |
| 	/* btree geometry for the bulk loader */
 | |
| 	struct xfs_btree_bload	bload;
 | |
| 
 | |
| 	/* Allocation hint */
 | |
| 	xfs_fsblock_t		alloc_hint;
 | |
| 
 | |
| 	/* per-ag reservation type */
 | |
| 	enum xfs_ag_resv_type	resv;
 | |
| };
 | |
| 
 | |
| void xrep_newbt_init_bare(struct xrep_newbt *xnr, struct xfs_scrub *sc);
 | |
| void xrep_newbt_init_ag(struct xrep_newbt *xnr, struct xfs_scrub *sc,
 | |
| 		const struct xfs_owner_info *oinfo, xfs_fsblock_t alloc_hint,
 | |
| 		enum xfs_ag_resv_type resv);
 | |
| int xrep_newbt_init_inode(struct xrep_newbt *xnr, struct xfs_scrub *sc,
 | |
| 		int whichfork, const struct xfs_owner_info *oinfo);
 | |
| int xrep_newbt_alloc_blocks(struct xrep_newbt *xnr, uint64_t nr_blocks);
 | |
| int xrep_newbt_add_extent(struct xrep_newbt *xnr, struct xfs_perag *pag,
 | |
| 		xfs_agblock_t agbno, xfs_extlen_t len);
 | |
| void xrep_newbt_cancel(struct xrep_newbt *xnr);
 | |
| int xrep_newbt_commit(struct xrep_newbt *xnr);
 | |
| int xrep_newbt_claim_block(struct xfs_btree_cur *cur, struct xrep_newbt *xnr,
 | |
| 		union xfs_btree_ptr *ptr);
 | |
| unsigned int xrep_newbt_unused_blocks(struct xrep_newbt *xnr);
 | |
| 
 | |
| #endif /* __XFS_SCRUB_NEWBT_H__ */
 |