xfs: convert to SPDX license tags
[linux-2.6-block.git] / fs / xfs / scrub / scrub.h
CommitLineData
0b61f8a4 1// SPDX-License-Identifier: GPL-2.0+
36fd6e86
DW
2/*
3 * Copyright (C) 2017 Oracle. All Rights Reserved.
36fd6e86 4 * Author: Darrick J. Wong <darrick.wong@oracle.com>
36fd6e86
DW
5 */
6#ifndef __XFS_SCRUB_SCRUB_H__
7#define __XFS_SCRUB_SCRUB_H__
8
a5637186
DW
9struct xfs_scrub_context;
10
8e630837
ES
11/* Type info and names for the scrub types. */
12enum xfs_scrub_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
a5637186
DW
19struct xfs_scrub_meta_ops {
20 /* Acquire whatever resources are needed for the operation. */
21 int (*setup)(struct xfs_scrub_context *,
22 struct xfs_inode *);
23
24 /* Examine metadata for errors. */
25 int (*scrub)(struct xfs_scrub_context *);
26
84d42ea6
DW
27 /* Repair or optimize the metadata. */
28 int (*repair)(struct xfs_scrub_context *);
29
a5637186
DW
30 /* Decide if we even have this piece of metadata. */
31 bool (*has)(struct xfs_sb *);
8e630837
ES
32
33 /* type describing required/allowed inputs */
34 enum xfs_scrub_type type;
a5637186
DW
35};
36
b6c1beb9
DW
37/* Buffer pointers and btree cursors for an entire AG. */
38struct xfs_scrub_ag {
39 xfs_agnumber_t agno;
51863d7d 40 struct xfs_perag *pag;
b6c1beb9
DW
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
a5637186
DW
56struct xfs_scrub_context {
57 /* General scrub state. */
58 struct xfs_mount *mp;
59 struct xfs_scrub_metadata *sm;
60 const struct xfs_scrub_meta_ops *ops;
61 struct xfs_trans *tp;
62 struct xfs_inode *ip;
eec0482e 63 void *buf;
80e4e126 64 uint ilock_flags;
a5637186 65 bool try_harder;
eb41c93f 66 bool has_quotaofflock;
b6c1beb9
DW
67
68 /* State tracking for single-AG operations. */
69 struct xfs_scrub_ag sa;
a5637186
DW
70};
71
36fd6e86 72/* Metadata scrubbers */
dcb660f9 73int xfs_scrub_tester(struct xfs_scrub_context *sc);
21fb4cb1 74int xfs_scrub_superblock(struct xfs_scrub_context *sc);
ab9d5dc5
DW
75int xfs_scrub_agf(struct xfs_scrub_context *sc);
76int xfs_scrub_agfl(struct xfs_scrub_context *sc);
a12890ae 77int xfs_scrub_agi(struct xfs_scrub_context *sc);
efa7a99c
DW
78int xfs_scrub_bnobt(struct xfs_scrub_context *sc);
79int xfs_scrub_cntbt(struct xfs_scrub_context *sc);
3daa6641
DW
80int xfs_scrub_inobt(struct xfs_scrub_context *sc);
81int xfs_scrub_finobt(struct xfs_scrub_context *sc);
c7e693d9 82int xfs_scrub_rmapbt(struct xfs_scrub_context *sc);
edc09b52 83int xfs_scrub_refcountbt(struct xfs_scrub_context *sc);
80e4e126 84int xfs_scrub_inode(struct xfs_scrub_context *sc);
99d9d8d0
DW
85int xfs_scrub_bmap_data(struct xfs_scrub_context *sc);
86int xfs_scrub_bmap_attr(struct xfs_scrub_context *sc);
87int xfs_scrub_bmap_cow(struct xfs_scrub_context *sc);
a5c46e5e 88int xfs_scrub_directory(struct xfs_scrub_context *sc);
eec0482e 89int xfs_scrub_xattr(struct xfs_scrub_context *sc);
2a721dbb 90int xfs_scrub_symlink(struct xfs_scrub_context *sc);
0f28b257 91int xfs_scrub_parent(struct xfs_scrub_context *sc);
29b0767b
DW
92#ifdef CONFIG_XFS_RT
93int xfs_scrub_rtbitmap(struct xfs_scrub_context *sc);
94int xfs_scrub_rtsummary(struct xfs_scrub_context *sc);
95#else
96static inline int
97xfs_scrub_rtbitmap(struct xfs_scrub_context *sc)
98{
99 return -ENOENT;
100}
101static inline int
102xfs_scrub_rtsummary(struct xfs_scrub_context *sc)
103{
104 return -ENOENT;
105}
106#endif
c2fc338c
DW
107#ifdef CONFIG_XFS_QUOTA
108int xfs_scrub_quota(struct xfs_scrub_context *sc);
109#else
110static inline int
111xfs_scrub_quota(struct xfs_scrub_context *sc)
112{
113 return -ENOENT;
114}
115#endif
36fd6e86 116
52dc4b44
DW
117/* cross-referencing helpers */
118void xfs_scrub_xref_is_used_space(struct xfs_scrub_context *sc,
119 xfs_agblock_t agbno, xfs_extlen_t len);
2e6f2756
DW
120void xfs_scrub_xref_is_not_inode_chunk(struct xfs_scrub_context *sc,
121 xfs_agblock_t agbno, xfs_extlen_t len);
122void xfs_scrub_xref_is_inode_chunk(struct xfs_scrub_context *sc,
123 xfs_agblock_t agbno, xfs_extlen_t len);
d852657c
DW
124void xfs_scrub_xref_is_owned_by(struct xfs_scrub_context *sc,
125 xfs_agblock_t agbno, xfs_extlen_t len,
126 struct xfs_owner_info *oinfo);
127void xfs_scrub_xref_is_not_owned_by(struct xfs_scrub_context *sc,
128 xfs_agblock_t agbno, xfs_extlen_t len,
129 struct xfs_owner_info *oinfo);
130void xfs_scrub_xref_has_no_owner(struct xfs_scrub_context *sc,
131 xfs_agblock_t agbno, xfs_extlen_t len);
f6d5fc21
DW
132void xfs_scrub_xref_is_cow_staging(struct xfs_scrub_context *sc,
133 xfs_agblock_t bno, xfs_extlen_t len);
134void xfs_scrub_xref_is_not_shared(struct xfs_scrub_context *sc,
135 xfs_agblock_t bno, xfs_extlen_t len);
46d9bfb5
DW
136#ifdef CONFIG_XFS_RT
137void xfs_scrub_xref_is_used_rt_space(struct xfs_scrub_context *sc,
138 xfs_rtblock_t rtbno, xfs_extlen_t len);
139#else
140# define xfs_scrub_xref_is_used_rt_space(sc, rtbno, len) do { } while (0)
141#endif
52dc4b44 142
36fd6e86 143#endif /* __XFS_SCRUB_SCRUB_H__ */