xref: /openbsd/sys/ufs/ufs/quota.h (revision bffcd9bd)
1 /*	$OpenBSD: quota.h,v 1.12 2013/07/03 04:58:40 guenther Exp $	*/
2 /*	$NetBSD: quota.h,v 1.6 1995/03/26 20:38:17 jtc Exp $	*/
3 
4 /*
5  * Copyright (c) 1982, 1986, 1993
6  *	The Regents of the University of California.  All rights reserved.
7  *
8  * This code is derived from software contributed to Berkeley by
9  * Robert Elz at The University of Melbourne.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. Neither the name of the University nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  *
35  *	@(#)quota.h	8.3 (Berkeley) 8/19/94
36  */
37 
38 #ifndef _QUOTA_
39 #define _QUOTA_
40 
41 /*
42  * Definitions for disk quotas imposed on the average user
43  * (big brother finally hits UNIX).
44  *
45  * The following constants define the amount of time given a user before the
46  * soft limits are treated as hard limits (usually resulting in an allocation
47  * failure). The timer is started when the user crosses their soft limit, it
48  * is reset when they go below their soft limit.
49  */
50 #define	MAX_IQ_TIME	(7*24*60*60)	/* seconds in 1 week */
51 #define	MAX_DQ_TIME	(7*24*60*60)	/* seconds in 1 week */
52 
53 /*
54  * The following constants define the usage of the quota file array in the
55  * ufsmount structure and dquot array in the inode structure.  The semantics
56  * of the elements of these arrays are defined in the routine getinoquota;
57  * the remainder of the quota code treats them generically and need not be
58  * inspected when changing the size of the array.
59  */
60 #define	MAXQUOTAS	2
61 #define	USRQUOTA	0	/* element used for user quotas */
62 #define	GRPQUOTA	1	/* element used for group quotas */
63 
64 /*
65  * Definitions for the default names of the quotas files.
66  */
67 #define INITQFNAMES { \
68 	"user",		/* USRQUOTA */ \
69 	"group",	/* GRPQUOTA */ \
70 	"undefined", \
71 }
72 #define	QUOTAFILENAME	"quota"
73 #define	QUOTAGROUP	"operator"
74 
75 /*
76  * Command definitions for the 'quotactl' system call.  The commands are
77  * broken into a main command defined below and a subcommand that is used
78  * to convey the type of quota that is being manipulated (see above).
79  */
80 #define SUBCMDMASK	0x00ff
81 #define SUBCMDSHIFT	8
82 #define	QCMD(cmd, type)	(((cmd) << SUBCMDSHIFT) | ((type) & SUBCMDMASK))
83 
84 #define	Q_QUOTAON	0x0100	/* enable quotas */
85 #define	Q_QUOTAOFF	0x0200	/* disable quotas */
86 #define	Q_GETQUOTA	0x0300	/* get limits and usage */
87 #define	Q_SETQUOTA	0x0400	/* set limits and usage */
88 #define	Q_SETUSE	0x0500	/* set usage */
89 #define	Q_SYNC		0x0600	/* sync disk copy of a filesystems quotas */
90 
91 /*
92  * The following structure defines the format of the disk quota file
93  * (as it appears on disk) - the file is an array of these structures
94  * indexed by user or group number.  The setquota system call establishes
95  * the vnode for each quota file (a pointer is retained in the ufsmount
96  * structure).
97  */
98 struct dqblk {
99 	u_int32_t dqb_bhardlimit;	/* absolute limit on disk blks alloc */
100 	u_int32_t dqb_bsoftlimit;	/* preferred limit on disk blks */
101 	u_int32_t dqb_curblocks;	/* current block count */
102 	u_int32_t dqb_ihardlimit;	/* maximum # allocated inodes + 1 */
103 	u_int32_t dqb_isoftlimit;	/* preferred inode limit */
104 	u_int32_t dqb_curinodes;	/* current # allocated inodes */
105 					/* XXX 2038 */
106 	u_int32_t dqb_btime;		/* time limit for excessive disk use */
107 	u_int32_t dqb_itime;		/* time limit for excessive files */
108 };
109 
110 #ifdef _KERNEL
111 /*
112  * Flags to ufs_quota_{alloc,free}_{blocks,inode}2
113  */
114 enum ufs_quota_flags {
115 	UFS_QUOTA_NOUID = 0x1,		/* Don't change UID quota */
116 	UFS_QUOTA_NOGID = 0x2,		/* Don't change GID quota */
117 	UFS_QUOTA_FORCE = 0x1000	/* don't check limits - just change it */
118 };     /* Change GID */
119 
120 struct dquot;
121 struct inode;
122 struct mount;
123 struct proc;
124 struct ucred;
125 struct ufsmount;
126 struct vnode;
127 __BEGIN_DECLS
128 #define ufs_quota_alloc_blocks(i, c, cr) ufs_quota_alloc_blocks2(i, c, cr, 0)
129 #define ufs_quota_free_blocks(i, c, cr) ufs_quota_free_blocks2(i, c, cr, 0)
130 #define ufs_quota_alloc_inode(i, cr) ufs_quota_alloc_inode2(i, cr, 0)
131 #define ufs_quota_free_inode(i, cr) ufs_quota_free_inode2(i, cr, 0)
132 int     ufs_quota_alloc_blocks2(struct inode *, daddr_t, struct ucred *, enum ufs_quota_flags);
133 int     ufs_quota_free_blocks2(struct inode *, daddr_t, struct ucred *, enum ufs_quota_flags);
134 int     ufs_quota_alloc_inode2(struct inode *, struct ucred *, enum ufs_quota_flags);
135 int     ufs_quota_free_inode2(struct inode *, struct ucred *, enum ufs_quota_flags);
136 
137 int     ufs_quota_delete(struct inode *);
138 
139 int	getinoquota(struct inode *);
140 int	quotaoff(struct proc *, struct mount *, int);
141 int	qsync(struct mount *mp);
142 int	ufs_quotactl(struct mount *, int, uid_t, caddr_t, struct proc *);
143 
144 void    ufs_quota_init(void);
145 
146 __END_DECLS
147 #endif /* _KERNEL */
148 
149 #endif /* _QUOTA_ */
150