/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * Copyright (c) 2020-2024 Oracle. All Rights Reserved. * Author: Darrick J. Wong <djwong@kernel.org> */ #ifndef __XFS_SCRUB_QUOTACHECK_H__ #define __XFS_SCRUB_QUOTACHECK_H__ /* Quota counters for live quotacheck. */ struct xqcheck_dquot { /* block usage count */ int64_t bcount; /* inode usage count */ int64_t icount; /* realtime block usage count */ int64_t rtbcount; /* Record state */ unsigned int flags; }; /* * This incore dquot record has been written at least once. We never want to * store an xqcheck_dquot that looks uninitialized. */ #define XQCHECK_DQUOT_WRITTEN (1U << 0) /* Already checked this dquot. */ #define XQCHECK_DQUOT_COMPARE_SCANNED (1U << 1) /* Already repaired this dquot. */ #define XQCHECK_DQUOT_REPAIR_SCANNED (1U << 2) /* Live quotacheck control structure. */ struct xqcheck { struct xfs_scrub *sc; /* Shadow dquot counter data. */ struct xfarray *ucounts; struct xfarray *gcounts; struct xfarray *pcounts; /* Lock protecting quotacheck count observations */ struct mutex lock; struct xchk_iscan iscan; /* Hooks into the quota code. */ struct xfs_dqtrx_hook qhook; /* Shadow quota delta tracking structure. */ struct rhashtable shadow_dquot_acct; }; /* Return the incore counter array for a given quota type. */ static inline struct xfarray * xqcheck_counters_for( struct xqcheck *xqc, xfs_dqtype_t dqtype) { switch (dqtype) { case XFS_DQTYPE_USER: return xqc->ucounts; case XFS_DQTYPE_GROUP: return xqc->gcounts; case XFS_DQTYPE_PROJ: return xqc->pcounts; } ASSERT(0); return NULL; } #endif /* __XFS_SCRUB_QUOTACHECK_H__ */