linux/fs/xfs/xfs_qm.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2000-2005 Silicon Graphics, Inc.
   3 * All Rights Reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or
   6 * modify it under the terms of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it would be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 *
  14 * You should have received a copy of the GNU General Public License
  15 * along with this program; if not, write the Free Software Foundation,
  16 * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  17 */
  18#ifndef __XFS_QM_H__
  19#define __XFS_QM_H__
  20
  21#include "xfs_dquot_item.h"
  22#include "xfs_dquot.h"
  23
  24struct xfs_inode;
  25
  26extern struct kmem_zone *xfs_qm_dqtrxzone;
  27
  28/*
  29 * Number of bmaps that we ask from bmapi when doing a quotacheck.
  30 * We make this restriction to keep the memory usage to a minimum.
  31 */
  32#define XFS_DQITER_MAP_SIZE     10
  33
  34#define XFS_IS_DQUOT_UNINITIALIZED(dqp) ( \
  35        !dqp->q_core.d_blk_hardlimit && \
  36        !dqp->q_core.d_blk_softlimit && \
  37        !dqp->q_core.d_rtb_hardlimit && \
  38        !dqp->q_core.d_rtb_softlimit && \
  39        !dqp->q_core.d_ino_hardlimit && \
  40        !dqp->q_core.d_ino_softlimit && \
  41        !dqp->q_core.d_bcount && \
  42        !dqp->q_core.d_rtbcount && \
  43        !dqp->q_core.d_icount)
  44
  45/*
  46 * This defines the unit of allocation of dquots.
  47 * Currently, it is just one file system block, and a 4K blk contains 30
  48 * (136 * 30 = 4080) dquots. It's probably not worth trying to make
  49 * this more dynamic.
  50 * XXXsup However, if this number is changed, we have to make sure that we don't
  51 * implicitly assume that we do allocations in chunks of a single filesystem
  52 * block in the dquot/xqm code.
  53 */
  54#define XFS_DQUOT_CLUSTER_SIZE_FSB      (xfs_filblks_t)1
  55
  56/*
  57 * Various quota information for individual filesystems.
  58 * The mount structure keeps a pointer to this.
  59 */
  60typedef struct xfs_quotainfo {
  61        struct radix_tree_root qi_uquota_tree;
  62        struct radix_tree_root qi_gquota_tree;
  63        struct radix_tree_root qi_pquota_tree;
  64        struct mutex qi_tree_lock;
  65        struct xfs_inode        *qi_uquotaip;   /* user quota inode */
  66        struct xfs_inode        *qi_gquotaip;   /* group quota inode */
  67        struct xfs_inode        *qi_pquotaip;   /* project quota inode */
  68        struct list_lru  qi_lru;
  69        int              qi_dquots;
  70        time_t           qi_btimelimit;  /* limit for blks timer */
  71        time_t           qi_itimelimit;  /* limit for inodes timer */
  72        time_t           qi_rtbtimelimit;/* limit for rt blks timer */
  73        xfs_qwarncnt_t   qi_bwarnlimit;  /* limit for blks warnings */
  74        xfs_qwarncnt_t   qi_iwarnlimit;  /* limit for inodes warnings */
  75        xfs_qwarncnt_t   qi_rtbwarnlimit;/* limit for rt blks warnings */
  76        struct mutex     qi_quotaofflock;/* to serialize quotaoff */
  77        xfs_filblks_t    qi_dqchunklen;  /* # BBs in a chunk of dqs */
  78        uint             qi_dqperchunk;  /* # ondisk dqs in above chunk */
  79        xfs_qcnt_t       qi_bhardlimit;  /* default data blk hard limit */
  80        xfs_qcnt_t       qi_bsoftlimit;  /* default data blk soft limit */
  81        xfs_qcnt_t       qi_ihardlimit;  /* default inode count hard limit */
  82        xfs_qcnt_t       qi_isoftlimit;  /* default inode count soft limit */
  83        xfs_qcnt_t       qi_rtbhardlimit;/* default realtime blk hard limit */
  84        xfs_qcnt_t       qi_rtbsoftlimit;/* default realtime blk soft limit */
  85        struct shrinker  qi_shrinker;
  86} xfs_quotainfo_t;
  87
  88static inline struct radix_tree_root *
  89xfs_dquot_tree(
  90        struct xfs_quotainfo    *qi,
  91        int                     type)
  92{
  93        switch (type) {
  94        case XFS_DQ_USER:
  95                return &qi->qi_uquota_tree;
  96        case XFS_DQ_GROUP:
  97                return &qi->qi_gquota_tree;
  98        case XFS_DQ_PROJ:
  99                return &qi->qi_pquota_tree;
 100        default:
 101                ASSERT(0);
 102        }
 103        return NULL;
 104}
 105
 106static inline struct xfs_inode *
 107xfs_dq_to_quota_inode(struct xfs_dquot *dqp)
 108{
 109        switch (dqp->dq_flags & XFS_DQ_ALLTYPES) {
 110        case XFS_DQ_USER:
 111                return dqp->q_mount->m_quotainfo->qi_uquotaip;
 112        case XFS_DQ_GROUP:
 113                return dqp->q_mount->m_quotainfo->qi_gquotaip;
 114        case XFS_DQ_PROJ:
 115                return dqp->q_mount->m_quotainfo->qi_pquotaip;
 116        default:
 117                ASSERT(0);
 118        }
 119        return NULL;
 120}
 121
 122extern void     xfs_trans_mod_dquot(struct xfs_trans *,
 123                                        struct xfs_dquot *, uint, long);
 124extern int      xfs_trans_reserve_quota_bydquots(struct xfs_trans *,
 125                        struct xfs_mount *, struct xfs_dquot *,
 126                        struct xfs_dquot *, struct xfs_dquot *,
 127                        long, long, uint);
 128extern void     xfs_trans_dqjoin(struct xfs_trans *, struct xfs_dquot *);
 129extern void     xfs_trans_log_dquot(struct xfs_trans *, struct xfs_dquot *);
 130
 131/*
 132 * We keep the usr, grp, and prj dquots separately so that locking will be
 133 * easier to do at commit time. All transactions that we know of at this point
 134 * affect no more than two dquots of one type. Hence, the TRANS_MAXDQS value.
 135 */
 136enum {
 137        XFS_QM_TRANS_USR = 0,
 138        XFS_QM_TRANS_GRP,
 139        XFS_QM_TRANS_PRJ,
 140        XFS_QM_TRANS_DQTYPES
 141};
 142#define XFS_QM_TRANS_MAXDQS             2
 143struct xfs_dquot_acct {
 144        struct xfs_dqtrx        dqs[XFS_QM_TRANS_DQTYPES][XFS_QM_TRANS_MAXDQS];
 145};
 146
 147/*
 148 * Users are allowed to have a usage exceeding their softlimit for
 149 * a period this long.
 150 */
 151#define XFS_QM_BTIMELIMIT       (7 * 24*60*60)          /* 1 week */
 152#define XFS_QM_RTBTIMELIMIT     (7 * 24*60*60)          /* 1 week */
 153#define XFS_QM_ITIMELIMIT       (7 * 24*60*60)          /* 1 week */
 154
 155#define XFS_QM_BWARNLIMIT       5
 156#define XFS_QM_IWARNLIMIT       5
 157#define XFS_QM_RTBWARNLIMIT     5
 158
 159extern void             xfs_qm_destroy_quotainfo(struct xfs_mount *);
 160extern int              xfs_qm_write_sb_changes(struct xfs_mount *, __int64_t);
 161
 162/* dquot stuff */
 163extern void             xfs_qm_dqpurge_all(struct xfs_mount *, uint);
 164extern void             xfs_qm_dqrele_all_inodes(struct xfs_mount *, uint);
 165
 166/* quota ops */
 167extern int              xfs_qm_scall_trunc_qfiles(struct xfs_mount *, uint);
 168extern int              xfs_qm_scall_getquota(struct xfs_mount *, xfs_dqid_t,
 169                                        uint, struct qc_dqblk *);
 170extern int              xfs_qm_scall_setqlim(struct xfs_mount *, xfs_dqid_t, uint,
 171                                        struct qc_dqblk *);
 172extern int              xfs_qm_scall_getqstat(struct xfs_mount *,
 173                                        struct fs_quota_stat *);
 174extern int              xfs_qm_scall_getqstatv(struct xfs_mount *,
 175                                        struct fs_quota_statv *);
 176extern int              xfs_qm_scall_quotaon(struct xfs_mount *, uint);
 177extern int              xfs_qm_scall_quotaoff(struct xfs_mount *, uint);
 178
 179#endif /* __XFS_QM_H__ */
 180