xref: /linux/fs/xfs/scrub/quotacheck.h (revision c02ce1735b150cf7c3b43790b48e23dcd17c0d46)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * Copyright (c) 2020-2024 Oracle.  All Rights Reserved.
4  * Author: Darrick J. Wong <djwong@kernel.org>
5  */
6 #ifndef __XFS_SCRUB_QUOTACHECK_H__
7 #define __XFS_SCRUB_QUOTACHECK_H__
8 
9 /* Quota counters for live quotacheck. */
10 struct xqcheck_dquot {
11 	/* block usage count */
12 	int64_t			bcount;
13 
14 	/* inode usage count */
15 	int64_t			icount;
16 
17 	/* realtime block usage count */
18 	int64_t			rtbcount;
19 
20 	/* Record state */
21 	unsigned int		flags;
22 };
23 
24 /*
25  * This incore dquot record has been written at least once.  We never want to
26  * store an xqcheck_dquot that looks uninitialized.
27  */
28 #define XQCHECK_DQUOT_WRITTEN		(1U << 0)
29 
30 /* Already checked this dquot. */
31 #define XQCHECK_DQUOT_COMPARE_SCANNED	(1U << 1)
32 
33 /* Already repaired this dquot. */
34 #define XQCHECK_DQUOT_REPAIR_SCANNED	(1U << 2)
35 
36 /* Live quotacheck control structure. */
37 struct xqcheck {
38 	struct xfs_scrub	*sc;
39 
40 	/* Shadow dquot counter data. */
41 	struct xfarray		*ucounts;
42 	struct xfarray		*gcounts;
43 	struct xfarray		*pcounts;
44 
45 	/* Lock protecting quotacheck count observations */
46 	struct mutex		lock;
47 
48 	struct xchk_iscan	iscan;
49 
50 	/* Hooks into the quota code. */
51 	struct xfs_dqtrx_hook	qhook;
52 
53 	/* Shadow quota delta tracking structure. */
54 	struct rhashtable	shadow_dquot_acct;
55 };
56 
57 /* Return the incore counter array for a given quota type. */
58 static inline struct xfarray *
59 xqcheck_counters_for(
60 	struct xqcheck		*xqc,
61 	xfs_dqtype_t		dqtype)
62 {
63 	switch (dqtype) {
64 	case XFS_DQTYPE_USER:
65 		return xqc->ucounts;
66 	case XFS_DQTYPE_GROUP:
67 		return xqc->gcounts;
68 	case XFS_DQTYPE_PROJ:
69 		return xqc->pcounts;
70 	}
71 
72 	ASSERT(0);
73 	return NULL;
74 }
75 
76 #endif /* __XFS_SCRUB_QUOTACHECK_H__ */
77