xref: /original-bsd/sys/ufs/ffs/ufs_vfsops.c (revision 8f7f61bf)
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