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. */
10struct 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. */
37struct 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. */
58static inline struct xfarray *
59xqcheck_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