blob: b295edd5fc0e1ccd448ade23fc32199944be1baf [file] [log] [blame]
Dave Chinner0b61f8a2018-06-05 19:42:14 -07001// SPDX-License-Identifier: GPL-2.0+
Darrick J. Wong36fd6e82017-10-17 21:37:34 -07002/*
3 * Copyright (C) 2017 Oracle. All Rights Reserved.
Darrick J. Wong36fd6e82017-10-17 21:37:34 -07004 * Author: Darrick J. Wong <darrick.wong@oracle.com>
Darrick J. Wong36fd6e82017-10-17 21:37:34 -07005 */
6#ifndef __XFS_SCRUB_SCRUB_H__
7#define __XFS_SCRUB_SCRUB_H__
8
Darrick J. Wonga5637182017-10-17 21:37:35 -07009struct xfs_scrub_context;
10
Eric Sandeen8e630832018-01-08 10:41:34 -080011/* 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
Darrick J. Wonga5637182017-10-17 21:37:35 -070019struct 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
Darrick J. Wong84d42ea2018-05-14 06:34:36 -070027 /* Repair or optimize the metadata. */
28 int (*repair)(struct xfs_scrub_context *);
29
Darrick J. Wonga5637182017-10-17 21:37:35 -070030 /* Decide if we even have this piece of metadata. */
31 bool (*has)(struct xfs_sb *);
Eric Sandeen8e630832018-01-08 10:41:34 -080032
33 /* type describing required/allowed inputs */
34 enum xfs_scrub_type type;
Darrick J. Wonga5637182017-10-17 21:37:35 -070035};
36
Darrick J. Wongb6c1beb2017-10-17 21:37:38 -070037/* Buffer pointers and btree cursors for an entire AG. */
38struct xfs_scrub_ag {
39 xfs_agnumber_t agno;
Darrick J. Wong51863d72018-05-29 22:24:44 -070040 struct xfs_perag *pag;
Darrick J. Wongb6c1beb2017-10-17 21:37:38 -070041
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
Darrick J. Wonga5637182017-10-17 21:37:35 -070056struct 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;
Darrick J. Wongeec04822017-10-17 21:37:45 -070063 void *buf;
Darrick J. Wong80e4e122017-10-17 21:37:42 -070064 uint ilock_flags;
Darrick J. Wonga5637182017-10-17 21:37:35 -070065 bool try_harder;
Darrick J. Wongeb41c932018-05-09 10:02:00 -070066 bool has_quotaofflock;
Darrick J. Wongb6c1beb2017-10-17 21:37:38 -070067
68 /* State tracking for single-AG operations. */
69 struct xfs_scrub_ag sa;
Darrick J. Wonga5637182017-10-17 21:37:35 -070070};
71
Darrick J. Wong36fd6e82017-10-17 21:37:34 -070072/* Metadata scrubbers */
Darrick J. Wongdcb660f2017-10-17 21:37:36 -070073int xfs_scrub_tester(struct xfs_scrub_context *sc);
Darrick J. Wong21fb4cb2017-10-17 21:37:38 -070074int xfs_scrub_superblock(struct xfs_scrub_context *sc);
Darrick J. Wongab9d5dc2017-10-17 21:37:39 -070075int xfs_scrub_agf(struct xfs_scrub_context *sc);
76int xfs_scrub_agfl(struct xfs_scrub_context *sc);
Darrick J. Wonga12890a2017-10-17 21:37:39 -070077int xfs_scrub_agi(struct xfs_scrub_context *sc);
Darrick J. Wongefa7a992017-10-17 21:37:40 -070078int xfs_scrub_bnobt(struct xfs_scrub_context *sc);
79int xfs_scrub_cntbt(struct xfs_scrub_context *sc);
Darrick J. Wong3daa6642017-10-17 21:37:40 -070080int xfs_scrub_inobt(struct xfs_scrub_context *sc);
81int xfs_scrub_finobt(struct xfs_scrub_context *sc);
Darrick J. Wongc7e693d2017-10-17 21:37:41 -070082int xfs_scrub_rmapbt(struct xfs_scrub_context *sc);
Darrick J. Wongedc09b52017-10-17 21:37:41 -070083int xfs_scrub_refcountbt(struct xfs_scrub_context *sc);
Darrick J. Wong80e4e122017-10-17 21:37:42 -070084int xfs_scrub_inode(struct xfs_scrub_context *sc);
Darrick J. Wong99d9d8d2017-10-17 21:37:43 -070085int 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);
Darrick J. Wonga5c46e52017-10-17 21:37:44 -070088int xfs_scrub_directory(struct xfs_scrub_context *sc);
Darrick J. Wongeec04822017-10-17 21:37:45 -070089int xfs_scrub_xattr(struct xfs_scrub_context *sc);
Darrick J. Wong2a721db2017-10-17 21:37:45 -070090int xfs_scrub_symlink(struct xfs_scrub_context *sc);
Darrick J. Wong0f28b252017-10-17 21:37:46 -070091int xfs_scrub_parent(struct xfs_scrub_context *sc);
Darrick J. Wong29b07672017-10-17 21:37:46 -070092#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
Darrick J. Wongc2fc3382017-10-17 21:37:47 -0700107#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
Darrick J. Wong36fd6e82017-10-17 21:37:34 -0700116
Darrick J. Wong52dc4b42018-01-16 18:53:06 -0800117/* cross-referencing helpers */
118void xfs_scrub_xref_is_used_space(struct xfs_scrub_context *sc,
119 xfs_agblock_t agbno, xfs_extlen_t len);
Darrick J. Wong2e6f2752018-01-16 18:53:07 -0800120void 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);
Darrick J. Wongd8526572018-01-16 18:53:08 -0800124void 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);
Darrick J. Wongf6d5fc22018-01-16 18:53:09 -0800132void 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);
Darrick J. Wong46d9bfb2018-01-16 18:53:10 -0800136#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
Darrick J. Wong52dc4b42018-01-16 18:53:06 -0800142
Darrick J. Wong36fd6e82017-10-17 21:37:34 -0700143#endif /* __XFS_SCRUB_SCRUB_H__ */