root/fs/xfs/scrub/newbt.h
// 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_init_metadir_inode(struct xrep_newbt *xnr, struct xfs_scrub *sc);
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__ */