1 | /* $NetBSD: ufs_quota.h,v 1.22 2014/06/28 22:27:51 dholland Exp $ */ |
2 | |
3 | /* |
4 | * Copyright (c) 1982, 1986, 1990, 1993, 1995 |
5 | * The Regents of the University of California. 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 | * 3. 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 | * @(#)ufs_quota.c 8.5 (Berkeley) 5/20/95 |
35 | */ |
36 | #include <ufs/ufs/quota1.h> |
37 | #include <ufs/ufs/quota2.h> |
38 | |
39 | struct quotakcursor; /* from <sys/quotactl.h> */ |
40 | |
41 | |
42 | /* link to this quota in the quota inode (for QUOTA2) */ |
43 | struct dq2_desc { |
44 | uint64_t dq2_lblkno; /* logical disk block holding this quota */ |
45 | u_int dq2_blkoff; /* offset in disk block holding this quota */ |
46 | }; |
47 | |
48 | /* |
49 | * The following structure records disk usage for a user or group on a |
50 | * filesystem. There is one allocated for each quota that exists on any |
51 | * filesystem for the current user or group. A cache is kept of recently |
52 | * used entries. |
53 | * Field markings and the corresponding locks: |
54 | * h: dqlock |
55 | * d: dq_interlock |
56 | * |
57 | * Lock order is: dq_interlock -> dqlock |
58 | * dq_interlock -> dqvp |
59 | */ |
60 | struct dquot { |
61 | LIST_ENTRY(dquot) dq_hash; /* h: hash list */ |
62 | u_int16_t dq_flags; /* d: flags, see below */ |
63 | u_int16_t dq_type; /* d: quota type of this dquot */ |
64 | u_int32_t dq_cnt; /* h: count of active references */ |
65 | u_int32_t dq_id; /* d: identifier this applies to */ |
66 | struct ufsmount *dq_ump; /* d: filesystem this is taken from */ |
67 | kmutex_t dq_interlock; /* d: lock this dquot */ |
68 | union { |
69 | struct dqblk dq1_dqb; /* d: actual usage & quotas */ |
70 | struct dq2_desc dq2_desc; /* d: pointer to quota data */ |
71 | } dq_un; |
72 | }; |
73 | |
74 | /* |
75 | * Flag values. |
76 | */ |
77 | #define DQ_MOD 0x04 /* this quota modified since read */ |
78 | #define DQ_FAKE 0x08 /* no limits here, just usage */ |
79 | #define DQ_WARN(ltype) (0x10 << ltype) /* has been warned about "type" limit */ |
80 | /* |
81 | * Shorthand notation. |
82 | */ |
83 | #define dq_bhardlimit dq_un.dq1_dqb.dqb_bhardlimit |
84 | #define dq_bsoftlimit dq_un.dq1_dqb.dqb_bsoftlimit |
85 | #define dq_curblocks dq_un.dq1_dqb.dqb_curblocks |
86 | #define dq_ihardlimit dq_un.dq1_dqb.dqb_ihardlimit |
87 | #define dq_isoftlimit dq_un.dq1_dqb.dqb_isoftlimit |
88 | #define dq_curinodes dq_un.dq1_dqb.dqb_curinodes |
89 | #define dq_btime dq_un.dq1_dqb.dqb_btime |
90 | #define dq_itime dq_un.dq1_dqb.dqb_itime |
91 | |
92 | #define dq2_lblkno dq_un.dq2_desc.dq2_lblkno |
93 | #define dq2_blkoff dq_un.dq2_desc.dq2_blkoff |
94 | /* |
95 | * If the system has never checked for a quota for this file, then it is |
96 | * set to NODQUOT. Once a write attempt is made the inode pointer is set |
97 | * to reference a dquot structure. |
98 | */ |
99 | #define NODQUOT NULL |
100 | |
101 | extern kmutex_t dqlock; |
102 | extern kcondvar_t dqcv; |
103 | /* |
104 | * Quota name to error message mapping. |
105 | */ |
106 | extern const char *quotatypes[MAXQUOTAS]; |
107 | |
108 | int getinoquota(struct inode *); |
109 | int dqget(struct vnode *, u_long, struct ufsmount *, int, struct dquot **); |
110 | void dqref(struct dquot *); |
111 | void dqrele(struct vnode *, struct dquot *); |
112 | void dqflush(struct vnode *); |
113 | |
114 | int chkdq1(struct inode *, int64_t, kauth_cred_t, int); |
115 | int chkiq1(struct inode *, int32_t, kauth_cred_t, int); |
116 | int q1sync(struct mount *); |
117 | int dq1get(struct vnode *, u_long, struct ufsmount *, int, struct dquot *); |
118 | int dq1sync(struct vnode *, struct dquot *); |
119 | int quota1_handle_cmd_get(struct ufsmount *, const struct quotakey *, |
120 | struct quotaval *); |
121 | int quota1_handle_cmd_put(struct ufsmount *, const struct quotakey *, |
122 | const struct quotaval *); |
123 | int quota1_handle_cmd_quotaon(struct lwp *, struct ufsmount *, int, |
124 | const char *); |
125 | int quota1_handle_cmd_quotaoff(struct lwp *, struct ufsmount *, int); |
126 | |
127 | int chkdq2(struct inode *, int64_t, kauth_cred_t, int); |
128 | int chkiq2(struct inode *, int32_t, kauth_cred_t, int); |
129 | int quota2_handle_cmd_get(struct ufsmount *, const struct quotakey *, |
130 | struct quotaval *); |
131 | int quota2_handle_cmd_put(struct ufsmount *, const struct quotakey *, |
132 | const struct quotaval *); |
133 | int quota2_handle_cmd_del(struct ufsmount *, const struct quotakey *); |
134 | int quota2_handle_cmd_cursorget(struct ufsmount *, struct quotakcursor *, |
135 | struct quotakey *, struct quotaval *, unsigned, unsigned *); |
136 | int quota2_handle_cmd_cursoropen(struct ufsmount *, struct quotakcursor *); |
137 | int quota2_handle_cmd_cursorclose(struct ufsmount *, struct quotakcursor *); |
138 | int quota2_handle_cmd_cursorskipidtype(struct ufsmount *, struct quotakcursor *, |
139 | int); |
140 | int quota2_handle_cmd_cursoratend(struct ufsmount *, struct quotakcursor *, |
141 | int *); |
142 | int quota2_handle_cmd_cursorrewind(struct ufsmount *, struct quotakcursor *); |
143 | int q2sync(struct mount *); |
144 | int dq2get(struct vnode *, u_long, struct ufsmount *, int, struct dquot *); |
145 | int dq2sync(struct vnode *, struct dquot *); |
146 | |