1e7e6dff2Smckusick /*
2*8f7f61bfSbostic * Copyright (c) 1991, 1993, 1994
376403e9cSbostic * The Regents of the University of California. All rights reserved.
4a257ce37Sbostic * (c) UNIX System Laboratories, Inc.
5a257ce37Sbostic * All or some portions of this file are derived from material licensed
6a257ce37Sbostic * to the University of California by American Telephone and Telegraph
7a257ce37Sbostic * Co. or Unix System Laboratories, Inc. and are reproduced herein with
8a257ce37Sbostic * the permission of UNIX System Laboratories, Inc.
9e7e6dff2Smckusick *
108eb14236Sbostic * %sccs.include.redist.c%
11065083aeSmckusick *
12*8f7f61bfSbostic * @(#)ufs_vfsops.c 8.4 (Berkeley) 04/16/94
13e7e6dff2Smckusick */
14070444a7Ssam
1567200880Sbostic #include <sys/param.h>
16b13f5a2fSmckusick #include <sys/mbuf.h>
1767200880Sbostic #include <sys/mount.h>
1867200880Sbostic #include <sys/proc.h>
1967200880Sbostic #include <sys/buf.h>
2067200880Sbostic #include <sys/vnode.h>
2197659530Smckusick #include <sys/malloc.h>
2226a59bf8Skarels
234da9a385Spendry #include <miscfs/specfs/specdev.h>
244da9a385Spendry
2567200880Sbostic #include <ufs/ufs/quota.h>
2667200880Sbostic #include <ufs/ufs/inode.h>
2767200880Sbostic #include <ufs/ufs/ufsmount.h>
2867200880Sbostic #include <ufs/ufs/ufs_extern.h>
29070444a7Ssam
30065083aeSmckusick /*
3167200880Sbostic * Flag to permit forcible unmounting.
32f39cc612Smckusick */
33f39cc612Smckusick int doforce = 1;
34f39cc612Smckusick
35f39cc612Smckusick /*
369ef4b29bSmckusick * Make a filesystem operational.
379ef4b29bSmckusick * Nothing to do at the moment.
389ef4b29bSmckusick */
397386675fSmckusick /* ARGSUSED */
4067200880Sbostic int
ufs_start(mp,flags,p)412f8c8ec0Smckusick ufs_start(mp, flags, p)
429ef4b29bSmckusick struct mount *mp;
439ef4b29bSmckusick int flags;
442f8c8ec0Smckusick struct proc *p;
459ef4b29bSmckusick {
469ef4b29bSmckusick
479ef4b29bSmckusick return (0);
489ef4b29bSmckusick }
49065083aeSmckusick
50065083aeSmckusick /*
51*8f7f61bfSbostic * Return the root of a filesystem.
52*8f7f61bfSbostic */
53*8f7f61bfSbostic int
ufs_root(mp,vpp)54*8f7f61bfSbostic ufs_root(mp, vpp)
55*8f7f61bfSbostic struct mount *mp;
56*8f7f61bfSbostic struct vnode **vpp;
57*8f7f61bfSbostic {
58*8f7f61bfSbostic struct vnode *nvp;
59*8f7f61bfSbostic int error;
60*8f7f61bfSbostic
61*8f7f61bfSbostic if (error = VFS_VGET(mp, (ino_t)ROOTINO, &nvp))
62*8f7f61bfSbostic return (error);
63*8f7f61bfSbostic *vpp = nvp;
64*8f7f61bfSbostic return (0);
65*8f7f61bfSbostic }
66*8f7f61bfSbostic
67*8f7f61bfSbostic /*
6803064e0fSmckusick * Do operations associated with quotas
6903064e0fSmckusick */
7067200880Sbostic int
ufs_quotactl(mp,cmds,uid,arg,p)712f8c8ec0Smckusick ufs_quotactl(mp, cmds, uid, arg, p)
7203064e0fSmckusick struct mount *mp;
7303064e0fSmckusick int cmds;
7417ca59c5Smckusick uid_t uid;
7503064e0fSmckusick caddr_t arg;
762f8c8ec0Smckusick struct proc *p;
7703064e0fSmckusick {
7803064e0fSmckusick int cmd, type, error;
7903064e0fSmckusick
8003064e0fSmckusick #ifndef QUOTA
8103064e0fSmckusick return (EOPNOTSUPP);
8203064e0fSmckusick #else
8303064e0fSmckusick if (uid == -1)
8426a59bf8Skarels uid = p->p_cred->p_ruid;
8503064e0fSmckusick cmd = cmds >> SUBCMDSHIFT;
8603064e0fSmckusick
8703064e0fSmckusick switch (cmd) {
8803064e0fSmckusick case Q_GETQUOTA:
8903064e0fSmckusick case Q_SYNC:
9026a59bf8Skarels if (uid == p->p_cred->p_ruid)
9103064e0fSmckusick break;
9203064e0fSmckusick /* fall through */
9303064e0fSmckusick default:
9426a59bf8Skarels if (error = suser(p->p_ucred, &p->p_acflag))
9503064e0fSmckusick return (error);
9603064e0fSmckusick }
9703064e0fSmckusick
9803064e0fSmckusick type = cmd & SUBCMDMASK;
9903064e0fSmckusick if ((u_int)type >= MAXQUOTAS)
10003064e0fSmckusick return (EINVAL);
10103064e0fSmckusick
10203064e0fSmckusick switch (cmd) {
10303064e0fSmckusick
10403064e0fSmckusick case Q_QUOTAON:
10526a59bf8Skarels return (quotaon(p, mp, type, arg));
10603064e0fSmckusick
10703064e0fSmckusick case Q_QUOTAOFF:
10803064e0fSmckusick if (vfs_busy(mp))
10903064e0fSmckusick return (0);
110657b3ecbSmckusick error = quotaoff(p, mp, type);
11103064e0fSmckusick vfs_unbusy(mp);
11203064e0fSmckusick return (error);
11303064e0fSmckusick
11403064e0fSmckusick case Q_SETQUOTA:
11503064e0fSmckusick return (setquota(mp, uid, type, arg));
11603064e0fSmckusick
11703064e0fSmckusick case Q_SETUSE:
11803064e0fSmckusick return (setuse(mp, uid, type, arg));
11903064e0fSmckusick
12003064e0fSmckusick case Q_GETQUOTA:
12103064e0fSmckusick return (getquota(mp, uid, type, arg));
12203064e0fSmckusick
12303064e0fSmckusick case Q_SYNC:
12403064e0fSmckusick if (vfs_busy(mp))
12503064e0fSmckusick return (0);
12603064e0fSmckusick error = qsync(mp);
12703064e0fSmckusick vfs_unbusy(mp);
12803064e0fSmckusick return (error);
12903064e0fSmckusick
13003064e0fSmckusick default:
13103064e0fSmckusick return (EINVAL);
13203064e0fSmckusick }
13303064e0fSmckusick /* NOTREACHED */
13403064e0fSmckusick #endif
13503064e0fSmckusick }
13603064e0fSmckusick
13797659530Smckusick /*
138b13f5a2fSmckusick * This is the generic part of fhtovp called after the underlying
139b13f5a2fSmckusick * filesystem has validated the file handle.
140b13f5a2fSmckusick *
141b13f5a2fSmckusick * Verify that a host should have access to a filesystem, and if so
142b13f5a2fSmckusick * return a vnode for the presented file handle.
143b13f5a2fSmckusick */
144b13f5a2fSmckusick int
ufs_check_export(mp,ufhp,nam,vpp,exflagsp,credanonp)14542653100Smckusick ufs_check_export(mp, ufhp, nam, vpp, exflagsp, credanonp)
146b13f5a2fSmckusick register struct mount *mp;
14742653100Smckusick struct ufid *ufhp;
148b13f5a2fSmckusick struct mbuf *nam;
149b13f5a2fSmckusick struct vnode **vpp;
150b13f5a2fSmckusick int *exflagsp;
151b13f5a2fSmckusick struct ucred **credanonp;
152b13f5a2fSmckusick {
153b13f5a2fSmckusick register struct inode *ip;
154b13f5a2fSmckusick register struct netcred *np;
155b13f5a2fSmckusick register struct ufsmount *ump = VFSTOUFS(mp);
156b13f5a2fSmckusick struct vnode *nvp;
157b13f5a2fSmckusick int error;
158b13f5a2fSmckusick
159b13f5a2fSmckusick /*
160b13f5a2fSmckusick * Get the export permission structure for this <mp, client> tuple.
161b13f5a2fSmckusick */
162409bff9fShibler np = vfs_export_lookup(mp, &ump->um_export, nam);
163409bff9fShibler if (np == NULL)
164b13f5a2fSmckusick return (EACCES);
165409bff9fShibler
166b13f5a2fSmckusick if (error = VFS_VGET(mp, ufhp->ufid_ino, &nvp)) {
167b13f5a2fSmckusick *vpp = NULLVP;
168b13f5a2fSmckusick return (error);
169b13f5a2fSmckusick }
170b13f5a2fSmckusick ip = VTOI(nvp);
171b13f5a2fSmckusick if (ip->i_mode == 0 || ip->i_gen != ufhp->ufid_gen) {
1720e76e06aSmckusick vput(nvp);
173b13f5a2fSmckusick *vpp = NULLVP;
174b13f5a2fSmckusick return (ESTALE);
175b13f5a2fSmckusick }
176b13f5a2fSmckusick *vpp = nvp;
177b13f5a2fSmckusick *exflagsp = np->netc_exflags;
178b13f5a2fSmckusick *credanonp = &np->netc_anon;
179b13f5a2fSmckusick return (0);
18097659530Smckusick }
181