]> git.saurik.com Git - apple/xnu.git/blob - bsd/ufs/ufs/ufs_vfsops.c
01f08379141dfc3109c3169cd907a5a4c0fd4567
[apple/xnu.git] / bsd / ufs / ufs / ufs_vfsops.c
1 /*
2 * Copyright (c) 2006 Apple Computer, Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_OSREFERENCE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the
10 * License may not be used to create, or enable the creation or
11 * redistribution of, unlawful or unlicensed copies of an Apple operating
12 * system, or to circumvent, violate, or enable the circumvention or
13 * violation of, any terms of an Apple operating system software license
14 * agreement.
15 *
16 * Please obtain a copy of the License at
17 * http://www.opensource.apple.com/apsl/ and read it before using this
18 * file.
19 *
20 * The Original Code and all software distributed under the License are
21 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
22 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
23 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
24 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
25 * Please see the License for the specific language governing rights and
26 * limitations under the License.
27 *
28 * @APPLE_LICENSE_OSREFERENCE_HEADER_END@
29 */
30 /* Copyright (c) 1995 NeXT Computer, Inc. All Rights Reserved */
31 /*
32 * Copyright (c) 1991, 1993, 1994
33 * The Regents of the University of California. All rights reserved.
34 * (c) UNIX System Laboratories, Inc.
35 * All or some portions of this file are derived from material licensed
36 * to the University of California by American Telephone and Telegraph
37 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
38 * the permission of UNIX System Laboratories, Inc.
39 *
40 * Redistribution and use in source and binary forms, with or without
41 * modification, are permitted provided that the following conditions
42 * are met:
43 * 1. Redistributions of source code must retain the above copyright
44 * notice, this list of conditions and the following disclaimer.
45 * 2. Redistributions in binary form must reproduce the above copyright
46 * notice, this list of conditions and the following disclaimer in the
47 * documentation and/or other materials provided with the distribution.
48 * 3. All advertising materials mentioning features or use of this software
49 * must display the following acknowledgement:
50 * This product includes software developed by the University of
51 * California, Berkeley and its contributors.
52 * 4. Neither the name of the University nor the names of its contributors
53 * may be used to endorse or promote products derived from this software
54 * without specific prior written permission.
55 *
56 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
57 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
58 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
59 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
60 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
61 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
62 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
63 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
64 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
65 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
66 * SUCH DAMAGE.
67 *
68 * @(#)ufs_vfsops.c 8.8 (Berkeley) 5/20/95
69 */
70
71 #include <sys/param.h>
72 #include <sys/mbuf.h>
73 #include <sys/mount_internal.h>
74 #include <sys/proc.h>
75 #include <sys/vnode_internal.h>
76 #include <sys/malloc.h>
77 #include <sys/quota.h>
78
79 #include <miscfs/specfs/specdev.h>
80
81 #include <ufs/ufs/quota.h>
82 #include <ufs/ufs/inode.h>
83 #include <ufs/ufs/ufsmount.h>
84 #include <ufs/ufs/ufs_extern.h>
85
86 /*
87 * Make a filesystem operational.
88 * Nothing to do at the moment.
89 */
90 /* ARGSUSED */
91 int
92 ufs_start(mp, flags, context)
93 struct mount *mp;
94 int flags;
95 vfs_context_t context;
96 {
97
98 return (0);
99 }
100
101 /*
102 * Return the root of a filesystem.
103 */
104 int
105 ufs_root(mp, vpp, context)
106 struct mount *mp;
107 struct vnode **vpp;
108 vfs_context_t context;
109 {
110 struct vnode *nvp;
111 int error;
112
113 if (error = VFS_VGET(mp, (ino64_t)ROOTINO, &nvp, context))
114 return (error);
115 *vpp = nvp;
116 return (0);
117 }
118
119 /*
120 * Do operations associated with quotas
121 */
122 int
123 ufs_quotactl(mp, cmds, uid, datap, context)
124 struct mount *mp;
125 int cmds;
126 uid_t uid;
127 caddr_t datap;
128 vfs_context_t context;
129 {
130 struct proc *p = vfs_context_proc(context);
131 int cmd, type, error;
132
133 #if !QUOTA
134 return (ENOTSUP);
135 #else
136 if (uid == -1)
137 uid = vfs_context_ucred(context)->cr_ruid;
138 cmd = cmds >> SUBCMDSHIFT;
139
140 switch (cmd) {
141 case Q_SYNC:
142 case Q_QUOTASTAT:
143 break;
144 case Q_GETQUOTA:
145 if (uid == vfs_context_ucred(context)->cr_ruid)
146 break;
147 /* fall through */
148 default:
149 if (error = vfs_context_suser(context))
150 return (error);
151 }
152
153 type = cmds & SUBCMDMASK;
154 if ((u_int)type >= MAXQUOTAS)
155 return (EINVAL);
156 if (vfs_busy(mp, LK_NOWAIT))
157 return (0);
158
159 switch (cmd) {
160
161 case Q_QUOTAON:
162 error = quotaon(context, mp, type, datap);
163 break;
164
165 case Q_QUOTAOFF:
166 error = quotaoff(mp, type);
167 break;
168
169 case Q_SETQUOTA:
170 error = setquota(mp, uid, type, datap);
171 break;
172
173 case Q_SETUSE:
174 error = setuse(mp, uid, type, datap);
175 break;
176
177 case Q_GETQUOTA:
178 error = getquota(mp, uid, type, datap);
179 break;
180
181 case Q_SYNC:
182 error = qsync(mp);
183 break;
184
185 case Q_QUOTASTAT:
186 error = quotastat(mp, type, datap);
187 break;
188
189 default:
190 error = EINVAL;
191 break;
192 }
193 vfs_unbusy(mp);
194
195 return (error);
196 #endif
197 }
198
199 /*
200 * Initial UFS filesystems, done only once.
201 */
202 int
203 ufs_init(vfsp)
204 struct vfsconf *vfsp;
205 {
206 static int done;
207
208 if (done)
209 return (0);
210 done = 1;
211 ufs_ihashinit();
212 #if QUOTA
213 dqinit();
214 #endif
215 return (0);
216 }
217