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 * %sccs.include.redist.c%
11 *
12 * @(#)ufs_vfsops.c 8.4 (Berkeley) 04/16/94
13 */
14
15 #include <sys/param.h>
16 #include <sys/mbuf.h>
17 #include <sys/mount.h>
18 #include <sys/proc.h>
19 #include <sys/buf.h>
20 #include <sys/vnode.h>
21 #include <sys/malloc.h>
22
23 #include <miscfs/specfs/specdev.h>
24
25 #include <ufs/ufs/quota.h>
26 #include <ufs/ufs/inode.h>
27 #include <ufs/ufs/ufsmount.h>
28 #include <ufs/ufs/ufs_extern.h>
29
30 /*
31 * Flag to permit forcible unmounting.
32 */
33 int doforce = 1;
34
35 /*
36 * Make a filesystem operational.
37 * Nothing to do at the moment.
38 */
39 /* ARGSUSED */
40 int
ufs_start(mp,flags,p)41 ufs_start(mp, flags, p)
42 struct mount *mp;
43 int flags;
44 struct proc *p;
45 {
46
47 return (0);
48 }
49
50 /*
51 * Return the root of a filesystem.
52 */
53 int
ufs_root(mp,vpp)54 ufs_root(mp, vpp)
55 struct mount *mp;
56 struct vnode **vpp;
57 {
58 struct vnode *nvp;
59 int error;
60
61 if (error = VFS_VGET(mp, (ino_t)ROOTINO, &nvp))
62 return (error);
63 *vpp = nvp;
64 return (0);
65 }
66
67 /*
68 * Do operations associated with quotas
69 */
70 int
ufs_quotactl(mp,cmds,uid,arg,p)71 ufs_quotactl(mp, cmds, uid, arg, p)
72 struct mount *mp;
73 int cmds;
74 uid_t uid;
75 caddr_t arg;
76 struct proc *p;
77 {
78 int cmd, type, error;
79
80 #ifndef QUOTA
81 return (EOPNOTSUPP);
82 #else
83 if (uid == -1)
84 uid = p->p_cred->p_ruid;
85 cmd = cmds >> SUBCMDSHIFT;
86
87 switch (cmd) {
88 case Q_GETQUOTA:
89 case Q_SYNC:
90 if (uid == p->p_cred->p_ruid)
91 break;
92 /* fall through */
93 default:
94 if (error = suser(p->p_ucred, &p->p_acflag))
95 return (error);
96 }
97
98 type = cmd & SUBCMDMASK;
99 if ((u_int)type >= MAXQUOTAS)
100 return (EINVAL);
101
102 switch (cmd) {
103
104 case Q_QUOTAON:
105 return (quotaon(p, mp, type, arg));
106
107 case Q_QUOTAOFF:
108 if (vfs_busy(mp))
109 return (0);
110 error = quotaoff(p, mp, type);
111 vfs_unbusy(mp);
112 return (error);
113
114 case Q_SETQUOTA:
115 return (setquota(mp, uid, type, arg));
116
117 case Q_SETUSE:
118 return (setuse(mp, uid, type, arg));
119
120 case Q_GETQUOTA:
121 return (getquota(mp, uid, type, arg));
122
123 case Q_SYNC:
124 if (vfs_busy(mp))
125 return (0);
126 error = qsync(mp);
127 vfs_unbusy(mp);
128 return (error);
129
130 default:
131 return (EINVAL);
132 }
133 /* NOTREACHED */
134 #endif
135 }
136
137 /*
138 * This is the generic part of fhtovp called after the underlying
139 * filesystem has validated the file handle.
140 *
141 * Verify that a host should have access to a filesystem, and if so
142 * return a vnode for the presented file handle.
143 */
144 int
ufs_check_export(mp,ufhp,nam,vpp,exflagsp,credanonp)145 ufs_check_export(mp, ufhp, nam, vpp, exflagsp, credanonp)
146 register struct mount *mp;
147 struct ufid *ufhp;
148 struct mbuf *nam;
149 struct vnode **vpp;
150 int *exflagsp;
151 struct ucred **credanonp;
152 {
153 register struct inode *ip;
154 register struct netcred *np;
155 register struct ufsmount *ump = VFSTOUFS(mp);
156 struct vnode *nvp;
157 int error;
158
159 /*
160 * Get the export permission structure for this <mp, client> tuple.
161 */
162 np = vfs_export_lookup(mp, &ump->um_export, nam);
163 if (np == NULL)
164 return (EACCES);
165
166 if (error = VFS_VGET(mp, ufhp->ufid_ino, &nvp)) {
167 *vpp = NULLVP;
168 return (error);
169 }
170 ip = VTOI(nvp);
171 if (ip->i_mode == 0 || ip->i_gen != ufhp->ufid_gen) {
172 vput(nvp);
173 *vpp = NULLVP;
174 return (ESTALE);
175 }
176 *vpp = nvp;
177 *exflagsp = np->netc_exflags;
178 *credanonp = &np->netc_anon;
179 return (0);
180 }
181