xref: /original-bsd/sys/ufs/ffs/quota.h (revision c02b9ad6)
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) 06/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 };
156