2018-06-06 05:42:14 +03:00
// SPDX-License-Identifier: GPL-2.0
2005-04-17 02:20:36 +04:00
/*
2005-11-02 06:59:41 +03:00
* Copyright ( c ) 2000 - 2005 Silicon Graphics , Inc .
* All Rights Reserved .
2005-04-17 02:20:36 +04:00
*/
# ifndef __XFS_QM_H__
# define __XFS_QM_H__
# include "xfs_dquot_item.h"
# include "xfs_dquot.h"
struct xfs_inode ;
2012-03-13 12:52:37 +04:00
extern struct kmem_zone * xfs_qm_dqtrxzone ;
2005-04-17 02:20:36 +04:00
2013-11-22 20:15:43 +04:00
/*
* Number of bmaps that we ask from bmapi when doing a quotacheck .
* We make this restriction to keep the memory usage to a minimum .
*/
# define XFS_DQITER_MAP_SIZE 10
# define XFS_IS_DQUOT_UNINITIALIZED(dqp) ( \
2020-07-14 20:37:31 +03:00
! dqp - > q_blk . hardlimit & & \
! dqp - > q_blk . softlimit & & \
! dqp - > q_rtb . hardlimit & & \
! dqp - > q_rtb . softlimit & & \
! dqp - > q_ino . hardlimit & & \
! dqp - > q_ino . softlimit & & \
2020-07-14 20:37:31 +03:00
! dqp - > q_blk . count & & \
! dqp - > q_rtb . count & & \
! dqp - > q_ino . count )
2013-11-22 20:15:43 +04:00
2020-07-14 20:37:32 +03:00
struct xfs_quota_limits {
xfs_qcnt_t hard ; /* default hard limit */
xfs_qcnt_t soft ; /* default soft limit */
time64_t time ; /* limit for timers */
xfs_qwarncnt_t warn ; /* limit for warnings */
} ;
2020-05-21 23:07:01 +03:00
/* Defaults for each quota type: time limits, warn limits, usage limits */
2016-02-08 03:27:55 +03:00
struct xfs_def_quota {
2020-07-14 20:37:32 +03:00
struct xfs_quota_limits blk ;
struct xfs_quota_limits ino ;
struct xfs_quota_limits rtb ;
2016-02-08 03:27:55 +03:00
} ;
2005-04-17 02:20:36 +04:00
/*
* Various quota information for individual filesystems .
* The mount structure keeps a pointer to this .
*/
2019-11-13 04:04:26 +03:00
struct xfs_quotainfo {
2020-05-21 23:07:00 +03:00
struct radix_tree_root qi_uquota_tree ;
struct radix_tree_root qi_gquota_tree ;
struct radix_tree_root qi_pquota_tree ;
struct mutex qi_tree_lock ;
2013-07-11 09:00:40 +04:00
struct xfs_inode * qi_uquotaip ; /* user quota inode */
struct xfs_inode * qi_gquotaip ; /* group quota inode */
struct xfs_inode * qi_pquotaip ; /* project quota inode */
2020-05-21 23:07:00 +03:00
struct list_lru qi_lru ;
int qi_dquots ;
struct mutex qi_quotaofflock ; /* to serialize quotaoff */
xfs_filblks_t qi_dqchunklen ; /* # BBs in a chunk of dqs */
uint qi_dqperchunk ; /* # ondisk dq in above chunk */
2016-02-08 03:27:55 +03:00
struct xfs_def_quota qi_usr_default ;
struct xfs_def_quota qi_grp_default ;
struct xfs_def_quota qi_prj_default ;
2020-05-21 23:07:00 +03:00
struct shrinker qi_shrinker ;
2020-08-17 19:58:36 +03:00
/* Minimum and maximum quota expiration timestamp values. */
time64_t qi_expiry_min ;
time64_t qi_expiry_max ;
2019-11-13 04:04:26 +03:00
} ;
2005-04-17 02:20:36 +04:00
2013-06-28 02:25:05 +04:00
static inline struct radix_tree_root *
xfs_dquot_tree (
struct xfs_quotainfo * qi ,
2020-07-16 03:53:43 +03:00
xfs_dqtype_t type )
2013-06-28 02:25:05 +04:00
{
switch ( type ) {
2020-07-16 03:42:36 +03:00
case XFS_DQTYPE_USER :
2013-06-28 02:25:05 +04:00
return & qi - > qi_uquota_tree ;
2020-07-16 03:42:36 +03:00
case XFS_DQTYPE_GROUP :
2013-06-28 02:25:05 +04:00
return & qi - > qi_gquota_tree ;
2020-07-16 03:42:36 +03:00
case XFS_DQTYPE_PROJ :
2013-07-11 09:00:40 +04:00
return & qi - > qi_pquota_tree ;
2013-06-28 02:25:05 +04:00
default :
ASSERT ( 0 ) ;
}
return NULL ;
}
2013-06-28 02:25:06 +04:00
static inline struct xfs_inode *
2020-07-16 03:53:43 +03:00
xfs_quota_inode ( struct xfs_mount * mp , xfs_dqtype_t type )
2013-06-28 02:25:06 +04:00
{
2020-07-16 03:53:43 +03:00
switch ( type ) {
2020-07-16 03:42:36 +03:00
case XFS_DQTYPE_USER :
2016-02-08 03:23:23 +03:00
return mp - > m_quotainfo - > qi_uquotaip ;
2020-07-16 03:42:36 +03:00
case XFS_DQTYPE_GROUP :
2016-02-08 03:23:23 +03:00
return mp - > m_quotainfo - > qi_gquotaip ;
2020-07-16 03:42:36 +03:00
case XFS_DQTYPE_PROJ :
2016-02-08 03:23:23 +03:00
return mp - > m_quotainfo - > qi_pquotaip ;
2013-06-28 02:25:06 +04:00
default :
ASSERT ( 0 ) ;
}
return NULL ;
}
2019-04-18 02:30:24 +03:00
extern void xfs_trans_mod_dquot ( struct xfs_trans * tp , struct xfs_dquot * dqp ,
uint field , int64_t delta ) ;
2013-06-28 02:25:07 +04:00
extern void xfs_trans_dqjoin ( struct xfs_trans * , struct xfs_dquot * ) ;
extern void xfs_trans_log_dquot ( struct xfs_trans * , struct xfs_dquot * ) ;
2005-04-17 02:20:36 +04:00
/*
2013-07-11 09:00:40 +04:00
* We keep the usr , grp , and prj dquots separately so that locking will be
* easier to do at commit time . All transactions that we know of at this point
2005-04-17 02:20:36 +04:00
* affect no more than two dquots of one type . Hence , the TRANS_MAXDQS value .
*/
2013-06-28 02:25:09 +04:00
enum {
XFS_QM_TRANS_USR = 0 ,
XFS_QM_TRANS_GRP ,
2013-07-11 09:00:40 +04:00
XFS_QM_TRANS_PRJ ,
2013-06-28 02:25:09 +04:00
XFS_QM_TRANS_DQTYPES
} ;
2005-04-17 02:20:36 +04:00
# define XFS_QM_TRANS_MAXDQS 2
2013-06-28 02:25:09 +04:00
struct xfs_dquot_acct {
struct xfs_dqtrx dqs [ XFS_QM_TRANS_DQTYPES ] [ XFS_QM_TRANS_MAXDQS ] ;
} ;
2005-04-17 02:20:36 +04:00
/*
* Users are allowed to have a usage exceeding their softlimit for
* a period this long .
*/
# define XFS_QM_BTIMELIMIT (7 * 24*60*60) /* 1 week */
# define XFS_QM_RTBTIMELIMIT (7 * 24*60*60) /* 1 week */
# define XFS_QM_ITIMELIMIT (7 * 24*60*60) /* 1 week */
# define XFS_QM_BWARNLIMIT 5
# define XFS_QM_IWARNLIMIT 5
2005-06-21 09:48:47 +04:00
# define XFS_QM_RTBWARNLIMIT 5
2005-04-17 02:20:36 +04:00
2013-06-28 02:25:07 +04:00
extern void xfs_qm_destroy_quotainfo ( struct xfs_mount * ) ;
2005-04-17 02:20:36 +04:00
/* dquot stuff */
2013-06-28 02:25:07 +04:00
extern void xfs_qm_dqpurge_all ( struct xfs_mount * , uint ) ;
extern void xfs_qm_dqrele_all_inodes ( struct xfs_mount * , uint ) ;
2005-04-17 02:20:36 +04:00
2009-02-09 10:47:34 +03:00
/* quota ops */
2013-06-28 02:25:07 +04:00
extern int xfs_qm_scall_trunc_qfiles ( struct xfs_mount * , uint ) ;
2020-07-16 03:53:43 +03:00
extern int xfs_qm_scall_getquota ( struct xfs_mount * mp ,
xfs_dqid_t id ,
xfs_dqtype_t type ,
struct qc_dqblk * dst ) ;
extern int xfs_qm_scall_getquota_next ( struct xfs_mount * mp ,
xfs_dqid_t * id ,
xfs_dqtype_t type ,
struct qc_dqblk * dst ) ;
extern int xfs_qm_scall_setqlim ( struct xfs_mount * mp ,
xfs_dqid_t id ,
xfs_dqtype_t type ,
struct qc_dqblk * newlim ) ;
2013-06-28 02:25:07 +04:00
extern int xfs_qm_scall_quotaon ( struct xfs_mount * , uint ) ;
extern int xfs_qm_scall_quotaoff ( struct xfs_mount * , uint ) ;
2009-02-09 10:47:34 +03:00
2016-02-08 03:27:55 +03:00
static inline struct xfs_def_quota *
2020-07-16 03:53:43 +03:00
xfs_get_defquota ( struct xfs_quotainfo * qi , xfs_dqtype_t type )
2016-02-08 03:27:55 +03:00
{
2020-05-21 23:07:00 +03:00
switch ( type ) {
2020-07-16 03:42:36 +03:00
case XFS_DQTYPE_USER :
2020-05-21 23:07:00 +03:00
return & qi - > qi_usr_default ;
2020-07-16 03:42:36 +03:00
case XFS_DQTYPE_GROUP :
2020-05-21 23:07:00 +03:00
return & qi - > qi_grp_default ;
2020-07-16 03:42:36 +03:00
case XFS_DQTYPE_PROJ :
2020-05-21 23:07:00 +03:00
return & qi - > qi_prj_default ;
default :
ASSERT ( 0 ) ;
return NULL ;
2016-02-08 03:27:55 +03:00
}
}
2005-04-17 02:20:36 +04:00
# endif /* __XFS_QM_H__ */