1739a2fe0SDarrick J. Wong // SPDX-License-Identifier: GPL-2.0-or-later
2537964bcSDarrick J. Wong /*
3ecc73f8aSDarrick J. Wong * Copyright (C) 2017-2023 Oracle. All Rights Reserved.
4739a2fe0SDarrick J. Wong * Author: Darrick J. Wong <djwong@kernel.org>
5537964bcSDarrick J. Wong */
6537964bcSDarrick J. Wong #ifndef __XFS_SCRUB_BTREE_H__
7537964bcSDarrick J. Wong #define __XFS_SCRUB_BTREE_H__
8537964bcSDarrick J. Wong
9537964bcSDarrick J. Wong /* btree scrub */
10537964bcSDarrick J. Wong
11537964bcSDarrick J. Wong /* Check for btree operation errors. */
121d8a748aSDarrick J. Wong bool xchk_btree_process_error(struct xfs_scrub *sc,
13537964bcSDarrick J. Wong struct xfs_btree_cur *cur, int level, int *error);
14537964bcSDarrick J. Wong
1564b12563SDarrick J. Wong /* Check for btree xref operation errors. */
161d8a748aSDarrick J. Wong bool xchk_btree_xref_process_error(struct xfs_scrub *sc,
17032d91f9SDarrick J. Wong struct xfs_btree_cur *cur, int level, int *error);
1864b12563SDarrick J. Wong
19537964bcSDarrick J. Wong /* Check for btree corruption. */
201d8a748aSDarrick J. Wong void xchk_btree_set_corrupt(struct xfs_scrub *sc,
21537964bcSDarrick J. Wong struct xfs_btree_cur *cur, int level);
2238384569SDarrick J. Wong void xchk_btree_set_preen(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
2338384569SDarrick J. Wong int level);
24537964bcSDarrick J. Wong
2564b12563SDarrick J. Wong /* Check for btree xref discrepancies. */
261d8a748aSDarrick J. Wong void xchk_btree_xref_set_corrupt(struct xfs_scrub *sc,
2764b12563SDarrick J. Wong struct xfs_btree_cur *cur, int level);
2864b12563SDarrick J. Wong
29c517b3aaSDarrick J. Wong struct xchk_btree;
30c517b3aaSDarrick J. Wong typedef int (*xchk_btree_rec_fn)(
31c517b3aaSDarrick J. Wong struct xchk_btree *bs,
3222ece4e8SDarrick J. Wong const union xfs_btree_rec *rec);
33537964bcSDarrick J. Wong
34*2bea8df0SDarrick J. Wong struct xchk_btree_key {
35*2bea8df0SDarrick J. Wong union xfs_btree_key key;
36*2bea8df0SDarrick J. Wong bool valid;
37*2bea8df0SDarrick J. Wong };
38*2bea8df0SDarrick J. Wong
39c517b3aaSDarrick J. Wong struct xchk_btree {
40537964bcSDarrick J. Wong /* caller-provided scrub state */
411d8a748aSDarrick J. Wong struct xfs_scrub *sc;
42537964bcSDarrick J. Wong struct xfs_btree_cur *cur;
43c517b3aaSDarrick J. Wong xchk_btree_rec_fn scrub_rec;
4466e3237eSDarrick J. Wong const struct xfs_owner_info *oinfo;
45537964bcSDarrick J. Wong void *private;
46537964bcSDarrick J. Wong
47537964bcSDarrick J. Wong /* internal scrub state */
48*2bea8df0SDarrick J. Wong bool lastrec_valid;
49537964bcSDarrick J. Wong union xfs_btree_rec lastrec;
50537964bcSDarrick J. Wong struct list_head to_check;
51eae5db47SDarrick J. Wong
52eae5db47SDarrick J. Wong /* this element must come last! */
53*2bea8df0SDarrick J. Wong struct xchk_btree_key lastkey[];
54537964bcSDarrick J. Wong };
55eae5db47SDarrick J. Wong
56eae5db47SDarrick J. Wong /*
57eae5db47SDarrick J. Wong * Calculate the size of a xchk_btree structure. There are nlevels-1 slots for
58eae5db47SDarrick J. Wong * keys because we track leaf records separately in lastrec.
59eae5db47SDarrick J. Wong */
60eae5db47SDarrick J. Wong static inline size_t
xchk_btree_sizeof(unsigned int nlevels)61eae5db47SDarrick J. Wong xchk_btree_sizeof(unsigned int nlevels)
62eae5db47SDarrick J. Wong {
63eae5db47SDarrick J. Wong return struct_size_t(struct xchk_btree, lastkey, nlevels - 1);
64eae5db47SDarrick J. Wong }
65eae5db47SDarrick J. Wong
661d8a748aSDarrick J. Wong int xchk_btree(struct xfs_scrub *sc, struct xfs_btree_cur *cur,
6766e3237eSDarrick J. Wong xchk_btree_rec_fn scrub_fn, const struct xfs_owner_info *oinfo,
68032d91f9SDarrick J. Wong void *private);
69537964bcSDarrick J. Wong
70537964bcSDarrick J. Wong #endif /* __XFS_SCRUB_BTREE_H__ */
71