diff options
Diffstat (limited to 'fs/xfs/xfs_qm.h')
-rw-r--r-- | fs/xfs/xfs_qm.h | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/fs/xfs/xfs_qm.h b/fs/xfs/xfs_qm.h new file mode 100644 index 000000000000..43b9abe1052c --- /dev/null +++ b/fs/xfs/xfs_qm.h | |||
@@ -0,0 +1,166 @@ | |||
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 | #include "xfs_quota_priv.h" | ||
24 | #include "xfs_qm_stats.h" | ||
25 | |||
26 | struct xfs_qm; | ||
27 | struct xfs_inode; | ||
28 | |||
29 | extern uint ndquot; | ||
30 | extern struct mutex xfs_Gqm_lock; | ||
31 | extern struct xfs_qm *xfs_Gqm; | ||
32 | extern kmem_zone_t *qm_dqzone; | ||
33 | extern kmem_zone_t *qm_dqtrxzone; | ||
34 | |||
35 | /* | ||
36 | * Used in xfs_qm_sync called by xfs_sync to count the max times that it can | ||
37 | * iterate over the mountpt's dquot list in one call. | ||
38 | */ | ||
39 | #define XFS_QM_SYNC_MAX_RESTARTS 7 | ||
40 | |||
41 | /* | ||
42 | * Ditto, for xfs_qm_dqreclaim_one. | ||
43 | */ | ||
44 | #define XFS_QM_RECLAIM_MAX_RESTARTS 4 | ||
45 | |||
46 | /* | ||
47 | * Ideal ratio of free to in use dquots. Quota manager makes an attempt | ||
48 | * to keep this balance. | ||
49 | */ | ||
50 | #define XFS_QM_DQFREE_RATIO 2 | ||
51 | |||
52 | /* | ||
53 | * Dquot hashtable constants/threshold values. | ||
54 | */ | ||
55 | #define XFS_QM_HASHSIZE_LOW (PAGE_SIZE / sizeof(xfs_dqhash_t)) | ||
56 | #define XFS_QM_HASHSIZE_HIGH ((PAGE_SIZE * 4) / sizeof(xfs_dqhash_t)) | ||
57 | |||
58 | /* | ||
59 | * This defines the unit of allocation of dquots. | ||
60 | * Currently, it is just one file system block, and a 4K blk contains 30 | ||
61 | * (136 * 30 = 4080) dquots. It's probably not worth trying to make | ||
62 | * this more dynamic. | ||
63 | * XXXsup However, if this number is changed, we have to make sure that we don't | ||
64 | * implicitly assume that we do allocations in chunks of a single filesystem | ||
65 | * block in the dquot/xqm code. | ||
66 | */ | ||
67 | #define XFS_DQUOT_CLUSTER_SIZE_FSB (xfs_filblks_t)1 | ||
68 | |||
69 | typedef xfs_dqhash_t xfs_dqlist_t; | ||
70 | |||
71 | /* | ||
72 | * Quota Manager (global) structure. Lives only in core. | ||
73 | */ | ||
74 | typedef struct xfs_qm { | ||
75 | xfs_dqlist_t *qm_usr_dqhtable;/* udquot hash table */ | ||
76 | xfs_dqlist_t *qm_grp_dqhtable;/* gdquot hash table */ | ||
77 | uint qm_dqhashmask; /* # buckets in dq hashtab - 1 */ | ||
78 | struct list_head qm_dqfrlist; /* freelist of dquots */ | ||
79 | struct mutex qm_dqfrlist_lock; | ||
80 | int qm_dqfrlist_cnt; | ||
81 | atomic_t qm_totaldquots; /* total incore dquots */ | ||
82 | uint qm_nrefs; /* file systems with quota on */ | ||
83 | int qm_dqfree_ratio;/* ratio of free to inuse dquots */ | ||
84 | kmem_zone_t *qm_dqzone; /* dquot mem-alloc zone */ | ||
85 | kmem_zone_t *qm_dqtrxzone; /* t_dqinfo of transactions */ | ||
86 | } xfs_qm_t; | ||
87 | |||
88 | /* | ||
89 | * Various quota information for individual filesystems. | ||
90 | * The mount structure keeps a pointer to this. | ||
91 | */ | ||
92 | typedef struct xfs_quotainfo { | ||
93 | xfs_inode_t *qi_uquotaip; /* user quota inode */ | ||
94 | xfs_inode_t *qi_gquotaip; /* group quota inode */ | ||
95 | struct list_head qi_dqlist; /* all dquots in filesys */ | ||
96 | struct mutex qi_dqlist_lock; | ||
97 | int qi_dquots; | ||
98 | int qi_dqreclaims; /* a change here indicates | ||
99 | a removal in the dqlist */ | ||
100 | time_t qi_btimelimit; /* limit for blks timer */ | ||
101 | time_t qi_itimelimit; /* limit for inodes timer */ | ||
102 | time_t qi_rtbtimelimit;/* limit for rt blks timer */ | ||
103 | xfs_qwarncnt_t qi_bwarnlimit; /* limit for blks warnings */ | ||
104 | xfs_qwarncnt_t qi_iwarnlimit; /* limit for inodes warnings */ | ||
105 | xfs_qwarncnt_t qi_rtbwarnlimit;/* limit for rt blks warnings */ | ||
106 | struct mutex qi_quotaofflock;/* to serialize quotaoff */ | ||
107 | xfs_filblks_t qi_dqchunklen; /* # BBs in a chunk of dqs */ | ||
108 | uint qi_dqperchunk; /* # ondisk dqs in above chunk */ | ||
109 | xfs_qcnt_t qi_bhardlimit; /* default data blk hard limit */ | ||
110 | xfs_qcnt_t qi_bsoftlimit; /* default data blk soft limit */ | ||
111 | xfs_qcnt_t qi_ihardlimit; /* default inode count hard limit */ | ||
112 | xfs_qcnt_t qi_isoftlimit; /* default inode count soft limit */ | ||
113 | xfs_qcnt_t qi_rtbhardlimit;/* default realtime blk hard limit */ | ||
114 | xfs_qcnt_t qi_rtbsoftlimit;/* default realtime blk soft limit */ | ||
115 | } xfs_quotainfo_t; | ||
116 | |||
117 | |||
118 | extern void xfs_trans_mod_dquot(xfs_trans_t *, xfs_dquot_t *, uint, long); | ||
119 | extern int xfs_trans_reserve_quota_bydquots(xfs_trans_t *, xfs_mount_t *, | ||
120 | xfs_dquot_t *, xfs_dquot_t *, long, long, uint); | ||
121 | extern void xfs_trans_dqjoin(xfs_trans_t *, xfs_dquot_t *); | ||
122 | extern void xfs_trans_log_dquot(xfs_trans_t *, xfs_dquot_t *); | ||
123 | |||
124 | /* | ||
125 | * We keep the usr and grp dquots separately so that locking will be easier | ||
126 | * to do at commit time. All transactions that we know of at this point | ||
127 | * affect no more than two dquots of one type. Hence, the TRANS_MAXDQS value. | ||
128 | */ | ||
129 | #define XFS_QM_TRANS_MAXDQS 2 | ||
130 | typedef struct xfs_dquot_acct { | ||
131 | xfs_dqtrx_t dqa_usrdquots[XFS_QM_TRANS_MAXDQS]; | ||
132 | xfs_dqtrx_t dqa_grpdquots[XFS_QM_TRANS_MAXDQS]; | ||
133 | } xfs_dquot_acct_t; | ||
134 | |||
135 | /* | ||
136 | * Users are allowed to have a usage exceeding their softlimit for | ||
137 | * a period this long. | ||
138 | */ | ||
139 | #define XFS_QM_BTIMELIMIT (7 * 24*60*60) /* 1 week */ | ||
140 | #define XFS_QM_RTBTIMELIMIT (7 * 24*60*60) /* 1 week */ | ||
141 | #define XFS_QM_ITIMELIMIT (7 * 24*60*60) /* 1 week */ | ||
142 | |||
143 | #define XFS_QM_BWARNLIMIT 5 | ||
144 | #define XFS_QM_IWARNLIMIT 5 | ||
145 | #define XFS_QM_RTBWARNLIMIT 5 | ||
146 | |||
147 | extern void xfs_qm_destroy_quotainfo(xfs_mount_t *); | ||
148 | extern int xfs_qm_quotacheck(xfs_mount_t *); | ||
149 | extern int xfs_qm_write_sb_changes(xfs_mount_t *, __int64_t); | ||
150 | |||
151 | /* dquot stuff */ | ||
152 | extern boolean_t xfs_qm_dqalloc_incore(xfs_dquot_t **); | ||
153 | extern int xfs_qm_dqpurge_all(xfs_mount_t *, uint); | ||
154 | extern void xfs_qm_dqrele_all_inodes(xfs_mount_t *, uint); | ||
155 | |||
156 | /* quota ops */ | ||
157 | extern int xfs_qm_scall_trunc_qfiles(xfs_mount_t *, uint); | ||
158 | extern int xfs_qm_scall_getquota(xfs_mount_t *, xfs_dqid_t, uint, | ||
159 | fs_disk_quota_t *); | ||
160 | extern int xfs_qm_scall_setqlim(xfs_mount_t *, xfs_dqid_t, uint, | ||
161 | fs_disk_quota_t *); | ||
162 | extern int xfs_qm_scall_getqstat(xfs_mount_t *, fs_quota_stat_t *); | ||
163 | extern int xfs_qm_scall_quotaon(xfs_mount_t *, uint); | ||
164 | extern int xfs_qm_scall_quotaoff(xfs_mount_t *, uint); | ||
165 | |||
166 | #endif /* __XFS_QM_H__ */ | ||