xref: /original-bsd/sys/ufs/ufs/quota.h (revision 873c056c)
127acac22Smckusick /*
2209d2ae0Smckusick  * Copyright (c) 1982, 1986 Regents of the University of California.
38610d286Sbostic  * All rights reserved.
427acac22Smckusick  *
54d67415cSmckusick  * This code is derived from software contributed to Berkeley by
64d67415cSmckusick  * Robert Elz at The University of Melbourne.
74d67415cSmckusick  *
888f5dc9aSbostic  * %sccs.include.redist.c%
98610d286Sbostic  *
10*873c056cSdonn  *	@(#)quota.h	7.9 (Berkeley) 02/22/91
1127acac22Smckusick  */
122debeb82Skre 
133c1ddcbeSmckusick #ifndef _QUOTA_
143c1ddcbeSmckusick #define _QUOTA_
153c1ddcbeSmckusick 
162debeb82Skre /*
174d67415cSmckusick  * Definitions for disk quotas imposed on the average user
184d67415cSmckusick  * (big brother finally hits UNIX).
192debeb82Skre  *
204d67415cSmckusick  * The following constants define the amount of time given a user
214d67415cSmckusick  * before the soft limits are treated as hard limits (usually resulting
224d67415cSmckusick  * in an allocation failure). The timer is started when the user crosses
234d67415cSmckusick  * their soft limit, it is reset when they go below their soft limit.
242debeb82Skre  */
254d67415cSmckusick #define	MAX_IQ_TIME	(7*24*60*60)	/* 1 week */
264d67415cSmckusick #define	MAX_DQ_TIME	(7*24*60*60)	/* 1 week */
274d67415cSmckusick 
284d67415cSmckusick /*
294d67415cSmckusick  * The following constants define the usage of the quota file array
304d67415cSmckusick  * in the ufsmount structure and dquot array in the inode structure.
314d67415cSmckusick  * The semantics of the elements of these arrays are defined in the
324d67415cSmckusick  * routine getinoquota; the remainder of the quota code treats them
334d67415cSmckusick  * generically and need not be inspected when changing the size of
344d67415cSmckusick  * the array.
354d67415cSmckusick  */
364d67415cSmckusick #define	MAXQUOTAS	2
374d67415cSmckusick #define	USRQUOTA	0	/* element used for user quotas */
384d67415cSmckusick #define	GRPQUOTA	1	/* element used for group quotas */
394d67415cSmckusick 
404d67415cSmckusick /*
414d67415cSmckusick  * Definitions for the default names of the quotas files.
424d67415cSmckusick  */
434d67415cSmckusick #define INITQFNAMES { \
444d67415cSmckusick 	"user",		/* USRQUOTA */ \
454d67415cSmckusick 	"group",	/* GRPQUOTA */ \
464d67415cSmckusick 	"undefined", \
472debeb82Skre };
4881159eacSmckusick #define QUOTAFILENAME "quota"
4981159eacSmckusick #define QUOTAGROUP "operator"
502debeb82Skre 
512debeb82Skre /*
524d67415cSmckusick  * Command definitions for the 'quotactl' system call.
534d67415cSmckusick  * The commands are broken into a main command defined below
544d67415cSmckusick  * and a subcommand that is used to convey the type of
554d67415cSmckusick  * quota that is being manipulated (see above).
562debeb82Skre  */
574d67415cSmckusick #define SUBCMDMASK	0x00ff
584d67415cSmckusick #define SUBCMDSHIFT	8
594d67415cSmckusick #define	QCMD(cmd, type)	(((cmd) << SUBCMDSHIFT) | ((type) & SUBCMDMASK))
602debeb82Skre 
614d67415cSmckusick #define	Q_QUOTAON	0x0100	/* enable quotas */
624d67415cSmckusick #define	Q_QUOTAOFF	0x0200	/* disable quotas */
634d67415cSmckusick #define	Q_GETQUOTA	0x0300	/* get limits and usage */
644d67415cSmckusick #define	Q_SETQUOTA	0x0400	/* set limits and usage */
654d67415cSmckusick #define	Q_SETUSE	0x0500	/* set usage */
664d67415cSmckusick #define	Q_SYNC		0x0600	/* sync disk copy of a filesystems quotas */
672debeb82Skre 
682debeb82Skre /*
694d67415cSmckusick  * The following structure defines the format of the disk quota file
704d67415cSmckusick  * (as it appears on disk) - the file is an array of these structures
714d67415cSmckusick  * indexed by user or group number.  The setquota system call establishes
724d67415cSmckusick  * the vnode for each quota file (a pointer is retained in the ufsmount
734d67415cSmckusick  * structure).
744d67415cSmckusick  */
754d67415cSmckusick struct	dqblk {
764d67415cSmckusick 	u_long	dqb_bhardlimit;	/* absolute limit on disk blks alloc */
774d67415cSmckusick 	u_long	dqb_bsoftlimit;	/* preferred limit on disk blks */
784d67415cSmckusick 	u_long	dqb_curblocks;	/* current block count */
794d67415cSmckusick 	u_long	dqb_ihardlimit;	/* maximum # allocated inodes + 1 */
804d67415cSmckusick 	u_long	dqb_isoftlimit;	/* preferred inode limit */
814d67415cSmckusick 	u_long	dqb_curinodes;	/* current # allocated inodes */
824d67415cSmckusick 	time_t	dqb_btime;	/* time limit for excessive disk use */
834d67415cSmckusick 	time_t	dqb_itime;	/* time limit for excessive files */
844d67415cSmckusick };
854d67415cSmckusick 
864d67415cSmckusick #ifdef KERNEL
874d67415cSmckusick /*
884d67415cSmckusick  * The following structure records disk usage for a user or group on a
894d67415cSmckusick  * filesystem. There is one allocated for each quota that exists on any
904d67415cSmckusick  * filesystem for the current user or group. A cache is kept of recently
914d67415cSmckusick  * used entries.
922debeb82Skre  */
932debeb82Skre struct	dquot {
94a48ca1d2Ssam 	struct	dquot *dq_forw, *dq_back;/* MUST be first entry */
954d67415cSmckusick 	struct	dquot *dq_freef, **dq_freeb; /* free list */
964d67415cSmckusick 	short	dq_flags;		/* flags, see below */
974d67415cSmckusick 	short	dq_cnt;			/* count of active references */
984d67415cSmckusick 	short	dq_spare;		/* unused spare padding */
994d67415cSmckusick 	short	dq_type;		/* quota type of this dquot */
1004d67415cSmckusick 	u_long	dq_id;			/* identifier this applies to */
1014d67415cSmckusick 	struct	ufsmount *dq_ump;	/* filesystem that this is taken from */
1024d67415cSmckusick 	struct	dqblk dq_dqb;		/* actual usage & quotas */
1034d67415cSmckusick };
1044d67415cSmckusick /*
1054d67415cSmckusick  * Flag values.
1064d67415cSmckusick  */
107a48ca1d2Ssam #define	DQ_LOCK		0x01		/* this quota locked (no MODS) */
108a48ca1d2Ssam #define	DQ_WANT		0x02		/* wakeup on unlock */
109a48ca1d2Ssam #define	DQ_MOD		0x04		/* this quota modified since read */
110a48ca1d2Ssam #define	DQ_FAKE		0x08		/* no limits here, just usage */
111a48ca1d2Ssam #define	DQ_BLKS		0x10		/* has been warned about blk limit */
112a48ca1d2Ssam #define	DQ_INODS	0x20		/* has been warned about inode limit */
1134d67415cSmckusick /*
1144d67415cSmckusick  * Shorthand notation.
1154d67415cSmckusick  */
116ffdbd733Ssam #define	dq_bhardlimit	dq_dqb.dqb_bhardlimit
117ffdbd733Ssam #define	dq_bsoftlimit	dq_dqb.dqb_bsoftlimit
118ffdbd733Ssam #define	dq_curblocks	dq_dqb.dqb_curblocks
119ffdbd733Ssam #define	dq_ihardlimit	dq_dqb.dqb_ihardlimit
120ffdbd733Ssam #define	dq_isoftlimit	dq_dqb.dqb_isoftlimit
121ffdbd733Ssam #define	dq_curinodes	dq_dqb.dqb_curinodes
1224d67415cSmckusick #define	dq_btime	dq_dqb.dqb_btime
1234d67415cSmckusick #define	dq_itime	dq_dqb.dqb_itime
124ffdbd733Ssam 
1254d67415cSmckusick /*
1264d67415cSmckusick  * If the system has never checked for a quota for this file,
1274d67415cSmckusick  * then it is set to NODQUOT. Once a write attempt is made
1284d67415cSmckusick  * the inode pointer is set to reference a dquot structure.
1294d67415cSmckusick  */
1302debeb82Skre #define	NODQUOT		((struct dquot *) 0)
1312debeb82Skre 
1322debeb82Skre /*
1334d67415cSmckusick  * Flags to chkdq() and chkiq()
1342debeb82Skre  */
1354d67415cSmckusick #define	FORCE	0x01	/* force usage changes independent of limits */
1364d67415cSmckusick #define	CHOWN	0x02	/* (advisory) change initiated by chown */
137ffdbd733Ssam 
138ffdbd733Ssam /*
1394d67415cSmckusick  * Macros to avoid subroutine calls to trivial functions.
140ffdbd733Ssam  */
1414d67415cSmckusick #ifndef DIAGNOSTIC
1424d67415cSmckusick #define	DQREF(dq)	(dq)->dq_cnt++
1434d67415cSmckusick #else
1444d67415cSmckusick #define	DQREF(dq)	dqref(dq)
1454d67415cSmckusick #endif /* DIAGNOSTIC */
146*873c056cSdonn 
147*873c056cSdonn #else
148*873c056cSdonn 
149*873c056cSdonn #include <sys/cdefs.h>
150*873c056cSdonn 
151*873c056cSdonn __BEGIN_DECLS
152*873c056cSdonn int	quotactl __P((const char *, int, int, void *));
153*873c056cSdonn __END_DECLS
154*873c056cSdonn 
1554d67415cSmckusick #endif /* KERNEL */
1563c1ddcbeSmckusick #endif /* _QUOTA_ */
157