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 * xqcheck_counters_for(struct xqcheck * xqc,xfs_dqtype_t dqtype)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