1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (C) 2022-2023 Oracle.  All Rights Reserved.
4 * Author: Darrick J. Wong <djwong@kernel.org>
5 */
6#ifndef __XFS_SCRUB_NEWBT_H__
7#define __XFS_SCRUB_NEWBT_H__
8
9struct xfs_alloc_arg;
10
11struct xrep_newbt_resv {
12	/* Link to list of extents that we've reserved. */
13	struct list_head	list;
14
15	struct xfs_perag	*pag;
16
17	/* Auto-freeing this reservation if we don't commit. */
18	struct xfs_alloc_autoreap autoreap;
19
20	/* AG block of the extent we reserved. */
21	xfs_agblock_t		agbno;
22
23	/* Length of the reservation. */
24	xfs_extlen_t		len;
25
26	/* How much of this reservation has been used. */
27	xfs_extlen_t		used;
28};
29
30struct xrep_newbt {
31	struct xfs_scrub	*sc;
32
33	/* Custom allocation function, or NULL for xfs_alloc_vextent */
34	int			(*alloc_vextent)(struct xfs_scrub *sc,
35						 struct xfs_alloc_arg *args,
36						 xfs_fsblock_t alloc_hint);
37
38	/* List of extents that we've reserved. */
39	struct list_head	resv_list;
40
41	/* Fake root for new btree. */
42	union {
43		struct xbtree_afakeroot	afake;
44		struct xbtree_ifakeroot	ifake;
45	};
46
47	/* rmap owner of these blocks */
48	struct xfs_owner_info	oinfo;
49
50	/* btree geometry for the bulk loader */
51	struct xfs_btree_bload	bload;
52
53	/* Allocation hint */
54	xfs_fsblock_t		alloc_hint;
55
56	/* per-ag reservation type */
57	enum xfs_ag_resv_type	resv;
58};
59
60void xrep_newbt_init_bare(struct xrep_newbt *xnr, struct xfs_scrub *sc);
61void xrep_newbt_init_ag(struct xrep_newbt *xnr, struct xfs_scrub *sc,
62		const struct xfs_owner_info *oinfo, xfs_fsblock_t alloc_hint,
63		enum xfs_ag_resv_type resv);
64int xrep_newbt_init_inode(struct xrep_newbt *xnr, struct xfs_scrub *sc,
65		int whichfork, const struct xfs_owner_info *oinfo);
66int xrep_newbt_alloc_blocks(struct xrep_newbt *xnr, uint64_t nr_blocks);
67int xrep_newbt_add_extent(struct xrep_newbt *xnr, struct xfs_perag *pag,
68		xfs_agblock_t agbno, xfs_extlen_t len);
69void xrep_newbt_cancel(struct xrep_newbt *xnr);
70int xrep_newbt_commit(struct xrep_newbt *xnr);
71int xrep_newbt_claim_block(struct xfs_btree_cur *cur, struct xrep_newbt *xnr,
72		union xfs_btree_ptr *ptr);
73unsigned int xrep_newbt_unused_blocks(struct xrep_newbt *xnr);
74
75#endif /* __XFS_SCRUB_NEWBT_H__ */
76