| // 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__ */ |