^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (c) 2000-2005 Silicon Graphics, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #ifndef __XFS_QM_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define __XFS_QM_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include "xfs_dquot_item.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include "xfs_dquot.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) struct xfs_inode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) extern struct kmem_zone *xfs_qm_dqtrxzone;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * Number of bmaps that we ask from bmapi when doing a quotacheck.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * We make this restriction to keep the memory usage to a minimum.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define XFS_DQITER_MAP_SIZE 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define XFS_IS_DQUOT_UNINITIALIZED(dqp) ( \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) !dqp->q_blk.hardlimit && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) !dqp->q_blk.softlimit && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) !dqp->q_rtb.hardlimit && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) !dqp->q_rtb.softlimit && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) !dqp->q_ino.hardlimit && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) !dqp->q_ino.softlimit && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) !dqp->q_blk.count && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) !dqp->q_rtb.count && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) !dqp->q_ino.count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) struct xfs_quota_limits {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) xfs_qcnt_t hard; /* default hard limit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) xfs_qcnt_t soft; /* default soft limit */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) time64_t time; /* limit for timers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) xfs_qwarncnt_t warn; /* limit for warnings */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) /* Defaults for each quota type: time limits, warn limits, usage limits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) struct xfs_def_quota {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) struct xfs_quota_limits blk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) struct xfs_quota_limits ino;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) struct xfs_quota_limits rtb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * Various quota information for individual filesystems.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * The mount structure keeps a pointer to this.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) struct xfs_quotainfo {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) struct radix_tree_root qi_uquota_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) struct radix_tree_root qi_gquota_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) struct radix_tree_root qi_pquota_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) struct mutex qi_tree_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct xfs_inode *qi_uquotaip; /* user quota inode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct xfs_inode *qi_gquotaip; /* group quota inode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct xfs_inode *qi_pquotaip; /* project quota inode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct list_lru qi_lru;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) int qi_dquots;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) struct mutex qi_quotaofflock;/* to serialize quotaoff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) xfs_filblks_t qi_dqchunklen; /* # BBs in a chunk of dqs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) uint qi_dqperchunk; /* # ondisk dq in above chunk */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct xfs_def_quota qi_usr_default;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) struct xfs_def_quota qi_grp_default;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) struct xfs_def_quota qi_prj_default;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) struct shrinker qi_shrinker;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) /* Minimum and maximum quota expiration timestamp values. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) time64_t qi_expiry_min;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) time64_t qi_expiry_max;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) static inline struct radix_tree_root *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) xfs_dquot_tree(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) struct xfs_quotainfo *qi,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) xfs_dqtype_t type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) case XFS_DQTYPE_USER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) return &qi->qi_uquota_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) case XFS_DQTYPE_GROUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) return &qi->qi_gquota_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) case XFS_DQTYPE_PROJ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) return &qi->qi_pquota_tree;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) ASSERT(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) static inline struct xfs_inode *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) xfs_quota_inode(struct xfs_mount *mp, xfs_dqtype_t type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) case XFS_DQTYPE_USER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) return mp->m_quotainfo->qi_uquotaip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) case XFS_DQTYPE_GROUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) return mp->m_quotainfo->qi_gquotaip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) case XFS_DQTYPE_PROJ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) return mp->m_quotainfo->qi_pquotaip;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) ASSERT(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) extern void xfs_trans_mod_dquot(struct xfs_trans *tp, struct xfs_dquot *dqp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) uint field, int64_t delta);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) extern void xfs_trans_dqjoin(struct xfs_trans *, struct xfs_dquot *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) extern void xfs_trans_log_dquot(struct xfs_trans *, struct xfs_dquot *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) * We keep the usr, grp, and prj dquots separately so that locking will be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) * easier to do at commit time. All transactions that we know of at this point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) * affect no more than two dquots of one type. Hence, the TRANS_MAXDQS value.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) enum {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) XFS_QM_TRANS_USR = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) XFS_QM_TRANS_GRP,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) XFS_QM_TRANS_PRJ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) XFS_QM_TRANS_DQTYPES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define XFS_QM_TRANS_MAXDQS 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) struct xfs_dquot_acct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) struct xfs_dqtrx dqs[XFS_QM_TRANS_DQTYPES][XFS_QM_TRANS_MAXDQS];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) * Users are allowed to have a usage exceeding their softlimit for
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) * a period this long.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define XFS_QM_BTIMELIMIT (7 * 24*60*60) /* 1 week */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define XFS_QM_RTBTIMELIMIT (7 * 24*60*60) /* 1 week */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define XFS_QM_ITIMELIMIT (7 * 24*60*60) /* 1 week */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define XFS_QM_BWARNLIMIT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define XFS_QM_IWARNLIMIT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define XFS_QM_RTBWARNLIMIT 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) extern void xfs_qm_destroy_quotainfo(struct xfs_mount *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) /* dquot stuff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) extern void xfs_qm_dqpurge_all(struct xfs_mount *, uint);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) extern void xfs_qm_dqrele_all_inodes(struct xfs_mount *, uint);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) /* quota ops */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) extern int xfs_qm_scall_trunc_qfiles(struct xfs_mount *, uint);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) extern int xfs_qm_scall_getquota(struct xfs_mount *mp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) xfs_dqid_t id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) xfs_dqtype_t type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) struct qc_dqblk *dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) extern int xfs_qm_scall_getquota_next(struct xfs_mount *mp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) xfs_dqid_t *id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) xfs_dqtype_t type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) struct qc_dqblk *dst);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) extern int xfs_qm_scall_setqlim(struct xfs_mount *mp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) xfs_dqid_t id,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) xfs_dqtype_t type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) struct qc_dqblk *newlim);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) extern int xfs_qm_scall_quotaon(struct xfs_mount *, uint);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) extern int xfs_qm_scall_quotaoff(struct xfs_mount *, uint);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) static inline struct xfs_def_quota *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) xfs_get_defquota(struct xfs_quotainfo *qi, xfs_dqtype_t type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) switch (type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) case XFS_DQTYPE_USER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) return &qi->qi_usr_default;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) case XFS_DQTYPE_GROUP:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) return &qi->qi_grp_default;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) case XFS_DQTYPE_PROJ:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) return &qi->qi_prj_default;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) ASSERT(0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #endif /* __XFS_QM_H__ */