34 #define _LINUX_QUOTA_ |
34 #define _LINUX_QUOTA_ |
35 |
35 |
36 #include <linux/errno.h> |
36 #include <linux/errno.h> |
37 #include <linux/types.h> |
37 #include <linux/types.h> |
38 |
38 |
39 #define __DQUOT_VERSION__ "dquot_6.5.1" |
39 #define __DQUOT_VERSION__ "dquot_6.5.2" |
40 #define __DQUOT_NUM_VERSION__ 6*10000+5*100+1 |
|
41 |
|
42 /* Size of blocks in which are counted size limits */ |
|
43 #define QUOTABLOCK_BITS 10 |
|
44 #define QUOTABLOCK_SIZE (1 << QUOTABLOCK_BITS) |
|
45 |
|
46 /* Conversion routines from and to quota blocks */ |
|
47 #define qb2kb(x) ((x) << (QUOTABLOCK_BITS-10)) |
|
48 #define kb2qb(x) ((x) >> (QUOTABLOCK_BITS-10)) |
|
49 #define toqb(x) (((x) + QUOTABLOCK_SIZE - 1) >> QUOTABLOCK_BITS) |
|
50 |
40 |
51 #define MAXQUOTAS 2 |
41 #define MAXQUOTAS 2 |
52 #define USRQUOTA 0 /* element used for user quotas */ |
42 #define USRQUOTA 0 /* element used for user quotas */ |
53 #define GRPQUOTA 1 /* element used for group quotas */ |
43 #define GRPQUOTA 1 /* element used for group quotas */ |
54 |
44 |
78 #define Q_GETINFO 0x800005 /* get information about quota files */ |
68 #define Q_GETINFO 0x800005 /* get information about quota files */ |
79 #define Q_SETINFO 0x800006 /* set information about quota files */ |
69 #define Q_SETINFO 0x800006 /* set information about quota files */ |
80 #define Q_GETQUOTA 0x800007 /* get user quota structure */ |
70 #define Q_GETQUOTA 0x800007 /* get user quota structure */ |
81 #define Q_SETQUOTA 0x800008 /* set user quota structure */ |
71 #define Q_SETQUOTA 0x800008 /* set user quota structure */ |
82 |
72 |
|
73 /* Quota format type IDs */ |
|
74 #define QFMT_VFS_OLD 1 |
|
75 #define QFMT_VFS_V0 2 |
|
76 |
|
77 /* Size of block in which space limits are passed through the quota |
|
78 * interface */ |
|
79 #define QIF_DQBLKSIZE_BITS 10 |
|
80 #define QIF_DQBLKSIZE (1 << QIF_DQBLKSIZE_BITS) |
|
81 |
83 /* |
82 /* |
84 * Quota structure used for communication with userspace via quotactl |
83 * Quota structure used for communication with userspace via quotactl |
85 * Following flags are used to specify which fields are valid |
84 * Following flags are used to specify which fields are valid |
86 */ |
85 */ |
87 #define QIF_BLIMITS 1 |
86 enum { |
88 #define QIF_SPACE 2 |
87 QIF_BLIMITS_B = 0, |
89 #define QIF_ILIMITS 4 |
88 QIF_SPACE_B, |
90 #define QIF_INODES 8 |
89 QIF_ILIMITS_B, |
91 #define QIF_BTIME 16 |
90 QIF_INODES_B, |
92 #define QIF_ITIME 32 |
91 QIF_BTIME_B, |
|
92 QIF_ITIME_B, |
|
93 }; |
|
94 |
|
95 #define QIF_BLIMITS (1 << QIF_BLIMITS_B) |
|
96 #define QIF_SPACE (1 << QIF_SPACE_B) |
|
97 #define QIF_ILIMITS (1 << QIF_ILIMITS_B) |
|
98 #define QIF_INODES (1 << QIF_INODES_B) |
|
99 #define QIF_BTIME (1 << QIF_BTIME_B) |
|
100 #define QIF_ITIME (1 << QIF_ITIME_B) |
93 #define QIF_LIMITS (QIF_BLIMITS | QIF_ILIMITS) |
101 #define QIF_LIMITS (QIF_BLIMITS | QIF_ILIMITS) |
94 #define QIF_USAGE (QIF_SPACE | QIF_INODES) |
102 #define QIF_USAGE (QIF_SPACE | QIF_INODES) |
95 #define QIF_TIMES (QIF_BTIME | QIF_ITIME) |
103 #define QIF_TIMES (QIF_BTIME | QIF_ITIME) |
96 #define QIF_ALL (QIF_LIMITS | QIF_USAGE | QIF_TIMES) |
104 #define QIF_ALL (QIF_LIMITS | QIF_USAGE | QIF_TIMES) |
97 |
105 |
170 #include <linux/dqblk_v2.h> |
178 #include <linux/dqblk_v2.h> |
171 |
179 |
172 #include <asm/atomic.h> |
180 #include <asm/atomic.h> |
173 |
181 |
174 typedef __kernel_uid32_t qid_t; /* Type in which we store ids in memory */ |
182 typedef __kernel_uid32_t qid_t; /* Type in which we store ids in memory */ |
175 typedef __u64 qsize_t; /* Type in which we store sizes */ |
183 typedef long long qsize_t; /* Type in which we store sizes */ |
176 |
184 |
177 extern spinlock_t dq_data_lock; |
185 extern spinlock_t dq_data_lock; |
178 |
186 |
179 /* Maximal numbers of writes for quota operation (insert/delete/update) |
187 /* Maximal numbers of writes for quota operation (insert/delete/update) |
180 * (over VFS all formats) */ |
188 * (over VFS all formats) */ |
185 |
193 |
186 /* |
194 /* |
187 * Data for one user/group kept in memory |
195 * Data for one user/group kept in memory |
188 */ |
196 */ |
189 struct mem_dqblk { |
197 struct mem_dqblk { |
190 __u32 dqb_bhardlimit; /* absolute limit on disk blks alloc */ |
198 qsize_t dqb_bhardlimit; /* absolute limit on disk blks alloc */ |
191 __u32 dqb_bsoftlimit; /* preferred limit on disk blks */ |
199 qsize_t dqb_bsoftlimit; /* preferred limit on disk blks */ |
192 qsize_t dqb_curspace; /* current used space */ |
200 qsize_t dqb_curspace; /* current used space */ |
193 __u32 dqb_ihardlimit; /* absolute limit on allocated inodes */ |
201 qsize_t dqb_ihardlimit; /* absolute limit on allocated inodes */ |
194 __u32 dqb_isoftlimit; /* preferred inode limit */ |
202 qsize_t dqb_isoftlimit; /* preferred inode limit */ |
195 __u32 dqb_curinodes; /* current # allocated inodes */ |
203 qsize_t dqb_curinodes; /* current # allocated inodes */ |
196 time_t dqb_btime; /* time limit for excessive disk use */ |
204 time_t dqb_btime; /* time limit for excessive disk use */ |
197 time_t dqb_itime; /* time limit for excessive inode use */ |
205 time_t dqb_itime; /* time limit for excessive inode use */ |
198 }; |
206 }; |
199 |
207 |
200 /* |
208 /* |
210 unsigned long dqi_flags; |
218 unsigned long dqi_flags; |
211 unsigned int dqi_bgrace; |
219 unsigned int dqi_bgrace; |
212 unsigned int dqi_igrace; |
220 unsigned int dqi_igrace; |
213 qsize_t dqi_maxblimit; |
221 qsize_t dqi_maxblimit; |
214 qsize_t dqi_maxilimit; |
222 qsize_t dqi_maxilimit; |
215 union { |
223 void *dqi_priv; |
216 struct v1_mem_dqinfo v1_i; |
|
217 struct v2_mem_dqinfo v2_i; |
|
218 } u; |
|
219 }; |
224 }; |
220 |
225 |
221 struct super_block; |
226 struct super_block; |
222 |
227 |
223 #define DQF_MASK 0xffff /* Mask for format specific flags */ |
228 #define DQF_MASK 0xffff /* Mask for format specific flags */ |
247 #define DQ_BLKS_B 1 /* uid/gid has been warned about blk limit */ |
252 #define DQ_BLKS_B 1 /* uid/gid has been warned about blk limit */ |
248 #define DQ_INODES_B 2 /* uid/gid has been warned about inode limit */ |
253 #define DQ_INODES_B 2 /* uid/gid has been warned about inode limit */ |
249 #define DQ_FAKE_B 3 /* no limits only usage */ |
254 #define DQ_FAKE_B 3 /* no limits only usage */ |
250 #define DQ_READ_B 4 /* dquot was read into memory */ |
255 #define DQ_READ_B 4 /* dquot was read into memory */ |
251 #define DQ_ACTIVE_B 5 /* dquot is active (dquot_release not called) */ |
256 #define DQ_ACTIVE_B 5 /* dquot is active (dquot_release not called) */ |
|
257 #define DQ_LASTSET_B 6 /* Following 6 bits (see QIF_) are reserved\ |
|
258 * for the mask of entries set via SETQUOTA\ |
|
259 * quotactl. They are set under dq_data_lock\ |
|
260 * and the quota format handling dquot can\ |
|
261 * clear them when it sees fit. */ |
252 |
262 |
253 struct dquot { |
263 struct dquot { |
254 struct hlist_node dq_hash; /* Hash list in memory */ |
264 struct hlist_node dq_hash; /* Hash list in memory */ |
255 struct list_head dq_inuse; /* List of all quotas */ |
265 struct list_head dq_inuse; /* List of all quotas */ |
256 struct list_head dq_free; /* Free list element */ |
266 struct list_head dq_free; /* Free list element */ |
285 /* Operations working with dquots */ |
295 /* Operations working with dquots */ |
286 struct dquot_operations { |
296 struct dquot_operations { |
287 int (*initialize) (struct inode *, int); |
297 int (*initialize) (struct inode *, int); |
288 int (*drop) (struct inode *); |
298 int (*drop) (struct inode *); |
289 int (*alloc_space) (struct inode *, qsize_t, int); |
299 int (*alloc_space) (struct inode *, qsize_t, int); |
290 int (*alloc_inode) (const struct inode *, unsigned long); |
300 int (*alloc_inode) (const struct inode *, qsize_t); |
291 int (*free_space) (struct inode *, qsize_t); |
301 int (*free_space) (struct inode *, qsize_t); |
292 int (*free_inode) (const struct inode *, unsigned long); |
302 int (*free_inode) (const struct inode *, qsize_t); |
293 int (*transfer) (struct inode *, struct iattr *); |
303 int (*transfer) (struct inode *, struct iattr *); |
294 int (*write_dquot) (struct dquot *); /* Ordinary dquot write */ |
304 int (*write_dquot) (struct dquot *); /* Ordinary dquot write */ |
|
305 struct dquot *(*alloc_dquot)(struct super_block *, int); /* Allocate memory for new dquot */ |
|
306 void (*destroy_dquot)(struct dquot *); /* Free memory for dquot */ |
295 int (*acquire_dquot) (struct dquot *); /* Quota is going to be created on disk */ |
307 int (*acquire_dquot) (struct dquot *); /* Quota is going to be created on disk */ |
296 int (*release_dquot) (struct dquot *); /* Quota is going to be deleted from disk */ |
308 int (*release_dquot) (struct dquot *); /* Quota is going to be deleted from disk */ |
297 int (*mark_dirty) (struct dquot *); /* Dquot is marked dirty */ |
309 int (*mark_dirty) (struct dquot *); /* Dquot is marked dirty */ |
298 int (*write_info) (struct super_block *, int); /* Write of quota "superblock" */ |
310 int (*write_info) (struct super_block *, int); /* Write of quota "superblock" */ |
299 }; |
311 }; |
318 struct quota_format_ops *qf_ops; /* Operations of format */ |
330 struct quota_format_ops *qf_ops; /* Operations of format */ |
319 struct module *qf_owner; /* Module implementing quota format */ |
331 struct module *qf_owner; /* Module implementing quota format */ |
320 struct quota_format_type *qf_next; |
332 struct quota_format_type *qf_next; |
321 }; |
333 }; |
322 |
334 |
323 #define DQUOT_USR_ENABLED 0x01 /* User diskquotas enabled */ |
335 /* Quota state flags - they actually come in two flavors - for users and groups */ |
324 #define DQUOT_GRP_ENABLED 0x02 /* Group diskquotas enabled */ |
336 enum { |
325 #define DQUOT_USR_SUSPENDED 0x04 /* User diskquotas are off, but |
337 _DQUOT_USAGE_ENABLED = 0, /* Track disk usage for users */ |
|
338 _DQUOT_LIMITS_ENABLED, /* Enforce quota limits for users */ |
|
339 _DQUOT_SUSPENDED, /* User diskquotas are off, but |
326 * we have necessary info in |
340 * we have necessary info in |
327 * memory to turn them on */ |
341 * memory to turn them on */ |
328 #define DQUOT_GRP_SUSPENDED 0x08 /* The same for group quotas */ |
342 _DQUOT_STATE_FLAGS |
|
343 }; |
|
344 #define DQUOT_USAGE_ENABLED (1 << _DQUOT_USAGE_ENABLED) |
|
345 #define DQUOT_LIMITS_ENABLED (1 << _DQUOT_LIMITS_ENABLED) |
|
346 #define DQUOT_SUSPENDED (1 << _DQUOT_SUSPENDED) |
|
347 #define DQUOT_STATE_FLAGS (DQUOT_USAGE_ENABLED | DQUOT_LIMITS_ENABLED | \ |
|
348 DQUOT_SUSPENDED) |
|
349 /* Other quota flags */ |
|
350 #define DQUOT_QUOTA_SYS_FILE (1 << 6) /* Quota file is a special |
|
351 * system file and user cannot |
|
352 * touch it. Filesystem is |
|
353 * responsible for setting |
|
354 * S_NOQUOTA, S_NOATIME flags |
|
355 */ |
|
356 #define DQUOT_NEGATIVE_USAGE (1 << 7) /* Allow negative quota usage */ |
|
357 |
|
358 static inline unsigned int dquot_state_flag(unsigned int flags, int type) |
|
359 { |
|
360 if (type == USRQUOTA) |
|
361 return flags; |
|
362 return flags << _DQUOT_STATE_FLAGS; |
|
363 } |
|
364 |
|
365 static inline unsigned int dquot_generic_flag(unsigned int flags, int type) |
|
366 { |
|
367 if (type == USRQUOTA) |
|
368 return flags; |
|
369 return flags >> _DQUOT_STATE_FLAGS; |
|
370 } |
329 |
371 |
330 struct quota_info { |
372 struct quota_info { |
331 unsigned int flags; /* Flags for diskquotas on this device */ |
373 unsigned int flags; /* Flags for diskquotas on this device */ |
332 struct mutex dqio_mutex; /* lock device while I/O in progress */ |
374 struct mutex dqio_mutex; /* lock device while I/O in progress */ |
333 struct mutex dqonoff_mutex; /* Serialize quotaon & quotaoff */ |
375 struct mutex dqonoff_mutex; /* Serialize quotaon & quotaoff */ |