Home | History | Annotate | Download | only in fs
      1     0   stevel /*
      2     0   stevel  * CDDL HEADER START
      3     0   stevel  *
      4     0   stevel  * The contents of this file are subject to the terms of the
      5  1925      rsb  * Common Development and Distribution License (the "License").
      6  1925      rsb  * You may not use this file except in compliance with the License.
      7     0   stevel  *
      8     0   stevel  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
      9     0   stevel  * or http://www.opensolaris.org/os/licensing.
     10     0   stevel  * See the License for the specific language governing permissions
     11     0   stevel  * and limitations under the License.
     12     0   stevel  *
     13     0   stevel  * When distributing Covered Code, include this CDDL HEADER in each
     14     0   stevel  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     15     0   stevel  * If applicable, add the following below this CDDL HEADER, with the
     16     0   stevel  * fields enclosed by brackets "[]" replaced with your own identifying
     17     0   stevel  * information: Portions Copyright [yyyy] [name of copyright owner]
     18     0   stevel  *
     19     0   stevel  * CDDL HEADER END
     20     0   stevel  */
     21     0   stevel /*
     22  6264  rm15945  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
     23     0   stevel  * Use is subject to license terms.
     24     0   stevel  */
     25     0   stevel #pragma ident	"%Z%%M%	%I%	%E% SMI"
     26     0   stevel 
     27     0   stevel #include <sys/types.h>
     28     0   stevel #include <sys/atomic.h>
     29     0   stevel #include <sys/kmem.h>
     30     0   stevel #include <sys/mutex.h>
     31     0   stevel #include <sys/errno.h>
     32     0   stevel #include <sys/param.h>
     33     0   stevel #include <sys/sysmacros.h>
     34     0   stevel #include <sys/systm.h>
     35     0   stevel #include <sys/cmn_err.h>
     36     0   stevel #include <sys/debug.h>
     37     0   stevel 
     38     0   stevel #include <sys/fem.h>
     39     0   stevel #include <sys/vfs.h>
     40     0   stevel #include <sys/vnode.h>
     41  3898      rsb #include <sys/vfs_opreg.h>
     42     0   stevel 
     43     0   stevel #define	NNODES_DEFAULT	8	/* Default number of nodes in a fem_list */
     44     0   stevel /*
     45     0   stevel  * fl_ntob(n) - Fem_list: number of nodes to bytes
     46     0   stevel  * Given the number of nodes in a fem_list return the size, in bytes,
     47     0   stevel  * of the fem_list structure.
     48     0   stevel  */
     49     0   stevel #define	fl_ntob(n)	(sizeof (struct fem_list) + \
     50     0   stevel 			((n) - 1) * sizeof (struct fem_node))
     51     0   stevel 
     52     0   stevel typedef enum {
     53     0   stevel 	FEMTYPE_NULL,	/* Uninitialized */
     54     0   stevel 	FEMTYPE_VNODE,
     55     0   stevel 	FEMTYPE_VFS,
     56     0   stevel 	FEMTYPE_NTYPES
     57     0   stevel } femtype_t;
     58     0   stevel 
     59     0   stevel #define	FEM_HEAD(_t) femtype[(_t)].head.fn_op.anon
     60     0   stevel #define	FEM_GUARD(_t) femtype[(_t)].guard
     61     0   stevel 
     62     0   stevel static struct fem_type_info {
     63     0   stevel 	struct fem_node		head;
     64     0   stevel 	struct fem_node		guard;
     65     0   stevel 	femop_t			*errf;
     66     0   stevel }	femtype[FEMTYPE_NTYPES];
     67     0   stevel 
     68     0   stevel 
     69     0   stevel /*
     70     0   stevel  * For each type, two tables - the translation offset definition, which
     71     0   stevel  * is used by fs_build_vector to layout the operation(s) vector; and the
     72     0   stevel  * guard_operation_vector which protects from stack under-run.
     73     0   stevel  */
     74     0   stevel 
     75     0   stevel int fem_err();
     76     0   stevel int fsem_err();
     77     0   stevel 
     78     0   stevel 
     79     0   stevel #define	_FEMOPDEF(name, member)  \
     80  3898      rsb 	{ VOPNAME_##name, offsetof(fem_t, femop_##member), NULL, fem_err }
     81     0   stevel 
     82     0   stevel static fs_operation_trans_def_t	fem_opdef[] = {
     83     0   stevel 	_FEMOPDEF(OPEN,		open),
     84     0   stevel 	_FEMOPDEF(CLOSE,	close),
     85     0   stevel 	_FEMOPDEF(READ,		read),
     86     0   stevel 	_FEMOPDEF(WRITE,	write),
     87     0   stevel 	_FEMOPDEF(IOCTL,	ioctl),
     88     0   stevel 	_FEMOPDEF(SETFL,	setfl),
     89     0   stevel 	_FEMOPDEF(GETATTR,	getattr),
     90     0   stevel 	_FEMOPDEF(SETATTR,	setattr),
     91     0   stevel 	_FEMOPDEF(ACCESS,	access),
     92     0   stevel 	_FEMOPDEF(LOOKUP,	lookup),
     93     0   stevel 	_FEMOPDEF(CREATE,	create),
     94     0   stevel 	_FEMOPDEF(REMOVE,	remove),
     95     0   stevel 	_FEMOPDEF(LINK,		link),
     96     0   stevel 	_FEMOPDEF(RENAME,	rename),
     97     0   stevel 	_FEMOPDEF(MKDIR,	mkdir),
     98     0   stevel 	_FEMOPDEF(RMDIR,	rmdir),
     99     0   stevel 	_FEMOPDEF(READDIR,	readdir),
    100     0   stevel 	_FEMOPDEF(SYMLINK,	symlink),
    101     0   stevel 	_FEMOPDEF(READLINK,	readlink),
    102     0   stevel 	_FEMOPDEF(FSYNC,	fsync),
    103     0   stevel 	_FEMOPDEF(INACTIVE,	inactive),
    104     0   stevel 	_FEMOPDEF(FID,		fid),
    105     0   stevel 	_FEMOPDEF(RWLOCK,	rwlock),
    106     0   stevel 	_FEMOPDEF(RWUNLOCK,	rwunlock),
    107     0   stevel 	_FEMOPDEF(SEEK,		seek),
    108     0   stevel 	_FEMOPDEF(CMP,		cmp),
    109     0   stevel 	_FEMOPDEF(FRLOCK,	frlock),
    110     0   stevel 	_FEMOPDEF(SPACE,	space),
    111     0   stevel 	_FEMOPDEF(REALVP,	realvp),
    112     0   stevel 	_FEMOPDEF(GETPAGE,	getpage),
    113     0   stevel 	_FEMOPDEF(PUTPAGE,	putpage),
    114     0   stevel 	_FEMOPDEF(MAP,		map),
    115     0   stevel 	_FEMOPDEF(ADDMAP,	addmap),
    116     0   stevel 	_FEMOPDEF(DELMAP,	delmap),
    117     0   stevel 	_FEMOPDEF(POLL,		poll),
    118     0   stevel 	_FEMOPDEF(DUMP,		dump),
    119     0   stevel 	_FEMOPDEF(PATHCONF,	pathconf),
    120     0   stevel 	_FEMOPDEF(PAGEIO,	pageio),
    121     0   stevel 	_FEMOPDEF(DUMPCTL,	dumpctl),
    122     0   stevel 	_FEMOPDEF(DISPOSE,	dispose),
    123     0   stevel 	_FEMOPDEF(SETSECATTR,	setsecattr),
    124     0   stevel 	_FEMOPDEF(GETSECATTR,	getsecattr),
    125     0   stevel 	_FEMOPDEF(SHRLOCK,	shrlock),
    126     0   stevel 	_FEMOPDEF(VNEVENT,	vnevent),
    127     0   stevel 	{ NULL, 0, NULL, NULL }
    128     0   stevel };
    129     0   stevel 
    130     0   stevel 
    131     0   stevel #define	_FEMGUARD(name, ignore)  \
    132     0   stevel 	{ VOPNAME_##name, (femop_t *)fem_err }
    133     0   stevel 
    134     0   stevel static struct fs_operation_def fem_guard_ops[] = {
    135     0   stevel 	_FEMGUARD(OPEN,		open),
    136     0   stevel 	_FEMGUARD(CLOSE,	close),
    137     0   stevel 	_FEMGUARD(READ,		read),
    138     0   stevel 	_FEMGUARD(WRITE,	write),
    139     0   stevel 	_FEMGUARD(IOCTL,	ioctl),
    140     0   stevel 	_FEMGUARD(SETFL,	setfl),
    141     0   stevel 	_FEMGUARD(GETATTR,	getattr),
    142     0   stevel 	_FEMGUARD(SETATTR,	setattr),
    143     0   stevel 	_FEMGUARD(ACCESS,	access),
    144     0   stevel 	_FEMGUARD(LOOKUP,	lookup),
    145     0   stevel 	_FEMGUARD(CREATE,	create),
    146     0   stevel 	_FEMGUARD(REMOVE,	remove),
    147     0   stevel 	_FEMGUARD(LINK,		link),
    148     0   stevel 	_FEMGUARD(RENAME,	rename),
    149     0   stevel 	_FEMGUARD(MKDIR,	mkdir),
    150     0   stevel 	_FEMGUARD(RMDIR,	rmdir),
    151     0   stevel 	_FEMGUARD(READDIR,	readdir),
    152     0   stevel 	_FEMGUARD(SYMLINK,	symlink),
    153     0   stevel 	_FEMGUARD(READLINK,	readlink),
    154     0   stevel 	_FEMGUARD(FSYNC,	fsync),
    155     0   stevel 	_FEMGUARD(INACTIVE,	inactive),
    156     0   stevel 	_FEMGUARD(FID,		fid),
    157     0   stevel 	_FEMGUARD(RWLOCK,	rwlock),
    158     0   stevel 	_FEMGUARD(RWUNLOCK,	rwunlock),
    159     0   stevel 	_FEMGUARD(SEEK,		seek),
    160     0   stevel 	_FEMGUARD(CMP,		cmp),
    161     0   stevel 	_FEMGUARD(FRLOCK,	frlock),
    162     0   stevel 	_FEMGUARD(SPACE,	space),
    163     0   stevel 	_FEMGUARD(REALVP,	realvp),
    164     0   stevel 	_FEMGUARD(GETPAGE,	getpage),
    165     0   stevel 	_FEMGUARD(PUTPAGE,	putpage),
    166     0   stevel 	_FEMGUARD(MAP,		map),
    167     0   stevel 	_FEMGUARD(ADDMAP,	addmap),
    168     0   stevel 	_FEMGUARD(DELMAP,	delmap),
    169     0   stevel 	_FEMGUARD(POLL,		poll),
    170     0   stevel 	_FEMGUARD(DUMP,		dump),
    171     0   stevel 	_FEMGUARD(PATHCONF,	pathconf),
    172     0   stevel 	_FEMGUARD(PAGEIO,	pageio),
    173     0   stevel 	_FEMGUARD(DUMPCTL,	dumpctl),
    174     0   stevel 	_FEMGUARD(DISPOSE,	dispose),
    175     0   stevel 	_FEMGUARD(SETSECATTR,	setsecattr),
    176     0   stevel 	_FEMGUARD(GETSECATTR,	getsecattr),
    177     0   stevel 	_FEMGUARD(SHRLOCK,	shrlock),
    178     0   stevel 	_FEMGUARD(VNEVENT,	vnevent),
    179     0   stevel 	{ NULL, NULL }
    180     0   stevel };
    181     0   stevel 
    182     0   stevel 
    183     0   stevel #define	_FSEMOPDEF(name, member)  \
    184  3898      rsb 	{ VFSNAME_##name, offsetof(fsem_t, fsemop_##member), NULL, fsem_err }
    185     0   stevel 
    186     0   stevel static fs_operation_trans_def_t fsem_opdef[] = {
    187     0   stevel 	_FSEMOPDEF(MOUNT, 	mount),
    188     0   stevel 	_FSEMOPDEF(UNMOUNT,	unmount),
    189     0   stevel 	_FSEMOPDEF(ROOT,	root),
    190     0   stevel 	_FSEMOPDEF(STATVFS,	statvfs),
    191     0   stevel 	_FSEMOPDEF(SYNC,	sync),
    192     0   stevel 	_FSEMOPDEF(VGET,	vget),
    193     0   stevel 	_FSEMOPDEF(MOUNTROOT,	mountroot),
    194     0   stevel 	_FSEMOPDEF(FREEVFS,	freevfs),
    195     0   stevel 	_FSEMOPDEF(VNSTATE,	vnstate),
    196     0   stevel 	{ NULL, 0, NULL, NULL }
    197     0   stevel };
    198     0   stevel 
    199     0   stevel #define	_FSEMGUARD(name, ignore)  \
    200     0   stevel 	{ VFSNAME_##name, (femop_t *)fsem_err }
    201     0   stevel 
    202     0   stevel static struct fs_operation_def fsem_guard_ops[] = {
    203     0   stevel 	_FSEMGUARD(MOUNT, 	mount),
    204     0   stevel 	_FSEMGUARD(UNMOUNT,	unmount),
    205     0   stevel 	_FSEMGUARD(ROOT,	root),
    206     0   stevel 	_FSEMGUARD(STATVFS,	statvfs),
    207     0   stevel 	_FSEMGUARD(SYNC,	sync),
    208     0   stevel 	_FSEMGUARD(VGET,	vget),
    209     0   stevel 	_FSEMGUARD(MOUNTROOT,	mountroot),
    210     0   stevel 	_FSEMGUARD(FREEVFS,	freevfs),
    211     0   stevel 	_FSEMGUARD(VNSTATE,	vnstate),
    212     0   stevel 	{ NULL, NULL}
    213     0   stevel };
    214     0   stevel 
    215     0   stevel 
    216     0   stevel /*
    217     0   stevel  * vsop_find, vfsop_find -
    218     0   stevel  *
    219     0   stevel  * These macros descend the stack until they find either a basic
    220     0   stevel  * vnode/vfs operation [ indicated by a null fn_available ] or a
    221     0   stevel  * stacked item where this method is non-null [_vsop].
    222     0   stevel  *
    223     0   stevel  * The DEBUG one is written with a single function which manually applies
    224     0   stevel  * the structure offsets.  It can have additional debugging support.
    225     0   stevel  */
    226     0   stevel 
    227     0   stevel #ifndef DEBUG
    228     0   stevel 
    229     0   stevel #define	vsop_find(ap, func, funct, arg0, _vop, _vsop) \
    230     0   stevel for (;;) { \
    231     0   stevel 	if ((ap)->fa_fnode->fn_available == NULL) { \
    232     0   stevel 		*(func) = (funct (*)())((ap)->fa_fnode->fn_op.vnode->_vop); \
    233     0   stevel 		*(arg0) = (void *)(ap)->fa_vnode.vp; \
    234     0   stevel 		break;	\
    235     0   stevel 	} else if ((*(func) = (funct (*)())((ap)->fa_fnode->fn_op.fem->_vsop))\
    236     0   stevel 		    != NULL) { \
    237     0   stevel 		*(arg0) = (void *) (ap); \
    238     0   stevel 		break;	\
    239     0   stevel 	} else { \
    240     0   stevel 		(ap)->fa_fnode--; \
    241     0   stevel 	} \
    242     0   stevel } \
    243     0   stevel 
    244     0   stevel #define	vfsop_find(ap, func, funct, arg0, _vop, _vsop) \
    245     0   stevel for (;;) { \
    246     0   stevel 	if ((ap)->fa_fnode->fn_available == NULL) { \
    247     0   stevel 		*(func) = (funct (*)())((ap)->fa_fnode->fn_op.vfs->_vop); \
    248     0   stevel 		*(arg0) = (void *)(ap)->fa_vnode.vp; \
    249     0   stevel 		break; \
    250     0   stevel 	} else if ((*(func) = (funct (*)())((ap)->fa_fnode->fn_op.fsem->_vsop))\
    251     0   stevel 		    != NULL) { \
    252     0   stevel 		*(arg0) = (void *) (ap); \
    253     0   stevel 		break; \
    254     0   stevel 	} else { \
    255     0   stevel 		(ap)->fa_fnode--; \
    256     0   stevel 	} \
    257     0   stevel } \
    258     0   stevel 
    259     0   stevel #else
    260     0   stevel 
    261     0   stevel #define	vsop_find(ap, func, funct, arg0, _vop, _vsop) \
    262     0   stevel 	*(arg0) = _op_find((ap), (void **)(func), \
    263     0   stevel 			offsetof(vnodeops_t, _vop), offsetof(fem_t, _vsop))
    264     0   stevel 
    265     0   stevel #define	vfsop_find(ap, func, funct, arg0, _fop, _fsop) \
    266     0   stevel 	*(arg0) = _op_find((ap), (void **)(func), \
    267     0   stevel 			offsetof(vfsops_t, _fop), offsetof(fsem_t, _fsop))
    268     0   stevel 
    269     0   stevel static void *
    270     0   stevel _op_find(femarg_t *ap, void **fp, int offs0, int offs1)
    271     0   stevel {
    272     0   stevel 	void *ptr;
    273     0   stevel 	for (;;) {
    274     0   stevel 		struct fem_node	*fnod = ap->fa_fnode;
    275     0   stevel 		if (fnod->fn_available == NULL) {
    276     0   stevel 			*fp = *(void **)((char *)fnod->fn_op.anon + offs0);
    277     0   stevel 			ptr = (void *)(ap->fa_vnode.anon);
    278     0   stevel 			break;
    279     0   stevel 		} else if ((*fp = *(void **)((char *)fnod->fn_op.anon+offs1))
    280  6264  rm15945 		    != NULL) {
    281     0   stevel 			ptr = (void *)(ap);
    282     0   stevel 			break;
    283     0   stevel 		} else {
    284     0   stevel 			ap->fa_fnode--;
    285     0   stevel 		}
    286     0   stevel 	}
    287     0   stevel 	return (ptr);
    288     0   stevel }
    289     0   stevel #endif
    290     0   stevel 
    291     0   stevel static fem_t *
    292     0   stevel fem_alloc()
    293     0   stevel {
    294     0   stevel 	fem_t	*p;
    295     0   stevel 
    296     0   stevel 	p = (fem_t *)kmem_alloc(sizeof (*p), KM_SLEEP);
    297     0   stevel 	return (p);
    298     0   stevel }
    299     0   stevel 
    300     0   stevel void
    301     0   stevel fem_free(fem_t *p)
    302     0   stevel {
    303     0   stevel 	kmem_free(p, sizeof (*p));
    304     0   stevel }
    305     0   stevel 
    306     0   stevel static fsem_t *
    307     0   stevel fsem_alloc()
    308     0   stevel {
    309     0   stevel 	fsem_t	*p;
    310     0   stevel 
    311     0   stevel 	p = (fsem_t *)kmem_alloc(sizeof (*p), KM_SLEEP);
    312     0   stevel 	return (p);
    313     0   stevel }
    314     0   stevel 
    315     0   stevel void
    316     0   stevel fsem_free(fsem_t *p)
    317     0   stevel {
    318     0   stevel 	kmem_free(p, sizeof (*p));
    319     0   stevel }
    320     0   stevel 
    321     0   stevel 
    322     0   stevel /*
    323     0   stevel  * fem_get, fem_release - manage reference counts on the stack.
    324     0   stevel  *
    325     0   stevel  * The list of monitors can be updated while operations are in
    326     0   stevel  * progress on the object.
    327     0   stevel  *
    328     0   stevel  * The reference count facilitates this by counting the number of
    329     0   stevel  * current accessors, and deconstructing the list when it is exhausted.
    330     0   stevel  *
    331     0   stevel  * fem_lock() is required to:
    332     0   stevel  *	look at femh_list
    333     0   stevel  *	update what femh_list points to
    334     0   stevel  *	update femh_list
    335     0   stevel  *	increase femh_list->feml_refc.
    336     0   stevel  *
    337     0   stevel  * the feml_refc can decrement without holding the lock;
    338     0   stevel  * when feml_refc becomes zero, the list is destroyed.
    339     0   stevel  *
    340     0   stevel  */
    341     0   stevel 
    342     0   stevel static struct fem_list *
    343     0   stevel fem_lock(struct fem_head *fp)
    344     0   stevel {
    345     0   stevel 	struct fem_list	*sp = NULL;
    346     0   stevel 
    347     0   stevel 	ASSERT(fp != NULL);
    348     0   stevel 	mutex_enter(&fp->femh_lock);
    349     0   stevel 	sp = fp->femh_list;
    350     0   stevel 	return (sp);
    351     0   stevel }
    352     0   stevel 
    353     0   stevel static void
    354     0   stevel fem_unlock(struct fem_head *fp)
    355     0   stevel {
    356     0   stevel 	ASSERT(fp != NULL);
    357     0   stevel 	mutex_exit(&fp->femh_lock);
    358     0   stevel }
    359     0   stevel 
    360     0   stevel /*
    361     0   stevel  * Addref can only be called while its head->lock is held.
    362     0   stevel  */
    363     0   stevel 
    364     0   stevel static void
    365     0   stevel fem_addref(struct fem_list *sp)
    366     0   stevel {
    367     0   stevel 	atomic_add_32(&sp->feml_refc, 1);
    368     0   stevel }
    369     0   stevel 
    370  1927  jwahlig static uint32_t
    371     0   stevel fem_delref(struct fem_list *sp)
    372     0   stevel {
    373  1927  jwahlig 	return (atomic_add_32_nv(&sp->feml_refc, -1));
    374     0   stevel }
    375     0   stevel 
    376     0   stevel static struct fem_list *
    377     0   stevel fem_get(struct fem_head *fp)
    378     0   stevel {
    379     0   stevel 	struct fem_list *sp = NULL;
    380     0   stevel 
    381     0   stevel 	if (fp != NULL) {
    382     0   stevel 		if ((sp = fem_lock(fp)) != NULL) {
    383     0   stevel 			fem_addref(sp);
    384     0   stevel 		}
    385     0   stevel 		fem_unlock(fp);
    386     0   stevel 	}
    387     0   stevel 	return (sp);
    388     0   stevel }
    389     0   stevel 
    390     0   stevel static void
    391     0   stevel fem_release(struct fem_list *sp)
    392     0   stevel {
    393     0   stevel 	int	i;
    394     0   stevel 
    395  1927  jwahlig 	ASSERT(sp->feml_refc != 0);
    396  1927  jwahlig 	if (fem_delref(sp) == 0) {
    397     0   stevel 		/*
    398     0   stevel 		 * Before freeing the list, we need to release the
    399     0   stevel 		 * caller-provided data.
    400     0   stevel 		 */
    401     0   stevel 		for (i = sp->feml_tos; i > 0; i--) {
    402     0   stevel 			struct fem_node *fnp = &sp->feml_nodes[i];
    403     0   stevel 
    404     0   stevel 			if (fnp->fn_av_rele)
    405     0   stevel 				(*(fnp->fn_av_rele))(fnp->fn_available);
    406     0   stevel 		}
    407     0   stevel 		kmem_free(sp, fl_ntob(sp->feml_ssize));
    408     0   stevel 	}
    409     0   stevel }
    410     0   stevel 
    411     0   stevel 
    412     0   stevel /*
    413     0   stevel  * These are the 'head' operations which perform the interposition.
    414     0   stevel  *
    415     0   stevel  * This set must be 1:1, onto with the (vnodeops, vfsos).
    416     0   stevel  *
    417     0   stevel  * If there is a desire to globally disable interposition for a particular
    418     0   stevel  * method, the corresponding 'head' routine should unearth the base method
    419     0   stevel  * and invoke it directly rather than bypassing the function.
    420     0   stevel  *
    421     0   stevel  * All the functions are virtually the same, save for names, types & args.
    422     0   stevel  *  1. get a reference to the monitor stack for this object.
    423     0   stevel  *  2. store the top of stack into the femarg structure.
    424     0   stevel  *  3. store the basic object (vnode *, vnode **, vfs *) in the femarg struc.
    425     0   stevel  *  4. invoke the "top" method for this object.
    426     0   stevel  *  5. release the reference to the monitor stack.
    427     0   stevel  *
    428     0   stevel  */
    429     0   stevel 
    430     0   stevel static int
    431  5331      amw vhead_open(vnode_t **vpp, int mode, cred_t *cr, caller_context_t *ct)
    432     0   stevel {
    433     0   stevel 	femarg_t	farg;
    434     0   stevel 	struct fem_list	*femsp;
    435     0   stevel 	int		(*func)();
    436     0   stevel 	void		*arg0;
    437     0   stevel 	int		errc;
    438     0   stevel 
    439     0   stevel 	if ((femsp = fem_lock((*vpp)->v_femhead)) == NULL) {
    440     0   stevel 		func = (int (*)()) ((*vpp)->v_op->vop_open);
    441     0   stevel 		arg0 = (void *)vpp;
    442     0   stevel 		fem_unlock((*vpp)->v_femhead);
    443  5331      amw 		errc = (*func)(arg0, mode, cr, ct);
    444     0   stevel 	} else {
    445     0   stevel 		fem_addref(femsp);
    446     0   stevel 		fem_unlock((*vpp)->v_femhead);
    447     0   stevel 		farg.fa_vnode.vpp = vpp;
    448     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    449  3898      rsb 		vsop_find(&farg, &func, int, &arg0, vop_open, femop_open);
    450  5331      amw 		errc = (*func)(arg0, mode, cr, ct);
    451     0   stevel 		fem_release(femsp);
    452     0   stevel 	}
    453     0   stevel 	return (errc);
    454     0   stevel }
    455     0   stevel 
    456     0   stevel static int
    457  5331      amw vhead_close(vnode_t *vp, int flag, int count, offset_t offset, cred_t *cr,
    458  5331      amw 	caller_context_t *ct)
    459     0   stevel {
    460     0   stevel 	femarg_t	farg;
    461     0   stevel 	struct fem_list	*femsp;
    462     0   stevel 	int		(*func)();
    463     0   stevel 	void		*arg0;
    464     0   stevel 	int		errc;
    465     0   stevel 
    466     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
    467     0   stevel 		func = (int (*)()) (vp->v_op->vop_close);
    468     0   stevel 		arg0 = vp;
    469     0   stevel 		fem_unlock(vp->v_femhead);
    470  5331      amw 		errc = (*func)(arg0, flag, count, offset, cr, ct);
    471     0   stevel 	} else {
    472     0   stevel 		fem_addref(femsp);
    473     0   stevel 		fem_unlock(vp->v_femhead);
    474     0   stevel 		farg.fa_vnode.vp = vp;
    475     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    476  3898      rsb 		vsop_find(&farg, &func, int, &arg0, vop_close, femop_close);
    477  5331      amw 		errc = (*func)(arg0, flag, count, offset, cr, ct);
    478     0   stevel 		fem_release(femsp);
    479     0   stevel 	}
    480     0   stevel 	return (errc);
    481     0   stevel }
    482     0   stevel 
    483     0   stevel static int
    484     0   stevel vhead_read(vnode_t *vp, uio_t *uiop, int ioflag, cred_t *cr,
    485  5331      amw 	caller_context_t *ct)
    486     0   stevel {
    487     0   stevel 	femarg_t	farg;
    488     0   stevel 	struct fem_list	*femsp;
    489     0   stevel 	int		(*func)();
    490     0   stevel 	void		*arg0;
    491     0   stevel 	int		errc;
    492     0   stevel 
    493     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
    494     0   stevel 		func = (int (*)()) (vp->v_op->vop_read);
    495     0   stevel 		arg0 = vp;
    496     0   stevel 		fem_unlock(vp->v_femhead);
    497     0   stevel 		errc = (*func)(arg0, uiop, ioflag, cr, ct);
    498     0   stevel 	} else {
    499     0   stevel 		fem_addref(femsp);
    500     0   stevel 		fem_unlock(vp->v_femhead);
    501     0   stevel 		farg.fa_vnode.vp = vp;
    502     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    503  3898      rsb 		vsop_find(&farg, &func, int, &arg0, vop_read, femop_read);
    504     0   stevel 		errc = (*func)(arg0, uiop, ioflag, cr, ct);
    505     0   stevel 		fem_release(femsp);
    506     0   stevel 	}
    507     0   stevel 	return (errc);
    508     0   stevel }
    509     0   stevel 
    510     0   stevel static int
    511     0   stevel vhead_write(vnode_t *vp, uio_t *uiop, int ioflag, cred_t *cr,
    512  5331      amw 	caller_context_t *ct)
    513     0   stevel {
    514     0   stevel 	femarg_t	farg;
    515     0   stevel 	struct fem_list	*femsp;
    516     0   stevel 	int		(*func)();
    517     0   stevel 	void		*arg0;
    518     0   stevel 	int		errc;
    519     0   stevel 
    520     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
    521     0   stevel 		func = (int (*)()) (vp->v_op->vop_write);
    522     0   stevel 		arg0 = vp;
    523     0   stevel 		fem_unlock(vp->v_femhead);
    524     0   stevel 		errc = (*func)(arg0, uiop, ioflag, cr, ct);
    525     0   stevel 	} else {
    526     0   stevel 		fem_addref(femsp);
    527     0   stevel 		fem_unlock(vp->v_femhead);
    528     0   stevel 		farg.fa_vnode.vp = vp;
    529     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    530  3898      rsb 		vsop_find(&farg, &func, int, &arg0, vop_write, femop_write);
    531     0   stevel 		errc = (*func)(arg0, uiop, ioflag, cr, ct);
    532     0   stevel 		fem_release(femsp);
    533     0   stevel 	}
    534     0   stevel 	return (errc);
    535     0   stevel }
    536     0   stevel 
    537     0   stevel static int
    538     0   stevel vhead_ioctl(vnode_t *vp, int cmd, intptr_t arg, int flag, cred_t *cr,
    539  5331      amw 	int *rvalp, caller_context_t *ct)
    540     0   stevel {
    541     0   stevel 	femarg_t	farg;
    542     0   stevel 	struct fem_list	*femsp;
    543     0   stevel 	int		(*func)();
    544     0   stevel 	void		*arg0;
    545     0   stevel 	int		errc;
    546     0   stevel 
    547     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
    548     0   stevel 		func = (int (*)()) (vp->v_op->vop_ioctl);
    549     0   stevel 		arg0 = vp;
    550     0   stevel 		fem_unlock(vp->v_femhead);
    551  5331      amw 		errc = (*func)(arg0, cmd, arg, flag, cr, rvalp, ct);
    552     0   stevel 	} else {
    553     0   stevel 		fem_addref(femsp);
    554     0   stevel 		fem_unlock(vp->v_femhead);
    555     0   stevel 		farg.fa_vnode.vp = vp;
    556     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    557  3898      rsb 		vsop_find(&farg, &func, int, &arg0, vop_ioctl, femop_ioctl);
    558  5331      amw 		errc = (*func)(arg0, cmd, arg, flag, cr, rvalp, ct);
    559     0   stevel 		fem_release(femsp);
    560     0   stevel 	}
    561     0   stevel 	return (errc);
    562     0   stevel }
    563     0   stevel 
    564     0   stevel static int
    565  5331      amw vhead_setfl(vnode_t *vp, int oflags, int nflags, cred_t *cr,
    566  5331      amw 	caller_context_t *ct)
    567     0   stevel {
    568     0   stevel 	femarg_t	farg;
    569     0   stevel 	struct fem_list	*femsp;
    570     0   stevel 	int		(*func)();
    571     0   stevel 	void		*arg0;
    572     0   stevel 	int		errc;
    573     0   stevel 
    574     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
    575     0   stevel 		func = (int (*)()) (vp->v_op->vop_setfl);
    576     0   stevel 		arg0 = vp;
    577     0   stevel 		fem_unlock(vp->v_femhead);
    578  5331      amw 		errc = (*func)(arg0, oflags, nflags, cr, ct);
    579     0   stevel 	} else {
    580     0   stevel 		fem_addref(femsp);
    581     0   stevel 		fem_unlock(vp->v_femhead);
    582     0   stevel 		farg.fa_vnode.vp = vp;
    583     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    584  3898      rsb 		vsop_find(&farg, &func, int, &arg0, vop_setfl, femop_setfl);
    585  5331      amw 		errc = (*func)(arg0, oflags, nflags, cr, ct);
    586     0   stevel 		fem_release(femsp);
    587     0   stevel 	}
    588     0   stevel 	return (errc);
    589     0   stevel }
    590     0   stevel 
    591     0   stevel static int
    592  5331      amw vhead_getattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr,
    593  5331      amw 	caller_context_t *ct)
    594     0   stevel {
    595     0   stevel 	femarg_t	farg;
    596     0   stevel 	struct fem_list	*femsp;
    597     0   stevel 	int		(*func)();
    598     0   stevel 	void		*arg0;
    599     0   stevel 	int		errc;
    600     0   stevel 
    601     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
    602     0   stevel 		func = (int (*)()) (vp->v_op->vop_getattr);
    603     0   stevel 		arg0 = vp;
    604     0   stevel 		fem_unlock(vp->v_femhead);
    605  5331      amw 		errc = (*func)(arg0, vap, flags, cr, ct);
    606     0   stevel 	} else {
    607     0   stevel 		fem_addref(femsp);
    608     0   stevel 		fem_unlock(vp->v_femhead);
    609     0   stevel 		farg.fa_vnode.vp = vp;
    610     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    611     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_getattr,
    612  6264  rm15945 		    femop_getattr);
    613  5331      amw 		errc = (*func)(arg0, vap, flags, cr, ct);
    614     0   stevel 		fem_release(femsp);
    615     0   stevel 	}
    616     0   stevel 	return (errc);
    617     0   stevel }
    618     0   stevel 
    619     0   stevel static int
    620     0   stevel vhead_setattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr,
    621     0   stevel 	caller_context_t *ct)
    622     0   stevel {
    623     0   stevel 	femarg_t	farg;
    624     0   stevel 	struct fem_list	*femsp;
    625     0   stevel 	int		(*func)();
    626     0   stevel 	void		*arg0;
    627     0   stevel 	int		errc;
    628     0   stevel 
    629     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
    630     0   stevel 		func = (int (*)()) (vp->v_op->vop_setattr);
    631     0   stevel 		arg0 = vp;
    632     0   stevel 		fem_unlock(vp->v_femhead);
    633     0   stevel 		errc = (*func)(arg0, vap, flags, cr, ct);
    634     0   stevel 	} else {
    635     0   stevel 		fem_addref(femsp);
    636     0   stevel 		fem_unlock(vp->v_femhead);
    637     0   stevel 		farg.fa_vnode.vp = vp;
    638     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    639     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_setattr,
    640  6264  rm15945 		    femop_setattr);
    641     0   stevel 		errc = (*func)(arg0, vap, flags, cr, ct);
    642     0   stevel 		fem_release(femsp);
    643     0   stevel 	}
    644     0   stevel 	return (errc);
    645     0   stevel }
    646     0   stevel 
    647     0   stevel static int
    648  5331      amw vhead_access(vnode_t *vp, int mode, int flags, cred_t *cr,
    649  5331      amw 	caller_context_t *ct)
    650     0   stevel {
    651     0   stevel 	femarg_t	farg;
    652     0   stevel 	struct fem_list	*femsp;
    653     0   stevel 	int		(*func)();
    654     0   stevel 	void		*arg0;
    655     0   stevel 	int		errc;
    656     0   stevel 
    657     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
    658     0   stevel 		func = (int (*)()) (vp->v_op->vop_access);
    659     0   stevel 		arg0 = vp;
    660     0   stevel 		fem_unlock(vp->v_femhead);
    661  5331      amw 		errc = (*func)(arg0, mode, flags, cr, ct);
    662     0   stevel 	} else {
    663     0   stevel 		fem_addref(femsp);
    664     0   stevel 		fem_unlock(vp->v_femhead);
    665     0   stevel 		farg.fa_vnode.vp = vp;
    666     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    667     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_access,
    668  6264  rm15945 		    femop_access);
    669  5331      amw 		errc = (*func)(arg0, mode, flags, cr, ct);
    670     0   stevel 		fem_release(femsp);
    671     0   stevel 	}
    672     0   stevel 	return (errc);
    673     0   stevel }
    674     0   stevel 
    675     0   stevel static int
    676     0   stevel vhead_lookup(vnode_t *dvp, char *nm, vnode_t **vpp, pathname_t *pnp,
    677  5331      amw 	int flags, vnode_t *rdir, cred_t *cr, caller_context_t *ct,
    678  5331      amw 	int *direntflags, pathname_t *realpnp)
    679     0   stevel {
    680     0   stevel 	femarg_t	farg;
    681     0   stevel 	struct fem_list	*femsp;
    682     0   stevel 	int		(*func)();
    683     0   stevel 	void		*arg0;
    684     0   stevel 	int		errc;
    685     0   stevel 
    686     0   stevel 	if ((femsp = fem_lock(dvp->v_femhead)) == NULL) {
    687     0   stevel 		func = (int (*)()) (dvp->v_op->vop_lookup);
    688     0   stevel 		arg0 = dvp;
    689     0   stevel 		fem_unlock(dvp->v_femhead);
    690  5331      amw 		errc = (*func)(arg0, nm, vpp, pnp, flags, rdir, cr, ct,
    691  6264  rm15945 		    direntflags, realpnp);
    692     0   stevel 	} else {
    693     0   stevel 		fem_addref(femsp);
    694     0   stevel 		fem_unlock(dvp->v_femhead);
    695     0   stevel 		farg.fa_vnode.vp = dvp;
    696     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    697     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_lookup,
    698  6264  rm15945 		    femop_lookup);
    699  5331      amw 		errc = (*func)(arg0, nm, vpp, pnp, flags, rdir, cr, ct,
    700  6264  rm15945 		    direntflags, realpnp);
    701     0   stevel 		fem_release(femsp);
    702     0   stevel 	}
    703     0   stevel 	return (errc);
    704     0   stevel }
    705     0   stevel 
    706     0   stevel static int
    707     0   stevel vhead_create(vnode_t *dvp, char *name, vattr_t *vap, vcexcl_t excl,
    708  5331      amw 	int mode, vnode_t **vpp, cred_t *cr, int flag, caller_context_t *ct,
    709  5331      amw 	vsecattr_t *vsecp)
    710     0   stevel {
    711     0   stevel 	femarg_t	farg;
    712     0   stevel 	struct fem_list	*femsp;
    713     0   stevel 	int		(*func)();
    714     0   stevel 	void		*arg0;
    715     0   stevel 	int		errc;
    716     0   stevel 
    717     0   stevel 	if ((femsp = fem_lock(dvp->v_femhead)) == NULL) {
    718     0   stevel 		func = (int (*)()) (dvp->v_op->vop_create);
    719     0   stevel 		arg0 = dvp;
    720     0   stevel 		fem_unlock(dvp->v_femhead);
    721  5331      amw 		errc = (*func)(arg0, name, vap, excl, mode, vpp, cr, flag,
    722  6264  rm15945 		    ct, vsecp);
    723     0   stevel 	} else {
    724     0   stevel 		fem_addref(femsp);
    725     0   stevel 		fem_unlock(dvp->v_femhead);
    726     0   stevel 		farg.fa_vnode.vp = dvp;
    727     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    728     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_create,
    729  6264  rm15945 		    femop_create);
    730  5331      amw 		errc = (*func)(arg0, name, vap, excl, mode, vpp, cr, flag,
    731  6264  rm15945 		    ct, vsecp);
    732     0   stevel 		fem_release(femsp);
    733     0   stevel 	}
    734     0   stevel 	return (errc);
    735     0   stevel }
    736     0   stevel 
    737     0   stevel static int
    738  5331      amw vhead_remove(vnode_t *dvp, char *nm, cred_t *cr, caller_context_t *ct,
    739  5331      amw 	int flags)
    740     0   stevel {
    741     0   stevel 	femarg_t	farg;
    742     0   stevel 	struct fem_list	*femsp;
    743     0   stevel 	int		(*func)();
    744     0   stevel 	void		*arg0;
    745     0   stevel 	int		errc;
    746     0   stevel 
    747     0   stevel 	if ((femsp = fem_lock(dvp->v_femhead)) == NULL) {
    748     0   stevel 		func = (int (*)()) (dvp->v_op->vop_remove);
    749     0   stevel 		arg0 = dvp;
    750     0   stevel 		fem_unlock(dvp->v_femhead);
    751  5331      amw 		errc = (*func)(arg0, nm, cr, ct, flags);
    752     0   stevel 	} else {
    753     0   stevel 		fem_addref(femsp);
    754     0   stevel 		fem_unlock(dvp->v_femhead);
    755     0   stevel 		farg.fa_vnode.vp = dvp;
    756     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    757     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_remove,
    758  6264  rm15945 		    femop_remove);
    759  5331      amw 		errc = (*func)(arg0, nm, cr, ct, flags);
    760     0   stevel 		fem_release(femsp);
    761     0   stevel 	}
    762     0   stevel 	return (errc);
    763     0   stevel }
    764     0   stevel 
    765     0   stevel static int
    766  5331      amw vhead_link(vnode_t *tdvp, vnode_t *svp, char *tnm, cred_t *cr,
    767  5331      amw 	caller_context_t *ct, int flags)
    768     0   stevel {
    769     0   stevel 	femarg_t	farg;
    770     0   stevel 	struct fem_list	*femsp;
    771     0   stevel 	int		(*func)();
    772     0   stevel 	void		*arg0;
    773     0   stevel 	int		errc;
    774     0   stevel 
    775     0   stevel 	if ((femsp = fem_lock(tdvp->v_femhead)) == NULL) {
    776     0   stevel 		func = (int (*)()) (tdvp->v_op->vop_link);
    777     0   stevel 		arg0 = tdvp;
    778     0   stevel 		fem_unlock(tdvp->v_femhead);
    779  5331      amw 		errc = (*func)(arg0, svp, tnm, cr, ct, flags);
    780     0   stevel 	} else {
    781     0   stevel 		fem_addref(femsp);
    782     0   stevel 		fem_unlock(tdvp->v_femhead);
    783     0   stevel 		farg.fa_vnode.vp = tdvp;
    784     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    785  3898      rsb 		vsop_find(&farg, &func, int, &arg0, vop_link, femop_link);
    786  5331      amw 		errc = (*func)(arg0, svp, tnm, cr, ct, flags);
    787     0   stevel 		fem_release(femsp);
    788     0   stevel 	}
    789     0   stevel 	return (errc);
    790     0   stevel }
    791     0   stevel 
    792     0   stevel static int
    793     0   stevel vhead_rename(vnode_t *sdvp, char *snm, vnode_t *tdvp, char *tnm,
    794  5331      amw 	cred_t *cr, caller_context_t *ct, int flags)
    795     0   stevel {
    796     0   stevel 	femarg_t	farg;
    797     0   stevel 	struct fem_list	*femsp;
    798     0   stevel 	int		(*func)();
    799     0   stevel 	void		*arg0;
    800     0   stevel 	int		errc;
    801     0   stevel 
    802     0   stevel 	if ((femsp = fem_lock(sdvp->v_femhead)) == NULL) {
    803     0   stevel 		func = (int (*)()) (sdvp->v_op->vop_rename);
    804     0   stevel 		arg0 = sdvp;
    805     0   stevel 		fem_unlock(sdvp->v_femhead);
    806  5331      amw 		errc = (*func)(arg0, snm, tdvp, tnm, cr, ct, flags);
    807     0   stevel 	} else {
    808     0   stevel 		fem_addref(femsp);
    809     0   stevel 		fem_unlock(sdvp->v_femhead);
    810     0   stevel 		farg.fa_vnode.vp = sdvp;
    811     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    812     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_rename,
    813  6264  rm15945 		    femop_rename);
    814  5331      amw 		errc = (*func)(arg0, snm, tdvp, tnm, cr, ct, flags);
    815     0   stevel 		fem_release(femsp);
    816     0   stevel 	}
    817     0   stevel 	return (errc);
    818     0   stevel }
    819     0   stevel 
    820     0   stevel static int
    821     0   stevel vhead_mkdir(vnode_t *dvp, char *dirname, vattr_t *vap, vnode_t **vpp,
    822  5331      amw 	cred_t *cr, caller_context_t *ct, int flags, vsecattr_t *vsecp)
    823     0   stevel {
    824     0   stevel 	femarg_t	farg;
    825     0   stevel 	struct fem_list	*femsp;
    826     0   stevel 	int		(*func)();
    827     0   stevel 	void		*arg0;
    828     0   stevel 	int		errc;
    829     0   stevel 
    830     0   stevel 	if ((femsp = fem_lock(dvp->v_femhead)) == NULL) {
    831     0   stevel 		func = (int (*)()) (dvp->v_op->vop_mkdir);
    832     0   stevel 		arg0 = dvp;
    833     0   stevel 		fem_unlock(dvp->v_femhead);
    834  5331      amw 		errc = (*func)(arg0, dirname, vap, vpp, cr, ct, flags, vsecp);
    835     0   stevel 	} else {
    836     0   stevel 		fem_addref(femsp);
    837     0   stevel 		fem_unlock(dvp->v_femhead);
    838     0   stevel 		farg.fa_vnode.vp = dvp;
    839     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    840  3898      rsb 		vsop_find(&farg, &func, int, &arg0, vop_mkdir, femop_mkdir);
    841  5331      amw 		errc = (*func)(arg0, dirname, vap, vpp, cr, ct, flags, vsecp);
    842     0   stevel 		fem_release(femsp);
    843     0   stevel 	}
    844     0   stevel 	return (errc);
    845     0   stevel }
    846     0   stevel 
    847     0   stevel static int
    848  5331      amw vhead_rmdir(vnode_t *dvp, char *nm, vnode_t *cdir, cred_t *cr,
    849  5331      amw 	caller_context_t *ct, int flags)
    850     0   stevel {
    851     0   stevel 	femarg_t	farg;
    852     0   stevel 	struct fem_list	*femsp;
    853     0   stevel 	int		(*func)();
    854     0   stevel 	void		*arg0;
    855     0   stevel 	int		errc;
    856     0   stevel 
    857     0   stevel 	if ((femsp = fem_lock(dvp->v_femhead)) == NULL) {
    858     0   stevel 		func = (int (*)()) (dvp->v_op->vop_rmdir);
    859     0   stevel 		arg0 = dvp;
    860     0   stevel 		fem_unlock(dvp->v_femhead);
    861  5331      amw 		errc = (*func)(arg0, nm, cdir, cr, ct, flags);
    862     0   stevel 	} else {
    863     0   stevel 		fem_addref(femsp);
    864     0   stevel 		fem_unlock(dvp->v_femhead);
    865     0   stevel 		farg.fa_vnode.vp = dvp;
    866     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    867  3898      rsb 		vsop_find(&farg, &func, int, &arg0, vop_rmdir, femop_rmdir);
    868  5331      amw 		errc = (*func)(arg0, nm, cdir, cr, ct, flags);
    869     0   stevel 		fem_release(femsp);
    870     0   stevel 	}
    871     0   stevel 	return (errc);
    872     0   stevel }
    873     0   stevel 
    874     0   stevel static int
    875  5331      amw vhead_readdir(vnode_t *vp, uio_t *uiop, cred_t *cr, int *eofp,
    876  5331      amw 	caller_context_t *ct, int flags)
    877     0   stevel {
    878     0   stevel 	femarg_t	farg;
    879     0   stevel 	struct fem_list	*femsp;
    880     0   stevel 	int		(*func)();
    881     0   stevel 	void		*arg0;
    882     0   stevel 	int		errc;
    883     0   stevel 
    884     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
    885     0   stevel 		func = (int (*)()) (vp->v_op->vop_readdir);
    886     0   stevel 		arg0 = vp;
    887     0   stevel 		fem_unlock(vp->v_femhead);
    888  5331      amw 		errc = (*func)(arg0, uiop, cr, eofp, ct, flags);
    889     0   stevel 	} else {
    890     0   stevel 		fem_addref(femsp);
    891     0   stevel 		fem_unlock(vp->v_femhead);
    892     0   stevel 		farg.fa_vnode.vp = vp;
    893     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    894     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_readdir,
    895  6264  rm15945 		    femop_readdir);
    896  5331      amw 		errc = (*func)(arg0, uiop, cr, eofp, ct, flags);
    897     0   stevel 		fem_release(femsp);
    898     0   stevel 	}
    899     0   stevel 	return (errc);
    900     0   stevel }
    901     0   stevel 
    902     0   stevel static int
    903     0   stevel vhead_symlink(vnode_t *dvp, char *linkname, vattr_t *vap, char *target,
    904  5331      amw 	cred_t *cr, caller_context_t *ct, int flags)
    905     0   stevel {
    906     0   stevel 	femarg_t	farg;
    907     0   stevel 	struct fem_list	*femsp;
    908     0   stevel 	int		(*func)();
    909     0   stevel 	void		*arg0;
    910     0   stevel 	int		errc;
    911     0   stevel 
    912     0   stevel 	if ((femsp = fem_lock(dvp->v_femhead)) == NULL) {
    913     0   stevel 		func = (int (*)()) (dvp->v_op->vop_symlink);
    914     0   stevel 		arg0 = dvp;
    915     0   stevel 		fem_unlock(dvp->v_femhead);
    916  5331      amw 		errc = (*func)(arg0, linkname, vap, target, cr, ct, flags);
    917     0   stevel 	} else {
    918     0   stevel 		fem_addref(femsp);
    919     0   stevel 		fem_unlock(dvp->v_femhead);
    920     0   stevel 		farg.fa_vnode.vp = dvp;
    921     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    922     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_symlink,
    923  6264  rm15945 		    femop_symlink);
    924  5331      amw 		errc = (*func)(arg0, linkname, vap, target, cr, ct, flags);
    925     0   stevel 		fem_release(femsp);
    926     0   stevel 	}
    927     0   stevel 	return (errc);
    928     0   stevel }
    929     0   stevel 
    930     0   stevel static int
    931  5331      amw vhead_readlink(vnode_t *vp, uio_t *uiop, cred_t *cr, caller_context_t *ct)
    932     0   stevel {
    933     0   stevel 	femarg_t	farg;
    934     0   stevel 	struct fem_list	*femsp;
    935     0   stevel 	int		(*func)();
    936     0   stevel 	void		*arg0;
    937     0   stevel 	int		errc;
    938     0   stevel 
    939     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
    940     0   stevel 		func = (int (*)()) (vp->v_op->vop_readlink);
    941     0   stevel 		arg0 = vp;
    942     0   stevel 		fem_unlock(vp->v_femhead);
    943  5331      amw 		errc = (*func)(arg0, uiop, cr, ct);
    944     0   stevel 	} else {
    945     0   stevel 		fem_addref(femsp);
    946     0   stevel 		fem_unlock(vp->v_femhead);
    947     0   stevel 		farg.fa_vnode.vp = vp;
    948     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    949     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_readlink,
    950  6264  rm15945 		    femop_readlink);
    951  5331      amw 		errc = (*func)(arg0, uiop, cr, ct);
    952     0   stevel 		fem_release(femsp);
    953     0   stevel 	}
    954     0   stevel 	return (errc);
    955     0   stevel }
    956     0   stevel 
    957     0   stevel static int
    958  5331      amw vhead_fsync(vnode_t *vp, int syncflag, cred_t *cr, caller_context_t *ct)
    959     0   stevel {
    960     0   stevel 	femarg_t	farg;
    961     0   stevel 	struct fem_list	*femsp;
    962     0   stevel 	int		(*func)();
    963     0   stevel 	void		*arg0;
    964     0   stevel 	int		errc;
    965     0   stevel 
    966     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
    967     0   stevel 		func = (int (*)()) (vp->v_op->vop_fsync);
    968     0   stevel 		arg0 = vp;
    969     0   stevel 		fem_unlock(vp->v_femhead);
    970  5331      amw 		errc = (*func)(arg0, syncflag, cr, ct);
    971     0   stevel 	} else {
    972     0   stevel 		fem_addref(femsp);
    973     0   stevel 		fem_unlock(vp->v_femhead);
    974     0   stevel 		farg.fa_vnode.vp = vp;
    975     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
    976  3898      rsb 		vsop_find(&farg, &func, int, &arg0, vop_fsync, femop_fsync);
    977  5331      amw 		errc = (*func)(arg0, syncflag, cr, ct);
    978     0   stevel 		fem_release(femsp);
    979     0   stevel 	}
    980     0   stevel 	return (errc);
    981     0   stevel }
    982     0   stevel 
    983     0   stevel static void
    984  5331      amw vhead_inactive(vnode_t *vp, cred_t *cr, caller_context_t *ct)
    985     0   stevel {
    986     0   stevel 	femarg_t	farg;
    987     0   stevel 	struct fem_list	*femsp;
    988     0   stevel 	void		(*func)();
    989     0   stevel 	void		*arg0;
    990     0   stevel 
    991     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
    992     0   stevel 		func = (void (*)()) (vp->v_op->vop_inactive);
    993     0   stevel 		arg0 = vp;
    994     0   stevel 		fem_unlock(vp->v_femhead);
    995  5331      amw 		(*func)(arg0, cr, ct);
    996     0   stevel 	} else {
    997     0   stevel 		fem_addref(femsp);
    998     0   stevel 		fem_unlock(vp->v_femhead);
    999     0   stevel 		farg.fa_vnode.vp = vp;
   1000     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1001     0   stevel 		vsop_find(&farg, &func, void, &arg0, vop_inactive,
   1002  6264  rm15945 		    femop_inactive);
   1003  5331      amw 		(*func)(arg0, cr, ct);
   1004     0   stevel 		fem_release(femsp);
   1005     0   stevel 	}
   1006     0   stevel }
   1007     0   stevel 
   1008     0   stevel static int
   1009  5331      amw vhead_fid(vnode_t *vp, fid_t *fidp, caller_context_t *ct)
   1010     0   stevel {
   1011     0   stevel 	femarg_t	farg;
   1012     0   stevel 	struct fem_list	*femsp;
   1013     0   stevel 	int		(*func)();
   1014     0   stevel 	void		*arg0;
   1015     0   stevel 	int		errc;
   1016     0   stevel 
   1017     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1018     0   stevel 		func = (int (*)()) (vp->v_op->vop_fid);
   1019     0   stevel 		arg0 = vp;
   1020     0   stevel 		fem_unlock(vp->v_femhead);
   1021  5331      amw 		errc = (*func)(arg0, fidp, ct);
   1022     0   stevel 	} else {
   1023     0   stevel 		fem_addref(femsp);
   1024     0   stevel 		fem_unlock(vp->v_femhead);
   1025     0   stevel 		farg.fa_vnode.vp = vp;
   1026     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1027  3898      rsb 		vsop_find(&farg, &func, int, &arg0, vop_fid, femop_fid);
   1028  5331      amw 		errc = (*func)(arg0, fidp, ct);
   1029     0   stevel 		fem_release(femsp);
   1030     0   stevel 	}
   1031     0   stevel 	return (errc);
   1032     0   stevel }
   1033     0   stevel 
   1034     0   stevel static int
   1035     0   stevel vhead_rwlock(vnode_t *vp, int write_lock, caller_context_t *ct)
   1036     0   stevel {
   1037     0   stevel 	femarg_t	farg;
   1038     0   stevel 	struct fem_list	*femsp;
   1039     0   stevel 	int		(*func)();
   1040     0   stevel 	void		*arg0;
   1041     0   stevel 	int		errc;
   1042     0   stevel 
   1043     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1044     0   stevel 		func = (int (*)()) (vp->v_op->vop_rwlock);
   1045     0   stevel 		arg0 = vp;
   1046     0   stevel 		fem_unlock(vp->v_femhead);
   1047     0   stevel 		errc = (*func)(arg0, write_lock, ct);
   1048     0   stevel 	} else {
   1049     0   stevel 		fem_addref(femsp);
   1050     0   stevel 		fem_unlock(vp->v_femhead);
   1051     0   stevel 		farg.fa_vnode.vp = vp;
   1052     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1053     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_rwlock,
   1054  6264  rm15945 		    femop_rwlock);
   1055     0   stevel 		errc = (*func)(arg0, write_lock, ct);
   1056     0   stevel 		fem_release(femsp);
   1057     0   stevel 	}
   1058     0   stevel 	return (errc);
   1059     0   stevel }
   1060     0   stevel 
   1061     0   stevel static void
   1062     0   stevel vhead_rwunlock(vnode_t *vp, int write_lock, caller_context_t *ct)
   1063     0   stevel {
   1064     0   stevel 	femarg_t	farg;
   1065     0   stevel 	struct fem_list	*femsp;
   1066     0   stevel 	void		(*func)();
   1067     0   stevel 	void		*arg0;
   1068     0   stevel 
   1069     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1070     0   stevel 		func = (void (*)()) (vp->v_op->vop_rwunlock);
   1071     0   stevel 		arg0 = vp;
   1072     0   stevel 		fem_unlock(vp->v_femhead);
   1073     0   stevel 		(*func)(arg0, write_lock, ct);
   1074     0   stevel 	} else {
   1075     0   stevel 		fem_addref(femsp);
   1076     0   stevel 		fem_unlock(vp->v_femhead);
   1077     0   stevel 		farg.fa_vnode.vp = vp;
   1078     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1079     0   stevel 		vsop_find(&farg, &func, void, &arg0, vop_rwunlock,
   1080  6264  rm15945 		    femop_rwunlock);
   1081     0   stevel 		(*func)(arg0, write_lock, ct);
   1082     0   stevel 		fem_release(femsp);
   1083     0   stevel 	}
   1084     0   stevel }
   1085     0   stevel 
   1086     0   stevel static int
   1087  5331      amw vhead_seek(vnode_t *vp, offset_t ooff, offset_t *noffp, caller_context_t *ct)
   1088     0   stevel {
   1089     0   stevel 	femarg_t	farg;
   1090     0   stevel 	struct fem_list	*femsp;
   1091     0   stevel 	int		(*func)();
   1092     0   stevel 	void		*arg0;
   1093     0   stevel 	int		errc;
   1094     0   stevel 
   1095     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1096     0   stevel 		func = (int (*)()) (vp->v_op->vop_seek);
   1097     0   stevel 		arg0 = vp;
   1098     0   stevel 		fem_unlock(vp->v_femhead);
   1099  5331      amw 		errc = (*func)(arg0, ooff, noffp, ct);
   1100     0   stevel 	} else {
   1101     0   stevel 		fem_addref(femsp);
   1102     0   stevel 		fem_unlock(vp->v_femhead);
   1103     0   stevel 		farg.fa_vnode.vp = vp;
   1104     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1105  3898      rsb 		vsop_find(&farg, &func, int, &arg0, vop_seek, femop_seek);
   1106  5331      amw 		errc = (*func)(arg0, ooff, noffp, ct);
   1107     0   stevel 		fem_release(femsp);
   1108     0   stevel 	}
   1109     0   stevel 	return (errc);
   1110     0   stevel }
   1111     0   stevel 
   1112     0   stevel static int
   1113  5331      amw vhead_cmp(vnode_t *vp1, vnode_t *vp2, caller_context_t *ct)
   1114     0   stevel {
   1115     0   stevel 	femarg_t	farg;
   1116     0   stevel 	struct fem_list	*femsp;
   1117     0   stevel 	int		(*func)();
   1118     0   stevel 	void		*arg0;
   1119     0   stevel 	int		errc;
   1120     0   stevel 
   1121     0   stevel 	if ((femsp = fem_lock(vp1->v_femhead)) == NULL) {
   1122     0   stevel 		func = (int (*)()) (vp1->v_op->vop_cmp);
   1123     0   stevel 		arg0 = vp1;
   1124     0   stevel 		fem_unlock(vp1->v_femhead);
   1125  5331      amw 		errc = (*func)(arg0, vp2, ct);
   1126     0   stevel 	} else {
   1127     0   stevel 		fem_addref(femsp);
   1128     0   stevel 		fem_unlock(vp1->v_femhead);
   1129     0   stevel 		farg.fa_vnode.vp = vp1;
   1130     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1131  3898      rsb 		vsop_find(&farg, &func, int, &arg0, vop_cmp, femop_cmp);
   1132  5331      amw 		errc = (*func)(arg0, vp2, ct);
   1133     0   stevel 		fem_release(femsp);
   1134     0   stevel 	}
   1135     0   stevel 	return (errc);
   1136     0   stevel }
   1137     0   stevel 
   1138     0   stevel static int
   1139     0   stevel vhead_frlock(vnode_t *vp, int cmd, struct flock64 *bfp, int flag,
   1140  5331      amw 	offset_t offset, struct flk_callback *flk_cbp, cred_t *cr,
   1141  5331      amw 	caller_context_t *ct)
   1142     0   stevel {
   1143     0   stevel 	femarg_t	farg;
   1144     0   stevel 	struct fem_list	*femsp;
   1145     0   stevel 	int		(*func)();
   1146     0   stevel 	void		*arg0;
   1147     0   stevel 	int		errc;
   1148     0   stevel 
   1149     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1150     0   stevel 		func = (int (*)()) (vp->v_op->vop_frlock);
   1151     0   stevel 		arg0 = vp;
   1152     0   stevel 		fem_unlock(vp->v_femhead);
   1153  5331      amw 		errc = (*func)(arg0, cmd, bfp, flag, offset, flk_cbp, cr, ct);
   1154     0   stevel 	} else {
   1155     0   stevel 		fem_addref(femsp);
   1156     0   stevel 		fem_unlock(vp->v_femhead);
   1157     0   stevel 		farg.fa_vnode.vp = vp;
   1158     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1159     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_frlock,
   1160  6264  rm15945 		    femop_frlock);
   1161  5331      amw 		errc = (*func)(arg0, cmd, bfp, flag, offset, flk_cbp, cr, ct);
   1162     0   stevel 		fem_release(femsp);
   1163     0   stevel 	}
   1164     0   stevel 	return (errc);
   1165     0   stevel }
   1166     0   stevel 
   1167     0   stevel static int
   1168     0   stevel vhead_space(vnode_t *vp, int cmd, struct flock64 *bfp, int flag,
   1169     0   stevel 	offset_t offset, cred_t *cr, caller_context_t *ct)
   1170     0   stevel {
   1171     0   stevel 	femarg_t	farg;
   1172     0   stevel 	struct fem_list	*femsp;
   1173     0   stevel 	int		(*func)();
   1174     0   stevel 	void		*arg0;
   1175     0   stevel 	int		errc;
   1176     0   stevel 
   1177     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1178     0   stevel 		func = (int (*)()) (vp->v_op->vop_space);
   1179     0   stevel 		arg0 = vp;
   1180     0   stevel 		fem_unlock(vp->v_femhead);
   1181     0   stevel 		errc = (*func)(arg0, cmd, bfp, flag, offset, cr, ct);
   1182     0   stevel 	} else {
   1183     0   stevel 		fem_addref(femsp);
   1184     0   stevel 		fem_unlock(vp->v_femhead);
   1185     0   stevel 		farg.fa_vnode.vp = vp;
   1186     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1187  3898      rsb 		vsop_find(&farg, &func, int, &arg0, vop_space, femop_space);
   1188     0   stevel 		errc = (*func)(arg0, cmd, bfp, flag, offset, cr, ct);
   1189     0   stevel 		fem_release(femsp);
   1190     0   stevel 	}
   1191     0   stevel 	return (errc);
   1192     0   stevel }
   1193     0   stevel 
   1194     0   stevel static int
   1195  5331      amw vhead_realvp(vnode_t *vp, vnode_t **vpp, caller_context_t *ct)
   1196     0   stevel {
   1197     0   stevel 	femarg_t	farg;
   1198     0   stevel 	struct fem_list	*femsp;
   1199     0   stevel 	int		(*func)();
   1200     0   stevel 	void		*arg0;
   1201     0   stevel 	int		errc;
   1202     0   stevel 
   1203     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1204     0   stevel 		func = (int (*)()) (vp->v_op->vop_realvp);
   1205     0   stevel 		arg0 = vp;
   1206     0   stevel 		fem_unlock(vp->v_femhead);
   1207  5331      amw 		errc = (*func)(arg0, vpp, ct);
   1208     0   stevel 	} else {
   1209     0   stevel 		fem_addref(femsp);
   1210     0   stevel 		fem_unlock(vp->v_femhead);
   1211     0   stevel 		farg.fa_vnode.vp = vp;
   1212     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1213     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_realvp,
   1214  6264  rm15945 		    femop_realvp);
   1215  5331      amw 		errc = (*func)(arg0, vpp, ct);
   1216     0   stevel 		fem_release(femsp);
   1217     0   stevel 	}
   1218     0   stevel 	return (errc);
   1219     0   stevel }
   1220     0   stevel 
   1221     0   stevel static int
   1222     0   stevel vhead_getpage(vnode_t *vp, offset_t off, size_t len, uint_t *protp,
   1223     0   stevel 	struct page **plarr, size_t plsz, struct seg *seg, caddr_t addr,
   1224  5331      amw 	enum seg_rw rw, cred_t *cr, caller_context_t *ct)
   1225     0   stevel {
   1226     0   stevel 	femarg_t	farg;
   1227     0   stevel 	struct fem_list	*femsp;
   1228     0   stevel 	int		(*func)();
   1229     0   stevel 	void		*arg0;
   1230     0   stevel 	int		errc;
   1231     0   stevel 
   1232     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1233     0   stevel 		func = (int (*)()) (vp->v_op->vop_getpage);
   1234     0   stevel 		arg0 = vp;
   1235     0   stevel 		fem_unlock(vp->v_femhead);
   1236     0   stevel 		errc = (*func)(arg0, off, len, protp, plarr, plsz, seg,
   1237  6264  rm15945 		    addr, rw, cr, ct);
   1238     0   stevel 	} else {
   1239     0   stevel 		fem_addref(femsp);
   1240     0   stevel 		fem_unlock(vp->v_femhead);
   1241     0   stevel 		farg.fa_vnode.vp = vp;
   1242     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1243     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_getpage,
   1244  6264  rm15945 		    femop_getpage);
   1245     0   stevel 		errc = (*func)(arg0, off, len, protp, plarr, plsz, seg,
   1246  6264  rm15945 		    addr, rw, cr, ct);
   1247     0   stevel 		fem_release(femsp);
   1248     0   stevel 	}
   1249     0   stevel 	return (errc);
   1250     0   stevel }
   1251     0   stevel 
   1252     0   stevel static int
   1253  5331      amw vhead_putpage(vnode_t *vp, offset_t off, size_t len, int flags, cred_t *cr,
   1254  5331      amw 	caller_context_t *ct)
   1255     0   stevel {
   1256     0   stevel 	femarg_t	farg;
   1257     0   stevel 	struct fem_list	*femsp;
   1258     0   stevel 	int		(*func)();
   1259     0   stevel 	void		*arg0;
   1260     0   stevel 	int		errc;
   1261     0   stevel 
   1262     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1263     0   stevel 		func = (int (*)()) (vp->v_op->vop_putpage);
   1264     0   stevel 		arg0 = vp;
   1265     0   stevel 		fem_unlock(vp->v_femhead);
   1266  5331      amw 		errc = (*func)(arg0, off, len, flags, cr, ct);
   1267     0   stevel 	} else {
   1268     0   stevel 		fem_addref(femsp);
   1269     0   stevel 		fem_unlock(vp->v_femhead);
   1270     0   stevel 		farg.fa_vnode.vp = vp;
   1271     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1272     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_putpage,
   1273  6264  rm15945 		    femop_putpage);
   1274  5331      amw 		errc = (*func)(arg0, off, len, flags, cr, ct);
   1275     0   stevel 		fem_release(femsp);
   1276     0   stevel 	}
   1277     0   stevel 	return (errc);
   1278     0   stevel }
   1279     0   stevel 
   1280     0   stevel static int
   1281     0   stevel vhead_map(vnode_t *vp, offset_t off, struct as *as, caddr_t *addrp,
   1282     0   stevel 	size_t len, uchar_t prot, uchar_t maxprot, uint_t flags,
   1283  5331      amw 	cred_t *cr, caller_context_t *ct)
   1284     0   stevel {
   1285     0   stevel 	femarg_t	farg;
   1286     0   stevel 	struct fem_list	*femsp;
   1287     0   stevel 	int		(*func)();
   1288     0   stevel 	void		*arg0;
   1289     0   stevel 	int		errc;
   1290     0   stevel 
   1291     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1292     0   stevel 		func = (int (*)()) (vp->v_op->vop_map);
   1293     0   stevel 		arg0 = vp;
   1294     0   stevel 		fem_unlock(vp->v_femhead);
   1295     0   stevel 		errc = (*func)(arg0, off, as, addrp, len, prot, maxprot,
   1296  6264  rm15945 		    flags, cr, ct);
   1297     0   stevel 	} else {
   1298     0   stevel 		fem_addref(femsp);
   1299     0   stevel 		fem_unlock(vp->v_femhead);
   1300     0   stevel 		farg.fa_vnode.vp = vp;
   1301     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1302  3898      rsb 		vsop_find(&farg, &func, int, &arg0, vop_map, femop_map);
   1303     0   stevel 		errc = (*func)(arg0, off, as, addrp, len, prot, maxprot,
   1304  6264  rm15945 		    flags, cr, ct);
   1305     0   stevel 		fem_release(femsp);
   1306     0   stevel 	}
   1307     0   stevel 	return (errc);
   1308     0   stevel }
   1309     0   stevel 
   1310     0   stevel static int
   1311     0   stevel vhead_addmap(vnode_t *vp, offset_t off, struct as *as, caddr_t addr,
   1312     0   stevel 	size_t len, uchar_t prot, uchar_t maxprot, uint_t flags,
   1313  5331      amw 	cred_t *cr, caller_context_t *ct)
   1314     0   stevel {
   1315     0   stevel 	femarg_t	farg;
   1316     0   stevel 	struct fem_list	*femsp;
   1317     0   stevel 	int		(*func)();
   1318     0   stevel 	void		*arg0;
   1319     0   stevel 	int		errc;
   1320     0   stevel 
   1321     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1322     0   stevel 		func = (int (*)()) (vp->v_op->vop_addmap);
   1323     0   stevel 		arg0 = vp;
   1324     0   stevel 		fem_unlock(vp->v_femhead);
   1325     0   stevel 		errc = (*func)(arg0, off, as, addr, len, prot, maxprot,
   1326  6264  rm15945 		    flags, cr, ct);
   1327     0   stevel 	} else {
   1328     0   stevel 		fem_addref(femsp);
   1329     0   stevel 		fem_unlock(vp->v_femhead);
   1330     0   stevel 		farg.fa_vnode.vp = vp;
   1331     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1332     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_addmap,
   1333  6264  rm15945 		    femop_addmap);
   1334     0   stevel 		errc = (*func)(arg0, off, as, addr, len, prot, maxprot,
   1335  6264  rm15945 		    flags, cr, ct);
   1336     0   stevel 		fem_release(femsp);
   1337     0   stevel 	}
   1338     0   stevel 	return (errc);
   1339     0   stevel }
   1340     0   stevel 
   1341     0   stevel static int
   1342     0   stevel vhead_delmap(vnode_t *vp, offset_t off, struct as *as, caddr_t addr,
   1343  5331      amw 	size_t len, uint_t prot, uint_t maxprot, uint_t flags, cred_t *cr,
   1344  5331      amw 	caller_context_t *ct)
   1345     0   stevel {
   1346     0   stevel 	femarg_t	farg;
   1347     0   stevel 	struct fem_list	*femsp;
   1348     0   stevel 	int		(*func)();
   1349     0   stevel 	void		*arg0;
   1350     0   stevel 	int		errc;
   1351     0   stevel 
   1352     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1353     0   stevel 		func = (int (*)()) (vp->v_op->vop_delmap);
   1354     0   stevel 		arg0 = vp;
   1355     0   stevel 		fem_unlock(vp->v_femhead);
   1356     0   stevel 		errc = (*func)(arg0, off, as, addr, len, prot, maxprot,
   1357  6264  rm15945 		    flags, cr, ct);
   1358     0   stevel 	} else {
   1359     0   stevel 		fem_addref(femsp);
   1360     0   stevel 		fem_unlock(vp->v_femhead);
   1361     0   stevel 		farg.fa_vnode.vp = vp;
   1362     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1363     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_delmap,
   1364  6264  rm15945 		    femop_delmap);
   1365     0   stevel 		errc = (*func)(arg0, off, as, addr, len, prot, maxprot,
   1366  6264  rm15945 		    flags, cr, ct);
   1367     0   stevel 		fem_release(femsp);
   1368     0   stevel 	}
   1369     0   stevel 	return (errc);
   1370     0   stevel }
   1371     0   stevel 
   1372     0   stevel static int
   1373     0   stevel vhead_poll(vnode_t *vp, short events, int anyyet, short *reventsp,
   1374  5331      amw 	struct pollhead **phpp, caller_context_t *ct)
   1375     0   stevel {
   1376     0   stevel 	femarg_t	farg;
   1377     0   stevel 	struct fem_list	*femsp;
   1378     0   stevel 	int		(*func)();
   1379     0   stevel 	void		*arg0;
   1380     0   stevel 	int		errc;
   1381     0   stevel 
   1382     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1383     0   stevel 		func = (int (*)()) (vp->v_op->vop_poll);
   1384     0   stevel 		arg0 = vp;
   1385     0   stevel 		fem_unlock(vp->v_femhead);
   1386  5331      amw 		errc = (*func)(arg0, events, anyyet, reventsp, phpp, ct);
   1387     0   stevel 	} else {
   1388     0   stevel 		fem_addref(femsp);
   1389     0   stevel 		fem_unlock(vp->v_femhead);
   1390     0   stevel 		farg.fa_vnode.vp = vp;
   1391     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1392  3898      rsb 		vsop_find(&farg, &func, int, &arg0, vop_poll, femop_poll);
   1393  5331      amw 		errc = (*func)(arg0, events, anyyet, reventsp, phpp, ct);
   1394     0   stevel 		fem_release(femsp);
   1395     0   stevel 	}
   1396     0   stevel 	return (errc);
   1397     0   stevel }
   1398     0   stevel 
   1399     0   stevel static int
   1400  6264  rm15945 vhead_dump(vnode_t *vp, caddr_t addr, offset_t lbdn, offset_t dblks,
   1401  6264  rm15945     caller_context_t *ct)
   1402     0   stevel {
   1403     0   stevel 	femarg_t	farg;
   1404     0   stevel 	struct fem_list	*femsp;
   1405     0   stevel 	int		(*func)();
   1406     0   stevel 	void		*arg0;
   1407     0   stevel 	int		errc;
   1408     0   stevel 
   1409     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1410     0   stevel 		func = (int (*)()) (vp->v_op->vop_dump);
   1411     0   stevel 		arg0 = vp;
   1412     0   stevel 		fem_unlock(vp->v_femhead);
   1413  5331      amw 		errc = (*func)(arg0, addr, lbdn, dblks, ct);
   1414     0   stevel 	} else {
   1415     0   stevel 		fem_addref(femsp);
   1416     0   stevel 		fem_unlock(vp->v_femhead);
   1417     0   stevel 		farg.fa_vnode.vp = vp;
   1418     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1419  3898      rsb 		vsop_find(&farg, &func, int, &arg0, vop_dump, femop_dump);
   1420  5331      amw 		errc = (*func)(arg0, addr, lbdn, dblks, ct);
   1421     0   stevel 		fem_release(femsp);
   1422     0   stevel 	}
   1423     0   stevel 	return (errc);
   1424     0   stevel }
   1425     0   stevel 
   1426     0   stevel static int
   1427  5331      amw vhead_pathconf(vnode_t *vp, int cmd, ulong_t *valp, cred_t *cr,
   1428  5331      amw 	caller_context_t *ct)
   1429     0   stevel {
   1430     0   stevel 	femarg_t	farg;
   1431     0   stevel 	struct fem_list	*femsp;
   1432     0   stevel 	int		(*func)();
   1433     0   stevel 	void		*arg0;
   1434     0   stevel 	int		errc;
   1435     0   stevel 
   1436     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1437     0   stevel 		func = (int (*)()) (vp->v_op->vop_pathconf);
   1438     0   stevel 		arg0 = vp;
   1439     0   stevel 		fem_unlock(vp->v_femhead);
   1440  5331      amw 		errc = (*func)(arg0, cmd, valp, cr, ct);
   1441     0   stevel 	} else {
   1442     0   stevel 		fem_addref(femsp);
   1443     0   stevel 		fem_unlock(vp->v_femhead);
   1444     0   stevel 		farg.fa_vnode.vp = vp;
   1445     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1446     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_pathconf,
   1447  6264  rm15945 		    femop_pathconf);
   1448  5331      amw 		errc = (*func)(arg0, cmd, valp, cr, ct);
   1449     0   stevel 		fem_release(femsp);
   1450     0   stevel 	}
   1451     0   stevel 	return (errc);
   1452     0   stevel }
   1453     0   stevel 
   1454     0   stevel static int
   1455     0   stevel vhead_pageio(vnode_t *vp, struct page *pp, u_offset_t io_off,
   1456  5331      amw 	size_t io_len, int flags, cred_t *cr, caller_context_t *ct)
   1457     0   stevel {
   1458     0   stevel 	femarg_t	farg;
   1459     0   stevel 	struct fem_list	*femsp;
   1460     0   stevel 	int		(*func)();
   1461     0   stevel 	void		*arg0;
   1462     0   stevel 	int		errc;
   1463     0   stevel 
   1464     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1465     0   stevel 		func = (int (*)()) (vp->v_op->vop_pageio);
   1466     0   stevel 		arg0 = vp;
   1467     0   stevel 		fem_unlock(vp->v_femhead);
   1468  5331      amw 		errc = (*func)(arg0, pp, io_off, io_len, flags, cr, ct);
   1469     0   stevel 	} else {
   1470     0   stevel 		fem_addref(femsp);
   1471     0   stevel 		fem_unlock(vp->v_femhead);
   1472     0   stevel 		farg.fa_vnode.vp = vp;
   1473     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1474     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_pageio,
   1475  6264  rm15945 		    femop_pageio);
   1476  5331      amw 		errc = (*func)(arg0, pp, io_off, io_len, flags, cr, ct);
   1477     0   stevel 		fem_release(femsp);
   1478     0   stevel 	}
   1479     0   stevel 	return (errc);
   1480     0   stevel }
   1481     0   stevel 
   1482     0   stevel static int
   1483  6264  rm15945 vhead_dumpctl(vnode_t *vp, int action, offset_t *blkp, caller_context_t *ct)
   1484     0   stevel {
   1485     0   stevel 	femarg_t	farg;
   1486     0   stevel 	struct fem_list	*femsp;
   1487     0   stevel 	int		(*func)();
   1488     0   stevel 	void		*arg0;
   1489     0   stevel 	int		errc;
   1490     0   stevel 
   1491     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1492     0   stevel 		func = (int (*)()) (vp->v_op->vop_dumpctl);
   1493     0   stevel 		arg0 = vp;
   1494     0   stevel 		fem_unlock(vp->v_femhead);
   1495  5331      amw 		errc = (*func)(arg0, action, blkp, ct);
   1496     0   stevel 	} else {
   1497     0   stevel 		fem_addref(femsp);
   1498     0   stevel 		fem_unlock(vp->v_femhead);
   1499     0   stevel 		farg.fa_vnode.vp = vp;
   1500     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1501     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_dumpctl,
   1502  6264  rm15945 		    femop_dumpctl);
   1503  5331      amw 		errc = (*func)(arg0, action, blkp, ct);
   1504     0   stevel 		fem_release(femsp);
   1505     0   stevel 	}
   1506     0   stevel 	return (errc);
   1507     0   stevel }
   1508     0   stevel 
   1509     0   stevel static void
   1510  5331      amw vhead_dispose(vnode_t *vp, struct page *pp, int flag, int dn, cred_t *cr,
   1511  5331      amw 	caller_context_t *ct)
   1512     0   stevel {
   1513     0   stevel 	femarg_t	farg;
   1514     0   stevel 	struct fem_list	*femsp;
   1515     0   stevel 	void		(*func)();
   1516     0   stevel 	void		*arg0;
   1517     0   stevel 
   1518     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1519     0   stevel 		func = (void (*)()) (vp->v_op->vop_dispose);
   1520     0   stevel 		arg0 = vp;
   1521     0   stevel 		fem_unlock(vp->v_femhead);
   1522  5331      amw 		(*func)(arg0, pp, flag, dn, cr, ct);
   1523     0   stevel 	} else {
   1524     0   stevel 		fem_addref(femsp);
   1525     0   stevel 		fem_unlock(vp->v_femhead);
   1526     0   stevel 		farg.fa_vnode.vp = vp;
   1527     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1528     0   stevel 		vsop_find(&farg, &func, void, &arg0, vop_dispose,
   1529  6264  rm15945 		    femop_dispose);
   1530  5331      amw 		(*func)(arg0, pp, flag, dn, cr, ct);
   1531     0   stevel 		fem_release(femsp);
   1532     0   stevel 	}
   1533     0   stevel }
   1534     0   stevel 
   1535     0   stevel static int
   1536  5331      amw vhead_setsecattr(vnode_t *vp, vsecattr_t *vsap, int flag, cred_t *cr,
   1537  5331      amw 	caller_context_t *ct)
   1538     0   stevel {
   1539     0   stevel 	femarg_t	farg;
   1540     0   stevel 	struct fem_list	*femsp;
   1541     0   stevel 	int		(*func)();
   1542     0   stevel 	void		*arg0;
   1543     0   stevel 	int		errc;
   1544     0   stevel 
   1545     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1546     0   stevel 		func = (int (*)()) (vp->v_op->vop_setsecattr);
   1547     0   stevel 		arg0 = vp;
   1548     0   stevel 		fem_unlock(vp->v_femhead);
   1549  5331      amw 		errc = (*func)(arg0, vsap, flag, cr, ct);
   1550     0   stevel 	} else {
   1551     0   stevel 		fem_addref(femsp);
   1552     0   stevel 		fem_unlock(vp->v_femhead);
   1553     0   stevel 		farg.fa_vnode.vp = vp;
   1554     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1555     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_setsecattr,
   1556  6264  rm15945 		    femop_setsecattr);
   1557  5331      amw 		errc = (*func)(arg0, vsap, flag, cr, ct);
   1558     0   stevel 		fem_release(femsp);
   1559     0   stevel 	}
   1560     0   stevel 	return (errc);
   1561     0   stevel }
   1562     0   stevel 
   1563     0   stevel static int
   1564  5331      amw vhead_getsecattr(vnode_t *vp, vsecattr_t *vsap, int flag, cred_t *cr,
   1565  5331      amw 	caller_context_t *ct)
   1566     0   stevel {
   1567     0   stevel 	femarg_t	farg;
   1568     0   stevel 	struct fem_list	*femsp;
   1569     0   stevel 	int		(*func)();
   1570     0   stevel 	void		*arg0;
   1571     0   stevel 	int		errc;
   1572     0   stevel 
   1573     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1574     0   stevel 		func = (int (*)()) (vp->v_op->vop_getsecattr);
   1575     0   stevel 		arg0 = vp;
   1576     0   stevel 		fem_unlock(vp->v_femhead);
   1577  5331      amw 		errc = (*func)(arg0, vsap, flag, cr, ct);
   1578     0   stevel 	} else {
   1579     0   stevel 		fem_addref(femsp);
   1580     0   stevel 		fem_unlock(vp->v_femhead);
   1581     0   stevel 		farg.fa_vnode.vp = vp;
   1582     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1583     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_getsecattr,
   1584  6264  rm15945 		    femop_getsecattr);
   1585  5331      amw 		errc = (*func)(arg0, vsap, flag, cr, ct);
   1586     0   stevel 		fem_release(femsp);
   1587     0   stevel 	}
   1588     0   stevel 	return (errc);
   1589     0   stevel }
   1590     0   stevel 
   1591     0   stevel static int
   1592     0   stevel vhead_shrlock(vnode_t *vp, int cmd, struct shrlock *shr, int flag,
   1593  5331      amw 	cred_t *cr, caller_context_t *ct)
   1594     0   stevel {
   1595     0   stevel 	femarg_t	farg;
   1596     0   stevel 	struct fem_list	*femsp;
   1597     0   stevel 	int		(*func)();
   1598     0   stevel 	void		*arg0;
   1599     0   stevel 	int		errc;
   1600     0   stevel 
   1601     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1602     0   stevel 		func = (int (*)()) (vp->v_op->vop_shrlock);
   1603     0   stevel 		arg0 = vp;
   1604     0   stevel 		fem_unlock(vp->v_femhead);
   1605  5331      amw 		errc = (*func)(arg0, cmd, shr, flag, cr, ct);
   1606     0   stevel 	} else {
   1607     0   stevel 		fem_addref(femsp);
   1608     0   stevel 		fem_unlock(vp->v_femhead);
   1609     0   stevel 		farg.fa_vnode.vp = vp;
   1610     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1611     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_shrlock,
   1612  6264  rm15945 		    femop_shrlock);
   1613  5331      amw 		errc = (*func)(arg0, cmd, shr, flag, cr, ct);
   1614     0   stevel 		fem_release(femsp);
   1615     0   stevel 	}
   1616     0   stevel 	return (errc);
   1617     0   stevel }
   1618     0   stevel 
   1619     0   stevel static int
   1620  5331      amw vhead_vnevent(vnode_t *vp, vnevent_t vnevent, vnode_t *dvp, char *cname,
   1621  5331      amw     caller_context_t *ct)
   1622     0   stevel {
   1623     0   stevel 	femarg_t	farg;
   1624     0   stevel 	struct fem_list	*femsp;
   1625     0   stevel 	int		(*func)();
   1626     0   stevel 	void		*arg0;
   1627     0   stevel 	int		errc;
   1628     0   stevel 
   1629     0   stevel 	if ((femsp = fem_lock(vp->v_femhead)) == NULL) {
   1630     0   stevel 		func = (int (*)()) (vp->v_op->vop_vnevent);
   1631     0   stevel 		arg0 = vp;
   1632     0   stevel 		fem_unlock(vp->v_femhead);
   1633  5331      amw 		errc = (*func)(arg0, vnevent, dvp, cname, ct);
   1634     0   stevel 	} else {
   1635     0   stevel 		fem_addref(femsp);
   1636     0   stevel 		fem_unlock(vp->v_femhead);
   1637     0   stevel 		farg.fa_vnode.vp = vp;
   1638     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1639     0   stevel 		vsop_find(&farg, &func, int, &arg0, vop_vnevent,
   1640  6264  rm15945 		    femop_vnevent);
   1641  5331      amw 		errc = (*func)(arg0, vnevent, dvp, cname, ct);
   1642     0   stevel 		fem_release(femsp);
   1643     0   stevel 	}
   1644     0   stevel 	return (errc);
   1645     0   stevel }
   1646     0   stevel 
   1647     0   stevel static int
   1648     0   stevel fshead_mount(vfs_t *vfsp, vnode_t *mvp, struct mounta *uap, cred_t *cr)
   1649     0   stevel {
   1650     0   stevel 	fsemarg_t	farg;
   1651     0   stevel 	struct fem_list	*femsp;
   1652     0   stevel 	int		(*func)();
   1653     0   stevel 	void		*arg0;
   1654     0   stevel 	int		errc;
   1655     0   stevel 
   1656  1925      rsb 	ASSERT(vfsp->vfs_implp);
   1657  1925      rsb 
   1658     0   stevel 	if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) {
   1659     0   stevel 		func = (int (*)()) vfsp->vfs_op->vfs_mount;
   1660     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1661     0   stevel 		errc = (*func)(vfsp, mvp, uap, cr);
   1662     0   stevel 	} else {
   1663     0   stevel 		fem_addref(femsp);
   1664     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1665     0   stevel 		farg.fa_vnode.vfsp = vfsp;
   1666     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1667     0   stevel 		vfsop_find(&farg, &func, int, &arg0, vfs_mount,
   1668  6264  rm15945 		    fsemop_mount);
   1669     0   stevel 		errc = (*func)(arg0, mvp, uap, cr);
   1670     0   stevel 		fem_release(femsp);
   1671     0   stevel 	}
   1672     0   stevel 	return (errc);
   1673     0   stevel }
   1674     0   stevel 
   1675     0   stevel static int
   1676     0   stevel fshead_unmount(vfs_t *vfsp, int flag, cred_t *cr)
   1677     0   stevel {
   1678     0   stevel 	fsemarg_t	farg;
   1679     0   stevel 	struct fem_list	*femsp;
   1680     0   stevel 	int		(*func)();
   1681     0   stevel 	void		*arg0;
   1682     0   stevel 	int		errc;
   1683  1925      rsb 
   1684  1925      rsb 	ASSERT(vfsp->vfs_implp);
   1685     0   stevel 
   1686     0   stevel 	if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) {
   1687     0   stevel 		func = (int (*)()) vfsp->vfs_op->vfs_unmount;
   1688     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1689     0   stevel 		errc = (*func)(vfsp, flag, cr);
   1690     0   stevel 	} else {
   1691     0   stevel 		fem_addref(femsp);
   1692     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1693     0   stevel 		farg.fa_vnode.vfsp = vfsp;
   1694     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1695     0   stevel 		vfsop_find(&farg, &func, int, &arg0, vfs_unmount,
   1696  6264  rm15945 		    fsemop_unmount);
   1697     0   stevel 		errc = (*func)(arg0, flag, cr);
   1698     0   stevel 		fem_release(femsp);
   1699     0   stevel 	}
   1700     0   stevel 	return (errc);
   1701     0   stevel }
   1702     0   stevel 
   1703     0   stevel static int
   1704     0   stevel fshead_root(vfs_t *vfsp, vnode_t **vpp)
   1705     0   stevel {
   1706     0   stevel 	fsemarg_t	farg;
   1707     0   stevel 	struct fem_list	*femsp;
   1708     0   stevel 	int		(*func)();
   1709     0   stevel 	void		*arg0;
   1710     0   stevel 	int		errc;
   1711     0   stevel 
   1712  1925      rsb 	ASSERT(vfsp->vfs_implp);
   1713  1925      rsb 
   1714     0   stevel 	if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) {
   1715     0   stevel 		func = (int (*)()) vfsp->vfs_op->vfs_root;
   1716     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1717     0   stevel 		errc = (*func)(vfsp, vpp);
   1718     0   stevel 	} else {
   1719     0   stevel 		fem_addref(femsp);
   1720     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1721     0   stevel 		farg.fa_vnode.vfsp = vfsp;
   1722     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1723  3898      rsb 		vfsop_find(&farg, &func, int, &arg0, vfs_root, fsemop_root);
   1724     0   stevel 		errc = (*func)(arg0, vpp);
   1725     0   stevel 		fem_release(femsp);
   1726     0   stevel 	}
   1727     0   stevel 	return (errc);
   1728     0   stevel }
   1729     0   stevel 
   1730     0   stevel static int
   1731     0   stevel fshead_statvfs(vfs_t *vfsp, statvfs64_t *sp)
   1732     0   stevel {
   1733     0   stevel 	fsemarg_t	farg;
   1734     0   stevel 	struct fem_list	*femsp;
   1735     0   stevel 	int		(*func)();
   1736     0   stevel 	void		*arg0;
   1737     0   stevel 	int		errc;
   1738  1925      rsb 
   1739  1925      rsb 	ASSERT(vfsp->vfs_implp);
   1740     0   stevel 
   1741     0   stevel 	if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) {
   1742     0   stevel 		func = (int (*)()) vfsp->vfs_op->vfs_statvfs;
   1743     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1744     0   stevel 		errc = (*func)(vfsp, sp);
   1745     0   stevel 	} else {
   1746     0   stevel 		fem_addref(femsp);
   1747     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1748     0   stevel 		farg.fa_vnode.vfsp = vfsp;
   1749     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1750     0   stevel 		vfsop_find(&farg, &func, int, &arg0, vfs_statvfs,
   1751  6264  rm15945 		    fsemop_statvfs);
   1752     0   stevel 		errc = (*func)(arg0, sp);
   1753     0   stevel 		fem_release(femsp);
   1754     0   stevel 	}
   1755     0   stevel 	return (errc);
   1756     0   stevel }
   1757     0   stevel 
   1758     0   stevel static int
   1759     0   stevel fshead_sync(vfs_t *vfsp, short flag, cred_t *cr)
   1760     0   stevel {
   1761     0   stevel 	fsemarg_t	farg;
   1762     0   stevel 	struct fem_list	*femsp;
   1763     0   stevel 	int		(*func)();
   1764     0   stevel 	void		*arg0;
   1765     0   stevel 	int		errc;
   1766     0   stevel 
   1767  1925      rsb 	ASSERT(vfsp->vfs_implp);
   1768  1925      rsb 
   1769     0   stevel 	if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) {
   1770     0   stevel 		func = (int (*)()) vfsp->vfs_op->vfs_sync;
   1771     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1772     0   stevel 		errc = (*func)(vfsp, flag, cr);
   1773     0   stevel 	} else {
   1774     0   stevel 		fem_addref(femsp);
   1775     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1776     0   stevel 		farg.fa_vnode.vfsp = vfsp;
   1777     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1778  3898      rsb 		vfsop_find(&farg, &func, int, &arg0, vfs_sync, fsemop_sync);
   1779     0   stevel 		errc = (*func)(arg0, flag, cr);
   1780     0   stevel 		fem_release(femsp);
   1781     0   stevel 	}
   1782     0   stevel 	return (errc);
   1783     0   stevel }
   1784     0   stevel 
   1785     0   stevel static int
   1786     0   stevel fshead_vget(vfs_t *vfsp, vnode_t **vpp, fid_t *fidp)
   1787     0   stevel {
   1788     0   stevel 	fsemarg_t	farg;
   1789     0   stevel 	struct fem_list	*femsp;
   1790     0   stevel 	int		(*func)();
   1791     0   stevel 	void		*arg0;
   1792     0   stevel 	int		errc;
   1793  1925      rsb 
   1794  1925      rsb 	ASSERT(vfsp->vfs_implp);
   1795     0   stevel 
   1796     0   stevel 	if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) {
   1797     0   stevel 		func = (int (*)()) vfsp->vfs_op->vfs_vget;
   1798     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1799     0   stevel 		errc = (*func)(vfsp, vpp, fidp);
   1800     0   stevel 	} else {
   1801     0   stevel 		fem_addref(femsp);
   1802     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1803     0   stevel 		farg.fa_vnode.vfsp = vfsp;
   1804     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1805  3898      rsb 		vfsop_find(&farg, &func, int, &arg0, vfs_vget, fsemop_vget);
   1806     0   stevel 		errc = (*func)(arg0, vpp, fidp);
   1807     0   stevel 		fem_release(femsp);
   1808     0   stevel 	}
   1809     0   stevel 	return (errc);
   1810     0   stevel }
   1811     0   stevel 
   1812     0   stevel static int
   1813     0   stevel fshead_mountroot(vfs_t *vfsp, enum whymountroot reason)
   1814     0   stevel {
   1815     0   stevel 	fsemarg_t	farg;
   1816     0   stevel 	struct fem_list	*femsp;
   1817     0   stevel 	int		(*func)();
   1818     0   stevel 	void		*arg0;
   1819     0   stevel 	int		errc;
   1820     0   stevel 
   1821  1925      rsb 	ASSERT(vfsp->vfs_implp);
   1822  1925      rsb 
   1823     0   stevel 	if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) {
   1824     0   stevel 		func = (int (*)()) vfsp->vfs_op->vfs_mountroot;
   1825     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1826     0   stevel 		errc = (*func)(vfsp, reason);
   1827     0   stevel 	} else {
   1828     0   stevel 		fem_addref(femsp);
   1829     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1830     0   stevel 		farg.fa_vnode.vfsp = vfsp;
   1831     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1832     0   stevel 		vfsop_find(&farg, &func, int, &arg0, vfs_mountroot,
   1833  6264  rm15945 		    fsemop_mountroot);
   1834     0   stevel 		errc = (*func)(arg0, reason);
   1835     0   stevel 		fem_release(femsp);
   1836     0   stevel 	}
   1837     0   stevel 	return (errc);
   1838     0   stevel }
   1839     0   stevel 
   1840     0   stevel static void
   1841     0   stevel fshead_freevfs(vfs_t *vfsp)
   1842     0   stevel {
   1843     0   stevel 	fsemarg_t	farg;
   1844     0   stevel 	struct fem_list	*femsp;
   1845     0   stevel 	void		(*func)();
   1846     0   stevel 	void		*arg0;
   1847     0   stevel 
   1848  1925      rsb 	ASSERT(vfsp->vfs_implp);
   1849  1925      rsb 
   1850     0   stevel 	if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) {
   1851     0   stevel 		func = (void (*)()) vfsp->vfs_op->vfs_freevfs;
   1852     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1853     0   stevel 		(*func)(vfsp);
   1854     0   stevel 	} else {
   1855     0   stevel 		fem_addref(femsp);
   1856     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1857     0   stevel 		farg.fa_vnode.vfsp = vfsp;
   1858     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1859     0   stevel 		vfsop_find(&farg, &func, void, &arg0, vfs_freevfs,
   1860  6264  rm15945 		    fsemop_freevfs);
   1861     0   stevel 		(*func)(arg0);
   1862     0   stevel 		fem_release(femsp);
   1863     0   stevel 	}
   1864     0   stevel }
   1865     0   stevel 
   1866     0   stevel static int
   1867     0   stevel fshead_vnstate(vfs_t *vfsp, vnode_t *vp, vntrans_t nstate)
   1868     0   stevel {
   1869     0   stevel 	fsemarg_t	farg;
   1870     0   stevel 	struct fem_list	*femsp;
   1871     0   stevel 	int		(*func)();
   1872     0   stevel 	void		*arg0;
   1873     0   stevel 	int		errc;
   1874  1925      rsb 
   1875  1925      rsb 	ASSERT(vfsp->vfs_implp);
   1876     0   stevel 
   1877     0   stevel 	if ((femsp = fem_lock(vfsp->vfs_femhead)) == NULL) {
   1878     0   stevel 		func = (int (*)()) vfsp->vfs_op->vfs_vnstate;
   1879     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1880     0   stevel 		errc = (*func)(vfsp, vp, nstate);
   1881     0   stevel 	} else {
   1882     0   stevel 		fem_addref(femsp);
   1883     0   stevel 		fem_unlock(vfsp->vfs_femhead);
   1884     0   stevel 		farg.fa_vnode.vfsp = vfsp;
   1885     0   stevel 		farg.fa_fnode = femsp->feml_nodes + femsp->feml_tos;
   1886     0   stevel 		vfsop_find(&farg, &func, int, &arg0, vfs_vnstate,
   1887  6264  rm15945 		    fsemop_vnstate);
   1888     0   stevel 		errc = (*func)(arg0, vp, nstate);
   1889     0   stevel 		fem_release(femsp);
   1890     0   stevel 	}
   1891     0   stevel 	return (errc);
   1892     0   stevel }
   1893     0   stevel 
   1894     0   stevel 
   1895     0   stevel /*
   1896     0   stevel  * specification table for the vhead vnode operations.
   1897     0   stevel  * It is an error for any operations to be missing.
   1898     0   stevel  */
   1899     0   stevel 
   1900     0   stevel static struct fs_operation_def fhead_vn_spec[] = {
   1901     0   stevel 	{ VOPNAME_OPEN, (femop_t *)vhead_open },
   1902     0   stevel 	{ VOPNAME_CLOSE, (femop_t *)vhead_close },
   1903     0   stevel 	{ VOPNAME_READ, (femop_t *)vhead_read },
   1904     0   stevel 	{ VOPNAME_WRITE, (femop_t *)vhead_write },
   1905     0   stevel 	{ VOPNAME_IOCTL, (femop_t *)vhead_ioctl },
   1906     0   stevel 	{ VOPNAME_SETFL, (femop_t *)vhead_setfl },
   1907     0   stevel 	{ VOPNAME_GETATTR, (femop_t *)vhead_getattr },
   1908     0   stevel 	{ VOPNAME_SETATTR, (femop_t *)vhead_setattr },
   1909     0   stevel 	{ VOPNAME_ACCESS, (femop_t *)vhead_access },
   1910     0   stevel 	{ VOPNAME_LOOKUP, (femop_t *)vhead_lookup },
   1911     0   stevel 	{ VOPNAME_CREATE, (femop_t *)vhead_create },
   1912     0   stevel 	{ VOPNAME_REMOVE, (femop_t *)vhead_remove },
   1913     0   stevel 	{ VOPNAME_LINK, (femop_t *)vhead_link },
   1914     0   stevel 	{ VOPNAME_RENAME, (femop_t *)vhead_rename },
   1915     0   stevel 	{ VOPNAME_MKDIR, (femop_t *)vhead_mkdir },
   1916     0   stevel 	{ VOPNAME_RMDIR, (femop_t *)vhead_rmdir },
   1917     0   stevel 	{ VOPNAME_READDIR, (femop_t *)vhead_readdir },
   1918     0   stevel 	{ VOPNAME_SYMLINK, (femop_t *)vhead_symlink },
   1919     0   stevel 	{ VOPNAME_READLINK, (femop_t *)vhead_readlink },
   1920     0   stevel 	{ VOPNAME_FSYNC, (femop_t *)vhead_fsync },
   1921     0   stevel 	{ VOPNAME_INACTIVE, (femop_t *)vhead_inactive },
   1922     0   stevel 	{ VOPNAME_FID, (femop_t *)vhead_fid },
   1923     0   stevel 	{ VOPNAME_RWLOCK, (femop_t *)vhead_rwlock },
   1924     0   stevel 	{ VOPNAME_RWUNLOCK, (femop_t *)vhead_rwunlock },
   1925     0   stevel 	{ VOPNAME_SEEK, (femop_t *)vhead_seek },
   1926     0   stevel 	{ VOPNAME_CMP, (femop_t *)vhead_cmp },
   1927     0   stevel 	{ VOPNAME_FRLOCK, (femop_t *)vhead_frlock },
   1928     0   stevel 	{ VOPNAME_SPACE, (femop_t *)vhead_space },
   1929     0   stevel 	{ VOPNAME_REALVP, (femop_t *)vhead_realvp },
   1930     0   stevel 	{ VOPNAME_GETPAGE, (femop_t *)vhead_getpage },
   1931     0   stevel 	{ VOPNAME_PUTPAGE, (femop_t *)vhead_putpage },
   1932     0   stevel 	{ VOPNAME_MAP, (femop_t *)vhead_map },
   1933     0   stevel 	{ VOPNAME_ADDMAP, (femop_t *)vhead_addmap },
   1934     0   stevel 	{ VOPNAME_DELMAP, (femop_t *)vhead_delmap },
   1935     0   stevel 	{ VOPNAME_POLL, (femop_t *)vhead_poll },
   1936     0   stevel 	{ VOPNAME_DUMP, (femop_t *)vhead_dump },
   1937     0   stevel 	{ VOPNAME_PATHCONF, (femop_t *)vhead_pathconf },
   1938     0   stevel 	{ VOPNAME_PAGEIO, (femop_t *)vhead_pageio },
   1939     0   stevel 	{ VOPNAME_DUMPCTL, (femop_t *)vhead_dumpctl },
   1940     0   stevel 	{ VOPNAME_DISPOSE, (femop_t *)vhead_dispose },
   1941     0   stevel 	{ VOPNAME_SETSECATTR, (femop_t *)vhead_setsecattr },
   1942     0   stevel 	{ VOPNAME_GETSECATTR, (femop_t *)vhead_getsecattr },
   1943     0   stevel 	{ VOPNAME_SHRLOCK, (femop_t *)vhead_shrlock },
   1944     0   stevel 	{ VOPNAME_VNEVENT, (femop_t *)vhead_vnevent },
   1945     0   stevel 	{	NULL,	NULL	}
   1946     0   stevel };
   1947     0   stevel 
   1948     0   stevel /*
   1949     0   stevel  * specification table for the vfshead vnode operations.
   1950     0   stevel  * It is an error for any operations to be missing.
   1951     0   stevel  */
   1952     0   stevel 
   1953     0   stevel static struct fs_operation_def fshead_vfs_spec[]  = {
   1954     0   stevel 	{ VFSNAME_MOUNT, (femop_t *)fshead_mount },
   1955     0   stevel 	{ VFSNAME_UNMOUNT, (femop_t *)fshead_unmount },
   1956     0   stevel 	{ VFSNAME_ROOT, (femop_t *)fshead_root },
   1957     0   stevel 	{ VFSNAME_STATVFS, (femop_t *)fshead_statvfs },
   1958     0   stevel 	{ VFSNAME_SYNC, (femop_t *)fshead_sync },
   1959     0   stevel 	{ VFSNAME_VGET, (femop_t *)fshead_vget },
   1960     0   stevel 	{ VFSNAME_MOUNTROOT, (femop_t *)fshead_mountroot },
   1961     0   stevel 	{ VFSNAME_FREEVFS, (femop_t *)fshead_freevfs },
   1962     0   stevel 	{ VFSNAME_VNSTATE, (femop_t *)fshead_vnstate },
   1963     0   stevel 	{	NULL,	NULL	}
   1964     0   stevel };
   1965     0   stevel 
   1966     0   stevel /*
   1967     0   stevel  * This set of routines transfer control to the next stacked monitor.
   1968     0   stevel  *
   1969     0   stevel  * Each routine is identical except for naming, types and arguments.
   1970     0   stevel  *
   1971     0   stevel  * The basic steps are:
   1972     0   stevel  * 1.  Decrease the stack pointer by one.
   1973     0   stevel  * 2.  If the current item is a base operation (vnode, vfs), goto 5.
   1974     0   stevel  * 3.  If the current item does not have a corresponding operation, goto 1
   1975     0   stevel  * 4.  Return by invoking the current item with the argument handle.
   1976     0   stevel  * 5.  Return by invoking the base operation with the base object.
   1977     0   stevel  *
   1978     0   stevel  * for each classification, there needs to be at least one "next" operation
   1979     0   stevel  * for each "head"operation.
   1980     0   stevel  *
   1981     0   stevel  */
   1982     0   stevel 
   1983     0   stevel int
   1984  5331      amw vnext_open(femarg_t *vf, int mode, cred_t *cr, caller_context_t *ct)
   1985     0   stevel {
   1986     0   stevel 	int (*func)() = NULL;
   1987     0   stevel 	void *arg0 = NULL;
   1988     0   stevel 
   1989     0   stevel 	ASSERT(vf != NULL);
   1990     0   stevel 	vf->fa_fnode--;
   1991  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_open, femop_open);
   1992     0   stevel 	ASSERT(func != NULL);
   1993     0   stevel 	ASSERT(arg0 != NULL);
   1994  5331      amw 	return ((*func)(arg0, mode, cr, ct));
   1995     0   stevel }
   1996     0   stevel 
   1997     0   stevel int
   1998  5331      amw vnext_close(femarg_t *vf, int flag, int count, offset_t offset, cred_t *cr,
   1999  5331      amw 	caller_context_t *ct)
   2000     0   stevel {
   2001     0   stevel 	int (*func)() = NULL;
   2002     0   stevel 	void *arg0 = NULL;
   2003     0   stevel 
   2004     0   stevel 	ASSERT(vf != NULL);
   2005     0   stevel 	vf->fa_fnode--;
   2006  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_close, femop_close);
   2007     0   stevel 	ASSERT(func != NULL);
   2008     0   stevel 	ASSERT(arg0 != NULL);
   2009  5331      amw 	return ((*func)(arg0, flag, count, offset, cr, ct));
   2010     0   stevel }
   2011     0   stevel 
   2012     0   stevel int
   2013     0   stevel vnext_read(femarg_t *vf, uio_t *uiop, int ioflag, cred_t *cr,
   2014  5331      amw 	caller_context_t *ct)
   2015     0   stevel {
   2016     0   stevel 	int (*func)() = NULL;
   2017     0   stevel 	void *arg0 = NULL;
   2018     0   stevel 
   2019     0   stevel 	ASSERT(vf != NULL);
   2020     0   stevel 	vf->fa_fnode--;
   2021  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_read, femop_read);
   2022     0   stevel 	ASSERT(func != NULL);
   2023     0   stevel 	ASSERT(arg0 != NULL);
   2024     0   stevel 	return ((*func)(arg0, uiop, ioflag, cr, ct));
   2025     0   stevel }
   2026     0   stevel 
   2027     0   stevel int
   2028     0   stevel vnext_write(femarg_t *vf, uio_t *uiop, int ioflag, cred_t *cr,
   2029  5331      amw 	caller_context_t *ct)
   2030     0   stevel {
   2031     0   stevel 	int (*func)() = NULL;
   2032     0   stevel 	void *arg0 = NULL;
   2033     0   stevel 
   2034     0   stevel 	ASSERT(vf != NULL);
   2035     0   stevel 	vf->fa_fnode--;
   2036  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_write, femop_write);
   2037     0   stevel 	ASSERT(func != NULL);
   2038     0   stevel 	ASSERT(arg0 != NULL);
   2039     0   stevel 	return ((*func)(arg0, uiop, ioflag, cr, ct));
   2040     0   stevel }
   2041     0   stevel 
   2042     0   stevel int
   2043     0   stevel vnext_ioctl(femarg_t *vf, int cmd, intptr_t arg, int flag, cred_t *cr,
   2044  5331      amw 	int *rvalp, caller_context_t *ct)
   2045     0   stevel {
   2046     0   stevel 	int (*func)() = NULL;
   2047     0   stevel 	void *arg0 = NULL;
   2048     0   stevel 
   2049     0   stevel 	ASSERT(vf != NULL);
   2050     0   stevel 	vf->fa_fnode--;
   2051  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_ioctl, femop_ioctl);
   2052     0   stevel 	ASSERT(func != NULL);
   2053     0   stevel 	ASSERT(arg0 != NULL);
   2054  5331      amw 	return ((*func)(arg0, cmd, arg, flag, cr, rvalp, ct));
   2055     0   stevel }
   2056     0   stevel 
   2057     0   stevel int
   2058  5331      amw vnext_setfl(femarg_t *vf, int oflags, int nflags, cred_t *cr,
   2059  5331      amw 	caller_context_t *ct)
   2060     0   stevel {
   2061     0   stevel 	int (*func)() = NULL;
   2062     0   stevel 	void *arg0 = NULL;
   2063     0   stevel 
   2064     0   stevel 	ASSERT(vf != NULL);
   2065     0   stevel 	vf->fa_fnode--;
   2066  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_setfl, femop_setfl);
   2067     0   stevel 	ASSERT(func != NULL);
   2068     0   stevel 	ASSERT(arg0 != NULL);
   2069  5331      amw 	return ((*func)(arg0, oflags, nflags, cr, ct));
   2070     0   stevel }
   2071     0   stevel 
   2072     0   stevel int
   2073  5331      amw vnext_getattr(femarg_t *vf, vattr_t *vap, int flags, cred_t *cr,
   2074  5331      amw 	caller_context_t *ct)
   2075     0   stevel {
   2076     0   stevel 	int (*func)() = NULL;
   2077     0   stevel 	void *arg0 = NULL;
   2078     0   stevel 
   2079     0   stevel 	ASSERT(vf != NULL);
   2080     0   stevel 	vf->fa_fnode--;
   2081  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_getattr, femop_getattr);
   2082     0   stevel 	ASSERT(func != NULL);
   2083     0   stevel 	ASSERT(arg0 != NULL);
   2084  5331      amw 	return ((*func)(arg0, vap, flags, cr, ct));
   2085     0   stevel }
   2086     0   stevel 
   2087     0   stevel int
   2088     0   stevel vnext_setattr(femarg_t *vf, vattr_t *vap, int flags, cred_t *cr,
   2089     0   stevel 	caller_context_t *ct)
   2090     0   stevel {
   2091     0   stevel 	int (*func)() = NULL;
   2092     0   stevel 	void *arg0 = NULL;
   2093     0   stevel 
   2094     0   stevel 	ASSERT(vf != NULL);
   2095     0   stevel 	vf->fa_fnode--;
   2096  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_setattr, femop_setattr);
   2097     0   stevel 	ASSERT(func != NULL);
   2098     0   stevel 	ASSERT(arg0 != NULL);
   2099     0   stevel 	return ((*func)(arg0, vap, flags, cr, ct));
   2100     0   stevel }
   2101     0   stevel 
   2102     0   stevel int
   2103  5331      amw vnext_access(femarg_t *vf, int mode, int flags, cred_t *cr,
   2104  5331      amw 	caller_context_t *ct)
   2105     0   stevel {
   2106     0   stevel 	int (*func)() = NULL;
   2107     0   stevel 	void *arg0 = NULL;
   2108     0   stevel 
   2109     0   stevel 	ASSERT(vf != NULL);
   2110     0   stevel 	vf->fa_fnode--;
   2111  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_access, femop_access);
   2112     0   stevel 	ASSERT(func != NULL);
   2113     0   stevel 	ASSERT(arg0 != NULL);
   2114  5331      amw 	return ((*func)(arg0, mode, flags, cr, ct));
   2115     0   stevel }
   2116     0   stevel 
   2117     0   stevel int
   2118     0   stevel vnext_lookup(femarg_t *vf, char *nm, vnode_t **vpp, pathname_t *pnp,
   2119  5331      amw 	int flags, vnode_t *rdir, cred_t *cr, caller_context_t *ct,
   2120  5331      amw 	int *direntflags, pathname_t *realpnp)
   2121     0   stevel {
   2122     0   stevel 	int (*func)() = NULL;
   2123     0   stevel 	void *arg0 = NULL;
   2124     0   stevel 
   2125     0   stevel 	ASSERT(vf != NULL);
   2126     0   stevel 	vf->fa_fnode--;
   2127  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_lookup, femop_lookup);
   2128     0   stevel 	ASSERT(func != NULL);
   2129     0   stevel 	ASSERT(arg0 != NULL);
   2130  5331      amw 	return ((*func)(arg0, nm, vpp, pnp, flags, rdir, cr, ct,
   2131  6264  rm15945 	    direntflags, realpnp));
   2132     0   stevel }
   2133     0   stevel 
   2134     0   stevel int
   2135     0   stevel vnext_create(femarg_t *vf, char *name, vattr_t *vap, vcexcl_t excl,
   2136  5331      amw 	int mode, vnode_t **vpp, cred_t *cr, int flag, caller_context_t *ct,
   2137  5331      amw 	vsecattr_t *vsecp)
   2138     0   stevel {
   2139     0   stevel 	int (*func)() = NULL;
   2140     0   stevel 	void *arg0 = NULL;
   2141     0   stevel 
   2142     0   stevel 	ASSERT(vf != NULL);
   2143     0   stevel 	vf->fa_fnode--;
   2144  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_create, femop_create);
   2145     0   stevel 	ASSERT(func != NULL);
   2146     0   stevel 	ASSERT(arg0 != NULL);
   2147  5331      amw 	return ((*func)(arg0, name, vap, excl, mode, vpp, cr, flag, ct, vsecp));
   2148     0   stevel }
   2149     0   stevel 
   2150     0   stevel int
   2151  5331      amw vnext_remove(femarg_t *vf, char *nm, cred_t *cr, caller_context_t *ct,
   2152  5331      amw 	int flags)
   2153     0   stevel {
   2154     0   stevel 	int (*func)() = NULL;
   2155     0   stevel 	void *arg0 = NULL;
   2156     0   stevel 
   2157     0   stevel 	ASSERT(vf != NULL);
   2158     0   stevel 	vf->fa_fnode--;
   2159  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_remove, femop_remove);
   2160     0   stevel 	ASSERT(func != NULL);
   2161     0   stevel 	ASSERT(arg0 != NULL);
   2162  5331      amw 	return ((*func)(arg0, nm, cr, ct, flags));
   2163     0   stevel }
   2164     0   stevel 
   2165     0   stevel int
   2166  5331      amw vnext_link(femarg_t *vf, vnode_t *svp, char *tnm, cred_t *cr,
   2167  5331      amw 	caller_context_t *ct, int flags)
   2168     0   stevel {
   2169     0   stevel 	int (*func)() = NULL;
   2170     0   stevel 	void *arg0 = NULL;
   2171     0   stevel 
   2172     0   stevel 	ASSERT(vf != NULL);
   2173     0   stevel 	vf->fa_fnode--;
   2174  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_link, femop_link);
   2175     0   stevel 	ASSERT(func != NULL);
   2176     0   stevel 	ASSERT(arg0 != NULL);
   2177  5331      amw 	return ((*func)(arg0, svp, tnm, cr, ct, flags));
   2178     0   stevel }
   2179     0   stevel 
   2180     0   stevel int
   2181  5331      amw vnext_rename(femarg_t *vf, char *snm, vnode_t *tdvp, char *tnm, cred_t *cr,
   2182  5331      amw 	caller_context_t *ct, int flags)
   2183     0   stevel {
   2184     0   stevel 	int (*func)() = NULL;
   2185     0   stevel 	void *arg0 = NULL;
   2186     0   stevel 
   2187     0   stevel 	ASSERT(vf != NULL);
   2188     0   stevel 	vf->fa_fnode--;
   2189  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_rename, femop_rename);
   2190     0   stevel 	ASSERT(func != NULL);
   2191     0   stevel 	ASSERT(arg0 != NULL);
   2192  5331      amw 	return ((*func)(arg0, snm, tdvp, tnm, cr, ct, flags));
   2193     0   stevel }
   2194     0   stevel 
   2195     0   stevel int
   2196     0   stevel vnext_mkdir(femarg_t *vf, char *dirname, vattr_t *vap, vnode_t **vpp,
   2197  5331      amw 	cred_t *cr, caller_context_t *ct, int flags, vsecattr_t *vsecp)
   2198     0   stevel {
   2199     0   stevel 	int (*func)() = NULL;
   2200     0   stevel 	void *arg0 = NULL;
   2201     0   stevel 
   2202     0   stevel 	ASSERT(vf != NULL);
   2203     0   stevel 	vf->fa_fnode--;
   2204  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_mkdir, femop_mkdir);
   2205     0   stevel 	ASSERT(func != NULL);
   2206     0   stevel 	ASSERT(arg0 != NULL);
   2207  5331      amw 	return ((*func)(arg0, dirname, vap, vpp, cr, ct, flags, vsecp));
   2208     0   stevel }
   2209     0   stevel 
   2210     0   stevel int
   2211  5331      amw vnext_rmdir(femarg_t *vf, char *nm, vnode_t *cdir, cred_t *cr,
   2212  5331      amw 	caller_context_t *ct, int flags)
   2213     0   stevel {
   2214     0   stevel 	int (*func)() = NULL;
   2215     0   stevel 	void *arg0 = NULL;
   2216     0   stevel 
   2217     0   stevel 	ASSERT(vf != NULL);
   2218     0   stevel 	vf->fa_fnode--;
   2219  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_rmdir, femop_rmdir);
   2220     0   stevel 	ASSERT(func != NULL);
   2221     0   stevel 	ASSERT(arg0 != NULL);
   2222  5331      amw 	return ((*func)(arg0, nm, cdir, cr, ct, flags));
   2223     0   stevel }
   2224     0   stevel 
   2225     0   stevel int
   2226  5331      amw vnext_readdir(femarg_t *vf, uio_t *uiop, cred_t *cr, int *eofp,
   2227  5331      amw 	caller_context_t *ct, int flags)
   2228     0   stevel {
   2229     0   stevel 	int (*func)() = NULL;
   2230     0   stevel 	void *arg0 = NULL;
   2231     0   stevel 
   2232     0   stevel 	ASSERT(vf != NULL);
   2233     0   stevel 	vf->fa_fnode--;
   2234  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_readdir, femop_readdir);
   2235     0   stevel 	ASSERT(func != NULL);
   2236     0   stevel 	ASSERT(arg0 != NULL);
   2237  5331      amw 	return ((*func)(arg0, uiop, cr, eofp, ct, flags));
   2238     0   stevel }
   2239     0   stevel 
   2240     0   stevel int
   2241     0   stevel vnext_symlink(femarg_t *vf, char *linkname, vattr_t *vap, char *target,
   2242  5331      amw 	cred_t *cr, caller_context_t *ct, int flags)
   2243     0   stevel {
   2244     0   stevel 	int (*func)() = NULL;
   2245     0   stevel 	void *arg0 = NULL;
   2246     0   stevel 
   2247     0   stevel 	ASSERT(vf != NULL);
   2248     0   stevel 	vf->fa_fnode--;
   2249  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_symlink, femop_symlink);
   2250     0   stevel 	ASSERT(func != NULL);
   2251     0   stevel 	ASSERT(arg0 != NULL);
   2252  5331      amw 	return ((*func)(arg0, linkname, vap, target, cr, ct, flags));
   2253     0   stevel }
   2254     0   stevel 
   2255     0   stevel int
   2256  5331      amw vnext_readlink(femarg_t *vf, uio_t *uiop, cred_t *cr, caller_context_t *ct)
   2257     0   stevel {
   2258     0   stevel 	int (*func)() = NULL;
   2259     0   stevel 	void *arg0 = NULL;
   2260     0   stevel 
   2261     0   stevel 	ASSERT(vf != NULL);
   2262     0   stevel 	vf->fa_fnode--;
   2263  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_readlink, femop_readlink);
   2264     0   stevel 	ASSERT(func != NULL);
   2265     0   stevel 	ASSERT(arg0 != NULL);
   2266  5331      amw 	return ((*func)(arg0, uiop, cr, ct));
   2267     0   stevel }
   2268     0   stevel 
   2269     0   stevel int
   2270  5331      amw vnext_fsync(femarg_t *vf, int syncflag, cred_t *cr, caller_context_t *ct)
   2271     0   stevel {
   2272     0   stevel 	int (*func)() = NULL;
   2273     0   stevel 	void *arg0 = NULL;
   2274     0   stevel 
   2275     0   stevel 	ASSERT(vf != NULL);
   2276     0   stevel 	vf->fa_fnode--;
   2277  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_fsync, femop_fsync);
   2278     0   stevel 	ASSERT(func != NULL);
   2279     0   stevel 	ASSERT(arg0 != NULL);
   2280  5331      amw 	return ((*func)(arg0, syncflag, cr, ct));
   2281     0   stevel }
   2282     0   stevel 
   2283     0   stevel void
   2284  5331      amw vnext_inactive(femarg_t *vf, cred_t *cr, caller_context_t *ct)
   2285     0   stevel {
   2286     0   stevel 	void (*func)() = NULL;
   2287     0   stevel 	void *arg0 = NULL;
   2288     0   stevel 
   2289     0   stevel 	ASSERT(vf != NULL);
   2290     0   stevel 	vf->fa_fnode--;
   2291  3898      rsb 	vsop_find(vf, &func, void, &arg0, vop_inactive, femop_inactive);
   2292     0   stevel 	ASSERT(func != NULL);
   2293     0   stevel 	ASSERT(arg0 != NULL);
   2294  5331      amw 	(*func)(arg0, cr, ct);
   2295     0   stevel }
   2296     0   stevel 
   2297     0   stevel int
   2298  5331      amw vnext_fid(femarg_t *vf, fid_t *fidp, caller_context_t *ct)
   2299     0   stevel {
   2300     0   stevel 	int (*func)() = NULL;
   2301     0   stevel 	void *arg0 = NULL;
   2302     0   stevel 
   2303     0   stevel 	ASSERT(vf != NULL);
   2304     0   stevel 	vf->fa_fnode--;
   2305  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_fid, femop_fid);
   2306     0   stevel 	ASSERT(func != NULL);
   2307     0   stevel 	ASSERT(arg0 != NULL);
   2308  5331      amw 	return ((*func)(arg0, fidp, ct));
   2309     0   stevel }
   2310     0   stevel 
   2311     0   stevel int
   2312     0   stevel vnext_rwlock(femarg_t *vf, int write_lock, caller_context_t *ct)
   2313     0   stevel {
   2314     0   stevel 	int (*func)() = NULL;
   2315     0   stevel 	void *arg0 = NULL;
   2316     0   stevel 
   2317     0   stevel 	ASSERT(vf != NULL);
   2318     0   stevel 	vf->fa_fnode--;
   2319  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_rwlock, femop_rwlock);
   2320     0   stevel 	ASSERT(func != NULL);
   2321     0   stevel 	ASSERT(arg0 != NULL);
   2322     0   stevel 	return ((*func)(arg0, write_lock, ct));
   2323     0   stevel }
   2324     0   stevel 
   2325     0   stevel void
   2326     0   stevel vnext_rwunlock(femarg_t *vf, int write_lock, caller_context_t *ct)
   2327     0   stevel {
   2328     0   stevel 	void (*func)() = NULL;
   2329     0   stevel 	void *arg0 = NULL;
   2330     0   stevel 
   2331     0   stevel 	ASSERT(vf != NULL);
   2332     0   stevel 	vf->fa_fnode--;
   2333  3898      rsb 	vsop_find(vf, &func, void, &arg0, vop_rwunlock, femop_rwunlock);
   2334     0   stevel 	ASSERT(func != NULL);
   2335     0   stevel 	ASSERT(arg0 != NULL);
   2336     0   stevel 	(*func)(arg0, write_lock, ct);
   2337     0   stevel }
   2338     0   stevel 
   2339     0   stevel int
   2340  5331      amw vnext_seek(femarg_t *vf, offset_t ooff, offset_t *noffp, caller_context_t *ct)
   2341     0   stevel {
   2342     0   stevel 	int (*func)() = NULL;
   2343     0   stevel 	void *arg0 = NULL;
   2344     0   stevel 
   2345     0   stevel 	ASSERT(vf != NULL);
   2346     0   stevel 	vf->fa_fnode--;
   2347  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_seek, femop_seek);
   2348     0   stevel 	ASSERT(func != NULL);
   2349     0   stevel 	ASSERT(arg0 != NULL);
   2350  5331      amw 	return ((*func)(arg0, ooff, noffp, ct));
   2351     0   stevel }
   2352     0   stevel 
   2353     0   stevel int
   2354  5331      amw vnext_cmp(femarg_t *vf, vnode_t *vp2, caller_context_t *ct)
   2355     0   stevel {
   2356     0   stevel 	int (*func)() = NULL;
   2357     0   stevel 	void *arg0 = NULL;
   2358     0   stevel 
   2359     0   stevel 	ASSERT(vf != NULL);
   2360     0   stevel 	vf->fa_fnode--;
   2361  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_cmp, femop_cmp);
   2362     0   stevel 	ASSERT(func != NULL);
   2363     0   stevel 	ASSERT(arg0 != NULL);
   2364  5331      amw 	return ((*func)(arg0, vp2, ct));
   2365     0   stevel }
   2366     0   stevel 
   2367     0   stevel int
   2368     0   stevel vnext_frlock(femarg_t *vf, int cmd, struct flock64 *bfp, int flag,
   2369  5331      amw 	offset_t offset, struct flk_callback *flk_cbp, cred_t *cr,
   2370  5331      amw 	caller_context_t *ct)
   2371     0   stevel {
   2372     0   stevel 	int (*func)() = NULL;
   2373     0   stevel 	void *arg0 = NULL;
   2374     0   stevel 
   2375     0   stevel 	ASSERT(vf != NULL);
   2376     0   stevel 	vf->fa_fnode--;
   2377  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_frlock, femop_frlock);
   2378     0   stevel 	ASSERT(func != NULL);
   2379     0   stevel 	ASSERT(arg0 != NULL);
   2380  5331      amw 	return ((*func)(arg0, cmd, bfp, flag, offset, flk_cbp, cr, ct));
   2381     0   stevel }
   2382     0   stevel 
   2383     0   stevel int
   2384     0   stevel vnext_space(femarg_t *vf, int cmd, struct flock64 *bfp, int flag,
   2385     0   stevel 	offset_t offset, cred_t *cr, caller_context_t *ct)
   2386     0   stevel {
   2387     0   stevel 	int (*func)() = NULL;
   2388     0   stevel 	void *arg0 = NULL;
   2389     0   stevel 
   2390     0   stevel 	ASSERT(vf != NULL);
   2391     0   stevel 	vf->fa_fnode--;
   2392  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_space, femop_space);
   2393     0   stevel 	ASSERT(func != NULL);
   2394     0   stevel 	ASSERT(arg0 != NULL);
   2395     0   stevel 	return ((*func)(arg0, cmd, bfp, flag, offset, cr, ct));
   2396     0   stevel }
   2397     0   stevel 
   2398     0   stevel int
   2399  5331      amw vnext_realvp(femarg_t *vf, vnode_t **vpp, caller_context_t *ct)
   2400     0   stevel {
   2401     0   stevel 	int (*func)() = NULL;
   2402     0   stevel 	void *arg0 = NULL;
   2403     0   stevel 
   2404     0   stevel 	ASSERT(vf != NULL);
   2405     0   stevel 	vf->fa_fnode--;
   2406  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_realvp, femop_realvp);
   2407     0   stevel 	ASSERT(func != NULL);
   2408     0   stevel 	ASSERT(arg0 != NULL);
   2409  5331      amw 	return ((*func)(arg0, vpp, ct));
   2410     0   stevel }
   2411     0   stevel 
   2412     0   stevel int
   2413     0   stevel vnext_getpage(femarg_t *vf, offset_t off, size_t len, uint_t *protp,
   2414     0   stevel 	struct page **plarr, size_t plsz, struct seg *seg, caddr_t addr,
   2415  5331      amw 	enum seg_rw rw, cred_t *cr, caller_context_t *ct)
   2416     0   stevel {
   2417     0   stevel 	int (*func)() = NULL;
   2418     0   stevel 	void *arg0 = NULL;
   2419     0   stevel 
   2420     0   stevel 	ASSERT(vf != NULL);
   2421     0   stevel 	vf->fa_fnode--;
   2422  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_getpage, femop_getpage);
   2423     0   stevel 	ASSERT(func != NULL);
   2424     0   stevel 	ASSERT(arg0 != NULL);
   2425     0   stevel 	return ((*func)(arg0, off, len, protp, plarr, plsz, seg, addr, rw,
   2426  6264  rm15945 	    cr, ct));
   2427     0   stevel }
   2428     0   stevel 
   2429     0   stevel int
   2430     0   stevel vnext_putpage(femarg_t *vf, offset_t off, size_t len, int flags,
   2431  5331      amw 	cred_t *cr, caller_context_t *ct)
   2432     0   stevel {
   2433     0   stevel 	int (*func)() = NULL;
   2434     0   stevel 	void *arg0 = NULL;
   2435     0   stevel 
   2436     0   stevel 	ASSERT(vf != NULL);
   2437     0   stevel 	vf->fa_fnode--;
   2438  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_putpage, femop_putpage);
   2439     0   stevel 	ASSERT(func != NULL);
   2440     0   stevel 	ASSERT(arg0 != NULL);
   2441  5331      amw 	return ((*func)(arg0, off, len, flags, cr, ct));
   2442     0   stevel }
   2443     0   stevel 
   2444     0   stevel int
   2445     0   stevel vnext_map(femarg_t *vf, offset_t off, struct as *as, caddr_t *addrp,
   2446     0   stevel 	size_t len, uchar_t prot, uchar_t maxprot, uint_t flags,
   2447  5331      amw 	cred_t *cr, caller_context_t *ct)
   2448     0   stevel {
   2449     0   stevel 	int (*func)() = NULL;
   2450     0   stevel 	void *arg0 = NULL;
   2451     0   stevel 
   2452     0   stevel 	ASSERT(vf != NULL);
   2453     0   stevel 	vf->fa_fnode--;
   2454  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_map, femop_map);
   2455     0   stevel 	ASSERT(func != NULL);
   2456     0   stevel 	ASSERT(arg0 != NULL);
   2457     0   stevel 	return ((*func)(arg0, off, as, addrp, len, prot, maxprot, flags,
   2458  6264  rm15945 	    cr, ct));
   2459     0   stevel }
   2460     0   stevel 
   2461     0   stevel int
   2462     0   stevel vnext_addmap(femarg_t *vf, offset_t off, struct as *as, caddr_t addr,
   2463     0   stevel 	size_t len, uchar_t prot, uchar_t maxprot, uint_t flags,
   2464  5331      amw 	cred_t *cr, caller_context_t *ct)
   2465     0   stevel {
   2466     0   stevel 	int (*func)() = NULL;
   2467     0   stevel 	void *arg0 = NULL;
   2468     0   stevel 
   2469     0   stevel 	ASSERT(vf != NULL);
   2470     0   stevel 	vf->fa_fnode--;
   2471  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_addmap, femop_addmap);
   2472     0   stevel 	ASSERT(func != NULL);
   2473     0   stevel 	ASSERT(arg0 != NULL);
   2474  5331      amw 	return ((*func)(arg0, off, as, addr, len, prot, maxprot, flags,
   2475  6264  rm15945 	    cr, ct));
   2476     0   stevel }
   2477     0   stevel 
   2478     0   stevel int
   2479     0   stevel vnext_delmap(femarg_t *vf, offset_t off, struct as *as, caddr_t addr,
   2480  5331      amw 	size_t len, uint_t prot, uint_t maxprot, uint_t flags,
   2481  5331      amw 	cred_t *cr, caller_context_t *ct)
   2482     0   stevel {
   2483     0   stevel 	int (*func)() = NULL;
   2484     0   stevel 	void *arg0 = NULL;
   2485     0   stevel 
   2486     0   stevel 	ASSERT(vf != NULL);
   2487     0   stevel 	vf->fa_fnode--;
   2488  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_delmap, femop_delmap);
   2489     0   stevel 	ASSERT(func != NULL);
   2490     0   stevel 	ASSERT(arg0 != NULL);
   2491  5331      amw 	return ((*func)(arg0, off, as, addr, len, prot, maxprot, flags,
   2492  6264  rm15945 	    cr, ct));
   2493     0   stevel }
   2494     0   stevel 
   2495     0   stevel int
   2496     0   stevel vnext_poll(femarg_t *vf, short events, int anyyet, short *reventsp,
   2497  5331      amw 	struct pollhead **phpp, caller_context_t *ct)
   2498     0   stevel {
   2499     0   stevel 	int (*func)() = NULL;
   2500     0   stevel 	void *arg0 = NULL;
   2501     0   stevel 
   2502     0   stevel 	ASSERT(vf != NULL);
   2503     0   stevel 	vf->fa_fnode--;
   2504  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_poll, femop_poll);
   2505     0   stevel 	ASSERT(func != NULL);
   2506     0   stevel 	ASSERT(arg0 != NULL);
   2507  5331      amw 	return ((*func)(arg0, events, anyyet, reventsp, phpp, ct));
   2508     0   stevel }
   2509     0   stevel 
   2510     0   stevel int
   2511  6264  rm15945 vnext_dump(femarg_t *vf, caddr_t addr, offset_t lbdn, offset_t dblks,
   2512  5331      amw 	caller_context_t *ct)
   2513     0   stevel {
   2514     0   stevel 	int (*func)() = NULL;
   2515     0   stevel 	void *arg0 = NULL;
   2516     0   stevel 
   2517     0   stevel 	ASSERT(vf != NULL);
   2518     0   stevel 	vf->fa_fnode--;
   2519  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_dump, femop_dump);
   2520     0   stevel 	ASSERT(func != NULL);
   2521     0   stevel 	ASSERT(arg0 != NULL);
   2522  5331      amw 	return ((*func)(arg0, addr, lbdn, dblks, ct));
   2523     0   stevel }
   2524     0   stevel 
   2525     0   stevel int
   2526  5331      amw vnext_pathconf(femarg_t *vf, int cmd, ulong_t *valp, cred_t *cr,
   2527  5331      amw 	caller_context_t *ct)
   2528     0   stevel {
   2529     0   stevel 	int (*func)() = NULL;
   2530     0   stevel 	void *arg0 = NULL;
   2531     0   stevel 
   2532     0   stevel 	ASSERT(vf != NULL);
   2533     0   stevel 	vf->fa_fnode--;
   2534  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_pathconf, femop_pathconf);
   2535     0   stevel 	ASSERT(func != NULL);
   2536     0   stevel 	ASSERT(arg0 != NULL);
   2537  5331      amw 	return ((*func)(arg0, cmd, valp, cr, ct));
   2538     0   stevel }
   2539     0   stevel 
   2540     0   stevel int
   2541     0   stevel vnext_pageio(femarg_t *vf, struct page *pp, u_offset_t io_off,
   2542  5331      amw 	size_t io_len, int flags, cred_t *cr, caller_context_t *ct)
   2543     0   stevel {
   2544     0   stevel 	int (*func)() = NULL;
   2545     0   stevel 	void *arg0 = NULL;
   2546     0   stevel 
   2547     0   stevel 	ASSERT(vf != NULL);
   2548     0   stevel 	vf->fa_fnode--;
   2549  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_pageio, femop_pageio);
   2550     0   stevel 	ASSERT(func != NULL);
   2551     0   stevel 	ASSERT(arg0 != NULL);
   2552  5331      amw 	return ((*func)(arg0, pp, io_off, io_len, flags, cr, ct));
   2553     0   stevel }
   2554     0   stevel 
   2555     0   stevel int
   2556  6264  rm15945 vnext_dumpctl(femarg_t *vf, int action, offset_t *blkp, caller_context_t *ct)
   2557     0   stevel {
   2558     0   stevel 	int (*func)() = NULL;
   2559     0   stevel 	void *arg0 = NULL;
   2560     0   stevel 
   2561     0   stevel 	ASSERT(vf != NULL);
   2562     0   stevel 	vf->fa_fnode--;
   2563  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_dumpctl, femop_dumpctl);
   2564     0   stevel 	ASSERT(func != NULL);
   2565     0   stevel 	ASSERT(arg0 != NULL);
   2566  5331      amw 	return ((*func)(arg0, action, blkp, ct));
   2567     0   stevel }
   2568     0   stevel 
   2569     0   stevel void
   2570  5331      amw vnext_dispose(femarg_t *vf, struct page *pp, int flag, int dn, cred_t *cr,
   2571  5331      amw 	caller_context_t *ct)
   2572     0   stevel {
   2573     0   stevel 	void (*func)() = NULL;
   2574     0   stevel 	void *arg0 = NULL;
   2575     0   stevel 
   2576     0   stevel 	ASSERT(vf != NULL);
   2577     0   stevel 	vf->fa_fnode--;
   2578  3898      rsb 	vsop_find(vf, &func, void, &arg0, vop_dispose, femop_dispose);
   2579     0   stevel 	ASSERT(func != NULL);
   2580     0   stevel 	ASSERT(arg0 != NULL);
   2581  5331      amw 	(*func)(arg0, pp, flag, dn, cr, ct);
   2582     0   stevel }
   2583     0   stevel 
   2584     0   stevel int
   2585  5331      amw vnext_setsecattr(femarg_t *vf, vsecattr_t *vsap, int flag, cred_t *cr,
   2586  5331      amw 	caller_context_t *ct)
   2587     0   stevel {
   2588     0   stevel 	int (*func)() = NULL;
   2589     0   stevel 	void *arg0 = NULL;
   2590     0   stevel 
   2591     0   stevel 	ASSERT(vf != NULL);
   2592     0   stevel 	vf->fa_fnode--;
   2593  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_setsecattr, femop_setsecattr);
   2594     0   stevel 	ASSERT(func != NULL);
   2595     0   stevel 	ASSERT(arg0 != NULL);
   2596  5331      amw 	return ((*func)(arg0, vsap, flag, cr, ct));
   2597     0   stevel }
   2598     0   stevel 
   2599     0   stevel int
   2600  5331      amw vnext_getsecattr(femarg_t *vf, vsecattr_t *vsap, int flag, cred_t *cr,
   2601  5331      amw 	caller_context_t *ct)
   2602     0   stevel {
   2603     0   stevel 	int (*func)() = NULL;
   2604     0   stevel 	void *arg0 = NULL;
   2605     0   stevel 
   2606     0   stevel 	ASSERT(vf != NULL);
   2607     0   stevel 	vf->fa_fnode--;
   2608  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_getsecattr, femop_getsecattr);
   2609     0   stevel 	ASSERT(func != NULL);
   2610     0   stevel 	ASSERT(arg0 != NULL);
   2611  5331      amw 	return ((*func)(arg0, vsap, flag, cr, ct));
   2612     0   stevel }
   2613     0   stevel 
   2614     0   stevel int
   2615     0   stevel vnext_shrlock(femarg_t *vf, int cmd, struct shrlock *shr, int flag,
   2616  5331      amw 	cred_t *cr, caller_context_t *ct)
   2617     0   stevel {
   2618     0   stevel 	int (*func)() = NULL;
   2619     0   stevel 	void *arg0 = NULL;
   2620     0   stevel 
   2621     0   stevel 	ASSERT(vf != NULL);
   2622     0   stevel 	vf->fa_fnode--;
   2623  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_shrlock, femop_shrlock);
   2624     0   stevel 	ASSERT(func != NULL);
   2625     0   stevel 	ASSERT(arg0 != NULL);
   2626  5331      amw 	return ((*func)(arg0, cmd, shr, flag, cr, ct));
   2627     0   stevel }
   2628     0   stevel 
   2629     0   stevel int
   2630  5331      amw vnext_vnevent(femarg_t *vf, vnevent_t vnevent, vnode_t *dvp, char *cname,
   2631  5331      amw     caller_context_t *ct)
   2632     0   stevel {
   2633     0   stevel 	int (*func)() = NULL;
   2634     0   stevel 	void *arg0 = NULL;
   2635     0   stevel 
   2636     0   stevel 	ASSERT(vf != NULL);
   2637     0   stevel 	vf->fa_fnode--;
   2638  3898      rsb 	vsop_find(vf, &func, int, &arg0, vop_vnevent, femop_vnevent);
   2639     0   stevel 	ASSERT(func != NULL);
   2640     0   stevel 	ASSERT(arg0 != NULL);
   2641  5331      amw 	return ((*func)(arg0, vnevent, dvp, cname, ct));
   2642     0   stevel }
   2643     0   stevel 
   2644     0   stevel int
   2645     0   stevel vfsnext_mount(fsemarg_t *vf, vnode_t *mvp, struct mounta *uap, cred_t *cr)
   2646     0   stevel {
   2647     0   stevel 	int (*func)() = NULL;
   2648     0   stevel 	void *arg0 = NULL;
   2649     0   stevel 
   2650     0   stevel 	ASSERT(vf != NULL);
   2651     0   stevel 	vf->fa_fnode--;
   2652  3898      rsb 	vfsop_find(vf, &func, int, &arg0, vfs_mount, fsemop_mount);
   2653     0   stevel 	ASSERT(func != NULL);
   2654     0   stevel 	ASSERT(arg0 != NULL);
   2655     0   stevel 	return ((*func)(arg0, mvp, uap, cr));
   2656     0   stevel }
   2657     0   stevel 
   2658     0   stevel int
   2659     0   stevel vfsnext_unmount(fsemarg_t *vf, int flag, cred_t *cr)
   2660     0   stevel {
   2661     0   stevel 	int (*func)() = NULL;
   2662     0   stevel 	void *arg0 = NULL;
   2663     0   stevel 
   2664     0   stevel 	ASSERT(vf != NULL);
   2665     0   stevel 	vf->fa_fnode--;
   2666  3898      rsb 	vfsop_find(vf, &func, int, &arg0, vfs_unmount, fsemop_unmount);
   2667     0   stevel 	ASSERT(func != NULL);
   2668     0   stevel 	ASSERT(arg0 != NULL);
   2669     0   stevel 	return ((*func)(arg0, flag, cr));
   2670     0   stevel }
   2671     0   stevel 
   2672     0   stevel int
   2673     0   stevel vfsnext_root(fsemarg_t *vf, vnode_t **vpp)
   2674     0   stevel {
   2675     0   stevel 	int (*func)() = NULL;
   2676     0   stevel 	void *arg0 = NULL;
   2677     0   stevel 
   2678     0   stevel 	ASSERT(vf != NULL);
   2679     0   stevel 	vf->fa_fnode--;
   2680  3898      rsb 	vfsop_find(vf, &func, int, &arg0, vfs_root, fsemop_root);
   2681     0   stevel 	ASSERT(func != NULL);
   2682     0   stevel 	ASSERT(arg0 != NULL);
   2683     0   stevel 	return ((*func)(arg0, vpp));
   2684     0   stevel }
   2685     0   stevel 
   2686     0   stevel int
   2687     0   stevel vfsnext_statvfs(fsemarg_t *vf, statvfs64_t *sp)
   2688     0   stevel {
   2689     0   stevel 	int (*func)() = NULL;
   2690     0   stevel 	void *arg0 = NULL;
   2691     0   stevel 
   2692     0   stevel 	ASSERT(vf != NULL);
   2693     0   stevel 	vf->fa_fnode--;
   2694  3898      rsb 	vfsop_find(vf, &func, int, &arg0, vfs_statvfs, fsemop_statvfs);
   2695     0   stevel 	ASSERT(func != NULL);
   2696     0   stevel 	ASSERT(arg0 != NULL);
   2697     0   stevel 	return ((*func)(arg0, sp));
   2698     0   stevel }
   2699     0   stevel 
   2700     0   stevel int
   2701     0   stevel vfsnext_sync(fsemarg_t *vf, short flag, cred_t *cr)
   2702     0   stevel {
   2703     0   stevel 	int (*func)() = NULL;
   2704     0   stevel 	void *arg0 = NULL;
   2705     0   stevel 
   2706     0   stevel 	ASSERT(vf != NULL);
   2707     0   stevel 	vf->fa_fnode--;
   2708  3898      rsb 	vfsop_find(vf, &func, int, &arg0, vfs_sync, fsemop_sync);
   2709     0   stevel 	ASSERT(func != NULL);
   2710     0   stevel 	ASSERT(arg0 != NULL);
   2711     0   stevel 	return ((*func)(arg0, flag, cr));
   2712     0   stevel }
   2713     0   stevel 
   2714     0   stevel int
   2715     0   stevel vfsnext_vget(fsemarg_t *vf, vnode_t **vpp, fid_t *fidp)
   2716     0   stevel {
   2717     0   stevel 	int (*func)() = NULL;
   2718     0   stevel 	void *arg0 = NULL;
   2719     0   stevel 
   2720     0   stevel 	ASSERT(vf != NULL);
   2721     0   stevel 	vf->fa_fnode--;
   2722  3898      rsb 	vfsop_find(vf, &func, int, &arg0, vfs_vget, fsemop_vget);
   2723     0   stevel 	ASSERT(func != NULL);
   2724     0   stevel 	ASSERT(arg0 != NULL);
   2725     0   stevel 	return ((*func)(arg0, vpp, fidp));
   2726     0   stevel }
   2727     0   stevel 
   2728     0   stevel int
   2729     0   stevel vfsnext_mountroot(fsemarg_t *vf, enum whymountroot reason)
   2730     0   stevel {
   2731     0   stevel 	int (*func)() = NULL;
   2732     0   stevel 	void *arg0 = NULL;
   2733     0   stevel 
   2734     0   stevel 	ASSERT(vf != NULL);
   2735     0   stevel 	vf->fa_fnode--;
   2736  3898      rsb 	vfsop_find(vf, &func, int, &arg0, vfs_mountroot, fsemop_mountroot);
   2737     0   stevel 	ASSERT(func != NULL);
   2738     0   stevel 	ASSERT(arg0 != NULL);
   2739     0   stevel 	return ((*func)(arg0, reason));
   2740     0   stevel }
   2741     0   stevel 
   2742     0   stevel void
   2743     0   stevel vfsnext_freevfs(fsemarg_t *vf)
   2744     0   stevel {
   2745     0   stevel 	void (*func)() = NULL;
   2746     0   stevel 	void *arg0 = NULL;
   2747     0   stevel 
   2748     0   stevel 	ASSERT(vf != NULL);
   2749     0   stevel 	vf->fa_fnode--;
   2750  3898      rsb 	vfsop_find(vf, &func, void, &arg0, vfs_freevfs, fsemop_freevfs);
   2751     0   stevel 	ASSERT(func != NULL);
   2752     0   stevel 	ASSERT(arg0 != NULL);
   2753     0   stevel 	(*func)(arg0);
   2754     0   stevel }
   2755     0   stevel 
   2756     0   stevel int
   2757     0   stevel vfsnext_vnstate(fsemarg_t *vf, vnode_t *vp, vntrans_t nstate)
   2758     0   stevel {
   2759     0   stevel 	int (*func)() = NULL;
   2760     0   stevel 	void *arg0 = NULL;
   2761     0   stevel 
   2762     0   stevel 	ASSERT(vf != NULL);
   2763     0   stevel 	vf->fa_fnode--;
   2764  3898      rsb 	vfsop_find(vf, &func, int, &arg0, vfs_vnstate, fsemop_vnstate);
   2765     0   stevel 	ASSERT(func != NULL);
   2766     0   stevel 	ASSERT(arg0 != NULL);
   2767     0   stevel 	return ((*func)(arg0, vp, nstate));
   2768     0   stevel }
   2769     0   stevel 
   2770     0   stevel 
   2771     0   stevel /*
   2772     0   stevel  * Create a new fem_head and associate with the vnode.
   2773     0   stevel  * To keep the unaugmented vnode access path lock free, we spin
   2774     0   stevel  * update this - create a new one, then try and install it. If
   2775     0   stevel  * we fail to install, release the old one and pretend we succeeded.
   2776     0   stevel  */
   2777     0   stevel 
   2778     0   stevel static struct fem_head *
   2779     0   stevel new_femhead(struct fem_head **hp)
   2780     0   stevel {
   2781     0   stevel 	struct fem_head	*head;
   2782     0   stevel 
   2783     0   stev