proc->thread stage 4: rework the VFS and DEVICE subsystems to take thread
[dragonfly.git] / sys / vfs / ufs / ufs_vfsops.c
CommitLineData
984263bc
MD
1/*
2 * Copyright (c) 1991, 1993, 1994
3 * The Regents of the University of California. All rights reserved.
4 * (c) UNIX System Laboratories, Inc.
5 * All or some portions of this file are derived from material licensed
6 * to the University of California by American Telephone and Telegraph
7 * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8 * the permission of UNIX System Laboratories, Inc.
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. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the University of
21 * California, Berkeley and its contributors.
22 * 4. Neither the name of the University nor the names of its contributors
23 * may be used to endorse or promote products derived from this software
24 * without specific prior written permission.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36 * SUCH DAMAGE.
37 *
38 * @(#)ufs_vfsops.c 8.8 (Berkeley) 5/20/95
39 * $FreeBSD: src/sys/ufs/ufs/ufs_vfsops.c,v 1.17.2.3 2001/10/14 19:08:16 iedowse Exp $
dadab5e9 40 * $DragonFly: src/sys/vfs/ufs/ufs_vfsops.c,v 1.3 2003/06/25 03:56:12 dillon Exp $
984263bc
MD
41 */
42
43#include "opt_quota.h"
44
45#include <sys/param.h>
46#include <sys/kernel.h>
47#include <sys/mount.h>
48#include <sys/proc.h>
49#include <sys/malloc.h>
50#include <sys/vnode.h>
51
52#include <ufs/ufs/quota.h>
53#include <ufs/ufs/inode.h>
54#include <ufs/ufs/ufsmount.h>
55#include <ufs/ufs/ufs_extern.h>
56
57MALLOC_DEFINE(M_UFSMNT, "UFS mount", "UFS mount structure");
58/*
59 * Make a filesystem operational.
60 * Nothing to do at the moment.
61 */
62/* ARGSUSED */
63int
dadab5e9 64ufs_start(struct mount *mp, int flags, struct thread *td)
984263bc 65{
984263bc
MD
66 return (0);
67}
68
69/*
70 * Return the root of a filesystem.
71 */
72int
73ufs_root(mp, vpp)
74 struct mount *mp;
75 struct vnode **vpp;
76{
77 struct vnode *nvp;
78 int error;
79
80 error = VFS_VGET(mp, (ino_t)ROOTINO, &nvp);
81 if (error)
82 return (error);
83 *vpp = nvp;
84 return (0);
85}
86
87/*
88 * Do operations associated with quotas
89 */
90int
dadab5e9 91ufs_quotactl(mp, cmds, uid, arg, td)
984263bc
MD
92 struct mount *mp;
93 int cmds;
94 uid_t uid;
95 caddr_t arg;
dadab5e9 96 struct thread *td;
984263bc
MD
97{
98#ifndef QUOTA
99 return (EOPNOTSUPP);
100#else
dadab5e9 101 struct proc *p = td->td_proc;
984263bc
MD
102 int cmd, type, error;
103
dadab5e9
MD
104 if (p == NULL)
105 return (EOPNOTSUPP);
106
984263bc 107 if (uid == -1)
dadab5e9 108 uid = p->p_ucred->cr_ruid;
984263bc
MD
109 cmd = cmds >> SUBCMDSHIFT;
110
111 switch (cmd) {
112 case Q_SYNC:
113 break;
114 case Q_GETQUOTA:
dadab5e9 115 if (uid == p->p_ucred->cr_ruid)
984263bc
MD
116 break;
117 /* fall through */
118 default:
dadab5e9 119 if ((error = suser_cred(p->p_ucred, PRISON_ROOT)) != 0)
984263bc
MD
120 return (error);
121 }
122
123 type = cmds & SUBCMDMASK;
124 if ((u_int)type >= MAXQUOTAS)
125 return (EINVAL);
dadab5e9 126 if (vfs_busy(mp, LK_NOWAIT, 0, td))
984263bc
MD
127 return (0);
128
129 switch (cmd) {
130
131 case Q_QUOTAON:
dadab5e9 132 error = quotaon(td, mp, type, arg);
984263bc
MD
133 break;
134
135 case Q_QUOTAOFF:
dadab5e9 136 error = quotaoff(td, mp, type);
984263bc
MD
137 break;
138
139 case Q_SETQUOTA:
140 error = setquota(mp, uid, type, arg);
141 break;
142
143 case Q_SETUSE:
144 error = setuse(mp, uid, type, arg);
145 break;
146
147 case Q_GETQUOTA:
148 error = getquota(mp, uid, type, arg);
149 break;
150
151 case Q_SYNC:
152 error = qsync(mp);
153 break;
154
155 default:
156 error = EINVAL;
157 break;
158 }
dadab5e9 159 vfs_unbusy(mp, td);
984263bc
MD
160 return (error);
161#endif
162}
163
164/*
165 * Initial UFS filesystems, done only once.
166 */
167int
168ufs_init(vfsp)
169 struct vfsconf *vfsp;
170{
171 static int done;
172
173 if (done)
174 return (0);
175 done = 1;
176 ufs_ihashinit();
177#ifdef QUOTA
178 dqinit();
179#endif
180 return (0);
181}
182
183/*
184 * This is the generic part of fhtovp called after the underlying
185 * filesystem has validated the file handle.
186 *
187 * Call the VFS_CHECKEXP beforehand to verify access.
188 */
189int
190ufs_fhtovp(mp, ufhp, vpp)
191 register struct mount *mp;
192 struct ufid *ufhp;
193 struct vnode **vpp;
194{
195 register struct inode *ip;
196 struct vnode *nvp;
197 int error;
198
199 error = VFS_VGET(mp, ufhp->ufid_ino, &nvp);
200 if (error) {
201 *vpp = NULLVP;
202 return (error);
203 }
204 ip = VTOI(nvp);
205 if (ip->i_mode == 0 ||
206 ip->i_gen != ufhp->ufid_gen ||
207 (VFSTOUFS(mp)->um_i_effnlink_valid ? ip->i_effnlink :
208 ip->i_nlink) <= 0) {
209 vput(nvp);
210 *vpp = NULLVP;
211 return (ESTALE);
212 }
213 *vpp = nvp;
214 return (0);
215}
216
217
218/*
219 * This is the generic part of fhtovp called after the underlying
220 * filesystem has validated the file handle.
221 *
222 * Verify that a host should have access to a filesystem.
223 */
224int
225ufs_check_export(mp, nam, exflagsp, credanonp)
226 register struct mount *mp;
227 struct sockaddr *nam;
228 int *exflagsp;
229 struct ucred **credanonp;
230{
231 register struct netcred *np;
232 register struct ufsmount *ump;;
233
234 ump = VFSTOUFS(mp);
235 /*
236 * Get the export permission structure for this <mp, client> tuple.
237 */
238 np = vfs_export_lookup(mp, &ump->um_export, nam);
239 if (np == NULL)
240 return (EACCES);
241
242 *exflagsp = np->netc_exflags;
243 *credanonp = &np->netc_anon;
244 return (0);
245}