vfs_default.c revision 30513
130489Sphk/*
230489Sphk * Copyright (c) 1989, 1993
330489Sphk *	The Regents of the University of California.  All rights reserved.
430489Sphk *
530489Sphk * This code is derived from software contributed
630489Sphk * to Berkeley by John Heidemann of the UCLA Ficus project.
730489Sphk *
830489Sphk * Source: * @(#)i405_init.c 2.10 92/04/27 UCLA Ficus project
930489Sphk *
1030489Sphk * Redistribution and use in source and binary forms, with or without
1130489Sphk * modification, are permitted provided that the following conditions
1230489Sphk * are met:
1330489Sphk * 1. Redistributions of source code must retain the above copyright
1430489Sphk *    notice, this list of conditions and the following disclaimer.
1530489Sphk * 2. Redistributions in binary form must reproduce the above copyright
1630489Sphk *    notice, this list of conditions and the following disclaimer in the
1730489Sphk *    documentation and/or other materials provided with the distribution.
1830489Sphk * 3. All advertising materials mentioning features or use of this software
1930489Sphk *    must display the following acknowledgement:
2030489Sphk *	This product includes software developed by the University of
2130489Sphk *	California, Berkeley and its contributors.
2230489Sphk * 4. Neither the name of the University nor the names of its contributors
2330489Sphk *    may be used to endorse or promote products derived from this software
2430489Sphk *    without specific prior written permission.
2530489Sphk *
2630489Sphk * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2730489Sphk * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2830489Sphk * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2930489Sphk * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
3030489Sphk * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
3130489Sphk * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3230489Sphk * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3330489Sphk * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3430489Sphk * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3530489Sphk * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3630489Sphk * SUCH DAMAGE.
3730489Sphk *
3830489Sphk */
3930489Sphk
4030489Sphk#include <sys/param.h>
4130489Sphk#include <sys/systm.h>
4230489Sphk#include <sys/kernel.h>
4330489Sphk#include <sys/mount.h>
4430492Sphk#include <sys/unistd.h>
4530489Sphk#include <sys/vnode.h>
4630489Sphk
4730489Sphkstatic int vop_nostrategy __P((struct vop_strategy_args *));
4830489Sphk
4930489Sphk/*
5030489Sphk * This vnode table stores what we want to do if the filesystem doesn't
5130489Sphk * implement a particular VOP.
5230489Sphk *
5330489Sphk * If there is no specific entry here, we will return EOPNOTSUPP.
5430489Sphk *
5530489Sphk */
5630489Sphk
5730489Sphkvop_t **default_vnodeop_p;
5830489Sphkstatic struct vnodeopv_entry_desc default_vnodeop_entries[] = {
5930492Sphk	{ &vop_default_desc,		(vop_t *) vop_eopnotsupp },
6030489Sphk	{ &vop_abortop_desc,		(vop_t *) nullop },
6130492Sphk	{ &vop_advlock_desc,		(vop_t *) vop_einval },
6230489Sphk	{ &vop_bwrite_desc,		(vop_t *) vn_bwrite },
6330492Sphk	{ &vop_close_desc,		(vop_t *) vop_null },
6430492Sphk	{ &vop_fsync_desc,		(vop_t *) vop_null },
6530492Sphk	{ &vop_ioctl_desc,		(vop_t *) vop_enotty },
6630496Sphk	{ &vop_islocked_desc,		(vop_t *) vop_noislocked },
6730489Sphk	{ &vop_lease_desc,		(vop_t *) lease_check },
6830496Sphk	{ &vop_lock_desc,		(vop_t *) vop_nolock },
6930492Sphk	{ &vop_mmap_desc,		(vop_t *) vop_einval },
7030492Sphk	{ &vop_open_desc,		(vop_t *) vop_null },
7130492Sphk	{ &vop_pathconf_desc,		(vop_t *) vop_einval },
7230489Sphk	{ &vop_poll_desc,		(vop_t *) vop_nopoll },
7330492Sphk	{ &vop_readlink_desc,		(vop_t *) vop_einval },
7430492Sphk	{ &vop_reallocblks_desc,	(vop_t *) vop_eopnotsupp },
7530489Sphk	{ &vop_revoke_desc,		(vop_t *) vop_revoke },
7630489Sphk	{ &vop_strategy_desc,		(vop_t *) vop_nostrategy },
7730496Sphk	{ &vop_unlock_desc,		(vop_t *) vop_nounlock },
7830489Sphk	{ NULL, NULL }
7930489Sphk};
8030489Sphk
8130489Sphkstatic struct vnodeopv_desc default_vnodeop_opv_desc =
8230489Sphk        { &default_vnodeop_p, default_vnodeop_entries };
8330489Sphk
8430489SphkVNODEOP_SET(default_vnodeop_opv_desc);
8530489Sphk
8630489Sphkint
8730492Sphkvop_eopnotsupp(struct vop_generic_args *ap)
8830489Sphk{
8930489Sphk	/*
9030492Sphk	printf("vop_notsupp[%s]\n", ap->a_desc->vdesc_name);
9130489Sphk	*/
9230489Sphk
9330489Sphk	return (EOPNOTSUPP);
9430489Sphk}
9530489Sphk
9630489Sphkint
9730492Sphkvop_ebadf(struct vop_generic_args *ap)
9830489Sphk{
9930489Sphk
10030492Sphk	return (EBADF);
10130492Sphk}
10230492Sphk
10330492Sphkint
10430492Sphkvop_enotty(struct vop_generic_args *ap)
10530492Sphk{
10630492Sphk
10730492Sphk	return (ENOTTY);
10830492Sphk}
10930492Sphk
11030492Sphkint
11130492Sphkvop_einval(struct vop_generic_args *ap)
11230492Sphk{
11330492Sphk
11430492Sphk	return (EINVAL);
11530492Sphk}
11630492Sphk
11730492Sphkint
11830492Sphkvop_null(struct vop_generic_args *ap)
11930492Sphk{
12030492Sphk
12130492Sphk	return (0);
12230492Sphk}
12330492Sphk
12430492Sphkint
12530492Sphkvop_defaultop(struct vop_generic_args *ap)
12630492Sphk{
12730492Sphk
12830489Sphk	return (VOCALL(default_vnodeop_p, ap->a_desc->vdesc_offset, ap));
12930489Sphk}
13030489Sphk
13130489Sphkstatic int
13230489Sphkvop_nostrategy (struct vop_strategy_args *ap)
13330489Sphk{
13430489Sphk	printf("No strategy for buffer at %p\n", ap->a_bp);
13530489Sphk	vprint("", ap->a_bp->b_vp);
13630489Sphk	ap->a_bp->b_flags |= B_ERROR;
13730489Sphk	ap->a_bp->b_error = EOPNOTSUPP;
13830489Sphk	biodone(ap->a_bp);
13930489Sphk	return (EOPNOTSUPP);
14030489Sphk}
14130492Sphk
14230492Sphkint
14330492Sphkvop_stdpathconf(ap)
14430492Sphk	struct vop_pathconf_args /* {
14530492Sphk	struct vnode *a_vp;
14630492Sphk	int a_name;
14730492Sphk	int *a_retval;
14830492Sphk	} */ *ap;
14930492Sphk{
15030492Sphk
15130492Sphk	switch (ap->a_name) {
15230492Sphk		case _PC_LINK_MAX:
15330492Sphk			*ap->a_retval = LINK_MAX;
15430492Sphk			return (0);
15530492Sphk		case _PC_MAX_CANON:
15630492Sphk			*ap->a_retval = MAX_CANON;
15730492Sphk			return (0);
15830492Sphk		case _PC_MAX_INPUT:
15930492Sphk			*ap->a_retval = MAX_INPUT;
16030492Sphk			return (0);
16130492Sphk		case _PC_PIPE_BUF:
16230492Sphk			*ap->a_retval = PIPE_BUF;
16330492Sphk			return (0);
16430492Sphk		case _PC_CHOWN_RESTRICTED:
16530492Sphk			*ap->a_retval = 1;
16630492Sphk			return (0);
16730492Sphk		case _PC_VDISABLE:
16830492Sphk			*ap->a_retval = _POSIX_VDISABLE;
16930492Sphk			return (0);
17030492Sphk		default:
17130492Sphk			return (EINVAL);
17230492Sphk	}
17330492Sphk	/* NOTREACHED */
17430492Sphk}
17530513Sphk
17630513Sphk/*
17730513Sphk * Standard lock, unlock and islocked functions.
17830513Sphk *
17930513Sphk * These depend on the lock structure being the first element in the
18030513Sphk * inode, ie: vp->v_data points to the the lock!
18130513Sphk */
18230513Sphkint
18330513Sphkvop_stdlock(ap)
18430513Sphk	struct vop_lock_args /* {
18530513Sphk		struct vnode *a_vp;
18630513Sphk		int a_flags;
18730513Sphk		struct proc *a_p;
18830513Sphk	} */ *ap;
18930513Sphk{
19030513Sphk	struct lock *l = (struct lock*)ap->a_vp->v_data;
19130513Sphk
19230513Sphk	return (lockmgr(l, ap->a_flags, &ap->a_vp->v_interlock, ap->a_p));
19330513Sphk}
19430513Sphk
19530513Sphkint
19630513Sphkvop_stdunlock(ap)
19730513Sphk	struct vop_unlock_args /* {
19830513Sphk		struct vnode *a_vp;
19930513Sphk		int a_flags;
20030513Sphk		struct proc *a_p;
20130513Sphk	} */ *ap;
20230513Sphk{
20330513Sphk	struct lock *l = (struct lock*)ap->a_vp->v_data;
20430513Sphk
20530513Sphk	return (lockmgr(l, ap->a_flags | LK_RELEASE, &ap->a_vp->v_interlock,
20630513Sphk	    ap->a_p));
20730513Sphk}
20830513Sphk
20930513Sphkint
21030513Sphkvop_stdislocked(ap)
21130513Sphk	struct vop_islocked_args /* {
21230513Sphk		struct vnode *a_vp;
21330513Sphk	} */ *ap;
21430513Sphk{
21530513Sphk	struct lock *l = (struct lock*)ap->a_vp->v_data;
21630513Sphk
21730513Sphk	return (lockstatus(l));
21830513Sphk}
21930513Sphk
220