xref: /kernel/linux/linux-5.10/fs/xfs/scrub/scrub.h (revision 8c2ecf20)
1// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Copyright (C) 2017 Oracle.  All Rights Reserved.
4 * Author: Darrick J. Wong <darrick.wong@oracle.com>
5 */
6#ifndef __XFS_SCRUB_SCRUB_H__
7#define __XFS_SCRUB_SCRUB_H__
8
9struct xfs_scrub;
10
11/* Type info and names for the scrub types. */
12enum xchk_type {
13	ST_NONE = 1,	/* disabled */
14	ST_PERAG,	/* per-AG metadata */
15	ST_FS,		/* per-FS metadata */
16	ST_INODE,	/* per-inode metadata */
17};
18
19struct xchk_meta_ops {
20	/* Acquire whatever resources are needed for the operation. */
21	int		(*setup)(struct xfs_scrub *,
22				 struct xfs_inode *);
23
24	/* Examine metadata for errors. */
25	int		(*scrub)(struct xfs_scrub *);
26
27	/* Repair or optimize the metadata. */
28	int		(*repair)(struct xfs_scrub *);
29
30	/* Decide if we even have this piece of metadata. */
31	bool		(*has)(struct xfs_sb *);
32
33	/* type describing required/allowed inputs */
34	enum xchk_type	type;
35};
36
37/* Buffer pointers and btree cursors for an entire AG. */
38struct xchk_ag {
39	xfs_agnumber_t		agno;
40	struct xfs_perag	*pag;
41
42	/* AG btree roots */
43	struct xfs_buf		*agf_bp;
44	struct xfs_buf		*agfl_bp;
45	struct xfs_buf		*agi_bp;
46
47	/* AG btrees */
48	struct xfs_btree_cur	*bno_cur;
49	struct xfs_btree_cur	*cnt_cur;
50	struct xfs_btree_cur	*ino_cur;
51	struct xfs_btree_cur	*fino_cur;
52	struct xfs_btree_cur	*rmap_cur;
53	struct xfs_btree_cur	*refc_cur;
54};
55
56struct xfs_scrub {
57	/* General scrub state. */
58	struct xfs_mount		*mp;
59	struct xfs_scrub_metadata	*sm;
60	const struct xchk_meta_ops	*ops;
61	struct xfs_trans		*tp;
62	struct xfs_inode		*ip;
63	void				*buf;
64	uint				ilock_flags;
65
66	/* See the XCHK/XREP state flags below. */
67	unsigned int			flags;
68
69	/*
70	 * The XFS_SICK_* flags that correspond to the metadata being scrubbed
71	 * or repaired.  We will use this mask to update the in-core fs health
72	 * status with whatever we find.
73	 */
74	unsigned int			sick_mask;
75
76	/* State tracking for single-AG operations. */
77	struct xchk_ag			sa;
78};
79
80/* XCHK state flags grow up from zero, XREP state flags grown down from 2^31 */
81#define XCHK_TRY_HARDER		(1 << 0)  /* can't get resources, try again */
82#define XCHK_HAS_QUOTAOFFLOCK	(1 << 1)  /* we hold the quotaoff lock */
83#define XCHK_REAPING_DISABLED	(1 << 2)  /* background block reaping paused */
84#define XREP_ALREADY_FIXED	(1 << 31) /* checking our repair work */
85
86/* Metadata scrubbers */
87int xchk_tester(struct xfs_scrub *sc);
88int xchk_superblock(struct xfs_scrub *sc);
89int xchk_agf(struct xfs_scrub *sc);
90int xchk_agfl(struct xfs_scrub *sc);
91int xchk_agi(struct xfs_scrub *sc);
92int xchk_bnobt(struct xfs_scrub *sc);
93int xchk_cntbt(struct xfs_scrub *sc);
94int xchk_inobt(struct xfs_scrub *sc);
95int xchk_finobt(struct xfs_scrub *sc);
96int xchk_rmapbt(struct xfs_scrub *sc);
97int xchk_refcountbt(struct xfs_scrub *sc);
98int xchk_inode(struct xfs_scrub *sc);
99int xchk_bmap_data(struct xfs_scrub *sc);
100int xchk_bmap_attr(struct xfs_scrub *sc);
101int xchk_bmap_cow(struct xfs_scrub *sc);
102int xchk_directory(struct xfs_scrub *sc);
103int xchk_xattr(struct xfs_scrub *sc);
104int xchk_symlink(struct xfs_scrub *sc);
105int xchk_parent(struct xfs_scrub *sc);
106#ifdef CONFIG_XFS_RT
107int xchk_rtbitmap(struct xfs_scrub *sc);
108int xchk_rtsummary(struct xfs_scrub *sc);
109#else
110static inline int
111xchk_rtbitmap(struct xfs_scrub *sc)
112{
113	return -ENOENT;
114}
115static inline int
116xchk_rtsummary(struct xfs_scrub *sc)
117{
118	return -ENOENT;
119}
120#endif
121#ifdef CONFIG_XFS_QUOTA
122int xchk_quota(struct xfs_scrub *sc);
123#else
124static inline int
125xchk_quota(struct xfs_scrub *sc)
126{
127	return -ENOENT;
128}
129#endif
130int xchk_fscounters(struct xfs_scrub *sc);
131
132/* cross-referencing helpers */
133void xchk_xref_is_used_space(struct xfs_scrub *sc, xfs_agblock_t agbno,
134		xfs_extlen_t len);
135void xchk_xref_is_not_inode_chunk(struct xfs_scrub *sc, xfs_agblock_t agbno,
136		xfs_extlen_t len);
137void xchk_xref_is_inode_chunk(struct xfs_scrub *sc, xfs_agblock_t agbno,
138		xfs_extlen_t len);
139void xchk_xref_is_owned_by(struct xfs_scrub *sc, xfs_agblock_t agbno,
140		xfs_extlen_t len, const struct xfs_owner_info *oinfo);
141void xchk_xref_is_not_owned_by(struct xfs_scrub *sc, xfs_agblock_t agbno,
142		xfs_extlen_t len, const struct xfs_owner_info *oinfo);
143void xchk_xref_has_no_owner(struct xfs_scrub *sc, xfs_agblock_t agbno,
144		xfs_extlen_t len);
145void xchk_xref_is_cow_staging(struct xfs_scrub *sc, xfs_agblock_t bno,
146		xfs_extlen_t len);
147void xchk_xref_is_not_shared(struct xfs_scrub *sc, xfs_agblock_t bno,
148		xfs_extlen_t len);
149#ifdef CONFIG_XFS_RT
150void xchk_xref_is_used_rt_space(struct xfs_scrub *sc, xfs_rtblock_t rtbno,
151		xfs_extlen_t len);
152#else
153# define xchk_xref_is_used_rt_space(sc, rtbno, len) do { } while (0)
154#endif
155
156struct xchk_fscounters {
157	uint64_t		icount;
158	uint64_t		ifree;
159	uint64_t		fdblocks;
160	unsigned long long	icount_min;
161	unsigned long long	icount_max;
162};
163
164#endif	/* __XFS_SCRUB_SCRUB_H__ */
165