|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that the above copyright notice and this paragraph are
7: * duplicated in all such forms and that any documentation,
8: * advertising materials, and other materials related to such
9: * distribution and use acknowledge that the software was developed
10: * by the University of California, Berkeley. The name of the
11: * University may not be used to endorse or promote products derived
12: * from this software without specific prior written permission.
13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16: *
17: * @(#)quota.h 7.3 (Berkeley) 6/27/88
18: */
19:
20: /*
21: * MELBOURNE DISC QUOTAS
22: *
23: * Various junk to do with various quotas (etc) imposed upon
24: * the average user (big brother finally hits UNIX).
25: *
26: * The following structure exists in core for each logged on user.
27: * It contains global junk relevant to that user's quotas.
28: *
29: * The u_quota field of each user struct contains a pointer to
30: * the quota struct relevant to the current process, this is changed
31: * by 'setuid' sys call, &/or by the Q_SETUID quota() call.
32: */
33: struct quota {
34: struct quota *q_forw, *q_back; /* hash chain, MUST be first */
35: short q_cnt; /* ref count (# processes) */
36: uid_t q_uid; /* real uid of owner */
37: int q_flags; /* struct management flags */
38: #define Q_LOCK 0x01 /* quota struct locked (for disc i/o) */
39: #define Q_WANT 0x02 /* issue a wakeup when lock goes off */
40: #define Q_NEW 0x04 /* new quota - no proc1 msg sent yet */
41: #define Q_NDQ 0x08 /* account has NO disc quota */
42: struct quota *q_freef, **q_freeb;
43: struct dquot *q_dq[NMOUNT]; /* disc quotas for mounted filesys's */
44: };
45:
46: #define NOQUOTA ((struct quota *) 0)
47:
48: #if defined(KERNEL) && defined(QUOTA)
49: struct quota *quota, *quotaNQUOTA;
50: int nquota;
51: struct quota *getquota(), *qfind();
52: #endif
53:
54: /*
55: * The following structure defines the format of the disc quota file
56: * (as it appears on disc) - the file is an array of these structures
57: * indexed by user number. The setquota sys call establishes the inode
58: * for each quota file (a pointer is retained in the mount structure).
59: *
60: * The following constants define the number of warnings given a user
61: * before the soft limits are treated as hard limits (usually resulting
62: * in an allocation failure). The warnings are normally manipulated
63: * each time a user logs in through the Q_DOWARN quota call. If
64: * the user logs in and is under the soft limit the warning count
65: * is reset to MAX_*_WARN, otherwise a message is printed and the
66: * warning count is decremented. This makes MAX_*_WARN equivalent to
67: * the number of logins before soft limits are treated as hard limits.
68: */
69: #define MAX_IQ_WARN 3
70: #define MAX_DQ_WARN 3
71:
72: struct dqblk {
73: u_long dqb_bhardlimit; /* absolute limit on disc blks alloc */
74: u_long dqb_bsoftlimit; /* preferred limit on disc blks */
75: u_long dqb_curblocks; /* current block count */
76: u_short dqb_ihardlimit; /* maximum # allocated inodes + 1 */
77: u_short dqb_isoftlimit; /* preferred inode limit */
78: u_short dqb_curinodes; /* current # allocated inodes */
79: u_char dqb_bwarn; /* # warnings left about excessive disc use */
80: u_char dqb_iwarn; /* # warnings left about excessive inodes */
81: };
82:
83: /*
84: * The following structure records disc usage for a user on a filesystem.
85: * There is one allocated for each quota that exists on any filesystem
86: * for the current user. A cache is kept of other recently used entries.
87: */
88: struct dquot {
89: struct dquot *dq_forw, *dq_back;/* MUST be first entry */
90: union {
91: struct quota *Dq_own; /* the quota that points to this */
92: struct { /* free list */
93: struct dquot *Dq_freef, **Dq_freeb;
94: } dq_f;
95: } dq_u;
96: short dq_flags;
97: #define DQ_LOCK 0x01 /* this quota locked (no MODS) */
98: #define DQ_WANT 0x02 /* wakeup on unlock */
99: #define DQ_MOD 0x04 /* this quota modified since read */
100: #define DQ_FAKE 0x08 /* no limits here, just usage */
101: #define DQ_BLKS 0x10 /* has been warned about blk limit */
102: #define DQ_INODS 0x20 /* has been warned about inode limit */
103: short dq_cnt; /* count of active references */
104: uid_t dq_uid; /* user this applies to */
105: dev_t dq_dev; /* filesystem this relates to */
106: struct dqblk dq_dqb; /* actual usage & quotas */
107: };
108:
109: #define dq_own dq_u.Dq_own
110: #define dq_freef dq_u.dq_f.Dq_freef
111: #define dq_freeb dq_u.dq_f.Dq_freeb
112: #define dq_bhardlimit dq_dqb.dqb_bhardlimit
113: #define dq_bsoftlimit dq_dqb.dqb_bsoftlimit
114: #define dq_curblocks dq_dqb.dqb_curblocks
115: #define dq_ihardlimit dq_dqb.dqb_ihardlimit
116: #define dq_isoftlimit dq_dqb.dqb_isoftlimit
117: #define dq_curinodes dq_dqb.dqb_curinodes
118: #define dq_bwarn dq_dqb.dqb_bwarn
119: #define dq_iwarn dq_dqb.dqb_iwarn
120:
121: #define NODQUOT ((struct dquot *) 0)
122: #define LOSTDQUOT ((struct dquot *) 1)
123:
124: #if defined(KERNEL) && defined(QUOTA)
125: struct dquot *dquot, *dquotNDQUOT;
126: int ndquot;
127: struct dquot *discquota(), *inoquota(), *dqalloc(), *dqp();
128: #endif
129:
130: /*
131: * Definitions for the 'quota' system call.
132: */
133: #define Q_SETDLIM 1 /* set disc limits & usage */
134: #define Q_GETDLIM 2 /* get disc limits & usage */
135: #define Q_SETDUSE 3 /* set disc usage only */
136: #define Q_SYNC 4 /* update disc copy of quota usages */
137: #define Q_SETUID 16 /* change proc to use quotas for uid */
138: #define Q_SETWARN 25 /* alter inode/block warning counts */
139: #define Q_DOWARN 26 /* warn user about excessive space/inodes */
140:
141: /*
142: * Used in Q_SETDUSE.
143: */
144: struct dqusage {
145: u_short du_curinodes;
146: u_long du_curblocks;
147: };
148:
149: /*
150: * Used in Q_SETWARN.
151: */
152: struct dqwarn {
153: u_char dw_bwarn;
154: u_char dw_iwarn;
155: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.