xref: /openbmc/linux/fs/xfs/scrub/btree.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
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