1/* This just represents the non-kernel parts of <linux/quota.h>.
2 *
3 * here's the corresponding copyright:
4 * Copyright (c) 1982, 1986 Regents of the University of California.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to Berkeley by
8 * Robert Elz at The University of Melbourne.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 *    notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in the
17 *    documentation and/or other materials provided with the distribution.
18 * 4. Neither the name of the University nor the names of its contributors
19 *    may be used to endorse or promote products derived from this software
20 *    without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 */
34
35#ifndef _SYS_QUOTA_H
36#define _SYS_QUOTA_H 1
37
38#include <features.h>
39#include <sys/types.h>
40
41/*
42 * Select between different incompatible quota versions.
43 * Default to the version used by Linux kernel version 2.4.22
44 * or later.  */
45#ifndef _LINUX_QUOTA_VERSION
46# define _LINUX_QUOTA_VERSION 2
47#endif
48
49/*
50 * Convert diskblocks to blocks and the other way around.
51 * currently only to fool the BSD source. :-)
52 */
53#define dbtob(num) ((num) << 10)
54#define btodb(num) ((num) >> 10)
55
56/*
57 * Convert count of filesystem blocks to diskquota blocks, meant
58 * for filesystems where i_blksize != BLOCK_SIZE
59 */
60#define fs_to_dq_blocks(num, blksize) (((num) * (blksize)) / BLOCK_SIZE)
61
62/*
63 * Definitions for disk quotas imposed on the average user
64 * (big brother finally hits Linux).
65 *
66 * The following constants define the amount of time given a user
67 * before the soft limits are treated as hard limits (usually resulting
68 * in an allocation failure). The timer is started when the user crosses
69 * their soft limit, it is reset when they go below their soft limit.
70 */
71#define MAX_IQ_TIME  604800	/* (7*24*60*60) 1 week */
72#define MAX_DQ_TIME  604800	/* (7*24*60*60) 1 week */
73
74#define MAXQUOTAS 2
75#define USRQUOTA  0		/* element used for user quotas */
76#define GRPQUOTA  1		/* element used for group quotas */
77
78/*
79 * Definitions for the default names of the quotas files.
80 */
81#define INITQFNAMES { \
82   "user",      /* USRQUOTA */ \
83   "group",   /* GRPQUOTA */ \
84   "undefined", \
85};
86
87#define QUOTAFILENAME "quota"
88#define QUOTAGROUP "staff"
89
90#define NR_DQHASH 43          /* Just an arbitrary number any suggestions ? */
91#define NR_DQUOTS 256         /* Number of quotas active at one time */
92
93/*
94 * Command definitions for the 'quotactl' system call.
95 * The commands are broken into a main command defined below
96 * and a subcommand that is used to convey the type of
97 * quota that is being manipulated (see above).
98 */
99#define SUBCMDMASK  0x00ff
100#define SUBCMDSHIFT 8
101#define QCMD(cmd, type)  (((cmd) << SUBCMDSHIFT) | ((type) & SUBCMDMASK))
102
103#if _LINUX_QUOTA_VERSION < 2
104# define Q_QUOTAON  0x0100	/* enable quotas */
105# define Q_QUOTAOFF 0x0200	/* disable quotas */
106# define Q_GETQUOTA 0x0300	/* get limits and usage */
107# define Q_SETQUOTA 0x0400	/* set limits and usage */
108# define Q_SETUSE   0x0500	/* set usage */
109# define Q_SYNC     0x0600	/* sync disk copy of a filesystems quotas */
110# define Q_SETQLIM  0x0700	/* set limits */
111# define Q_GETSTATS 0x0800	/* get collected stats */
112# define Q_RSQUASH  0x1000	/* set root_squash option */
113#else
114# define Q_SYNC     0x800001	/* sync disk copy of a filesystems quotas */
115# define Q_QUOTAON  0x800002	/* turn quotas on */
116# define Q_QUOTAOFF 0x800003	/* turn quotas off */
117# define Q_GETFMT   0x800004	/* get quota format used on given filesystem */
118# define Q_GETINFO  0x800005	/* get information about quota files */
119# define Q_SETINFO  0x800006	/* set information about quota files */
120# define Q_GETQUOTA 0x800007	/* get user quota structure */
121# define Q_SETQUOTA 0x800008	/* set user quota structure */
122#endif
123
124/*
125 * The following structure defines the format of the disk quota file
126 * (as it appears on disk) - the file is an array of these structures
127 * indexed by user or group number.
128 */
129#if _LINUX_QUOTA_VERSION < 2
130struct dqblk
131  {
132    u_int32_t dqb_bhardlimit;	/* absolute limit on disk blks alloc */
133    u_int32_t dqb_bsoftlimit;	/* preferred limit on disk blks */
134    u_int32_t dqb_curblocks;	/* current block count */
135    u_int32_t dqb_ihardlimit;	/* maximum # allocated inodes */
136    u_int32_t dqb_isoftlimit;	/* preferred inode limit */
137    u_int32_t dqb_curinodes;	/* current # allocated inodes */
138    time_t dqb_btime;		/* time limit for excessive disk use */
139    time_t dqb_itime;		/* time limit for excessive files */
140  };
141#else
142
143/* Flags that indicate which fields in dqblk structure are valid.  */
144#define QIF_BLIMITS	1
145#define QIF_SPACE	2
146#define QIF_ILIMITS	4
147#define QIF_INODES	8
148#define QIF_BTIME	16
149#define QIF_ITIME	32
150#define QIF_LIMITS	(QIF_BLIMITS | QIF_ILIMITS)
151#define QIF_USAGE	(QIF_SPACE | QIF_INODES)
152#define QIF_TIMES	(QIF_BTIME | QIF_ITIME)
153#define QIF_ALL		(QIF_LIMITS | QIF_USAGE | QIF_TIMES)
154
155struct dqblk
156  {
157    u_int64_t dqb_bhardlimit;	/* absolute limit on disk quota blocks alloc */
158    u_int64_t dqb_bsoftlimit;	/* preferred limit on disk quota blocks */
159    u_int64_t dqb_curspace;	/* current quota block count */
160    u_int64_t dqb_ihardlimit;	/* maximum # allocated inodes */
161    u_int64_t dqb_isoftlimit;	/* preferred inode limit */
162    u_int64_t dqb_curinodes;	/* current # allocated inodes */
163    u_int64_t dqb_btime;	/* time limit for excessive disk use */
164    u_int64_t dqb_itime;	/* time limit for excessive files */
165    u_int32_t dqb_valid;	/* bitmask of QIF_* constants */
166  };
167#endif
168
169/*
170 * Shorthand notation.
171 */
172#define	dq_bhardlimit	dq_dqb.dqb_bhardlimit
173#define	dq_bsoftlimit	dq_dqb.dqb_bsoftlimit
174#if _LINUX_QUOTA_VERSION < 2
175# define dq_curblocks	dq_dqb.dqb_curblocks
176#else
177# define dq_curspace	dq_dqb.dqb_curspace
178# define dq_valid	dq_dqb.dqb_valid
179#endif
180#define	dq_ihardlimit	dq_dqb.dqb_ihardlimit
181#define	dq_isoftlimit	dq_dqb.dqb_isoftlimit
182#define	dq_curinodes	dq_dqb.dqb_curinodes
183#define	dq_btime	dq_dqb.dqb_btime
184#define	dq_itime	dq_dqb.dqb_itime
185
186#define dqoff(UID)      ((loff_t)((UID) * sizeof (struct dqblk)))
187
188#if _LINUX_QUOTA_VERSION < 2
189struct dqstats
190  {
191    u_int32_t lookups;
192    u_int32_t drops;
193    u_int32_t reads;
194    u_int32_t writes;
195    u_int32_t cache_hits;
196    u_int32_t pages_allocated;
197    u_int32_t allocated_dquots;
198    u_int32_t free_dquots;
199    u_int32_t syncs;
200  };
201#else
202
203/* Flags that indicate which fields in dqinfo structure are valid.  */
204# define IIF_BGRACE	1
205# define IIF_IGRACE	2
206# define IIF_FLAGS	4
207# define IIF_ALL	(IIF_BGRACE | IIF_IGRACE | IIF_FLAGS)
208
209struct dqinfo
210  {
211    u_int64_t dqi_bgrace;
212    u_int64_t dqi_igrace;
213    u_int32_t dqi_flags;
214    u_int32_t dqi_valid;
215  };
216#endif
217
218__BEGIN_DECLS
219
220extern int quotactl (int __cmd, const char *__special, int __id,
221		     caddr_t __addr) __THROW;
222
223__END_DECLS
224
225#endif /* sys/quota.h */
226