Home | History | Annotate | Line # | Download | only in kern
vnode_if.c revision 1.116
      1  1.113  dholland /*	$NetBSD: vnode_if.c,v 1.116 2022/05/03 08:35:11 hannken Exp $	*/
      2    1.9   thorpej 
      3    1.1       cgd /*
      4   1.52     perry  * Warning: DO NOT EDIT! This file is automatically generated!
      5    1.1       cgd  * (Modifications made here may easily be lost!)
      6    1.1       cgd  *
      7    1.1       cgd  * Created from the file:
      8  1.116   hannken  *	NetBSD: vnode_if.src,v 1.84 2022/05/03 08:33:59 hannken Exp
      9    1.1       cgd  * by the script:
     10  1.116   hannken  *	NetBSD: vnode_if.sh,v 1.74 2022/05/03 08:33:59 hannken Exp
     11    1.1       cgd  */
     12    1.1       cgd 
     13    1.1       cgd /*
     14   1.10      fvdl  * Copyright (c) 1992, 1993, 1994, 1995
     15    1.1       cgd  *	The Regents of the University of California.  All rights reserved.
     16    1.1       cgd  *
     17    1.1       cgd  * Redistribution and use in source and binary forms, with or without
     18    1.1       cgd  * modification, are permitted provided that the following conditions
     19    1.1       cgd  * are met:
     20    1.1       cgd  * 1. Redistributions of source code must retain the above copyright
     21    1.1       cgd  *    notice, this list of conditions and the following disclaimer.
     22    1.1       cgd  * 2. Redistributions in binary form must reproduce the above copyright
     23    1.1       cgd  *    notice, this list of conditions and the following disclaimer in the
     24    1.1       cgd  *    documentation and/or other materials provided with the distribution.
     25   1.45       agc  * 3. Neither the name of the University nor the names of its contributors
     26    1.1       cgd  *    may be used to endorse or promote products derived from this software
     27    1.1       cgd  *    without specific prior written permission.
     28    1.1       cgd  *
     29   1.14  christos  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     30    1.1       cgd  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     31    1.1       cgd  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     32    1.1       cgd  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     33    1.1       cgd  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     34    1.1       cgd  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     35    1.1       cgd  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     36    1.1       cgd  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     37    1.1       cgd  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     38    1.1       cgd  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     39    1.1       cgd  * SUCH DAMAGE.
     40    1.1       cgd  */
     41   1.39     lukem 
     42   1.39     lukem #include <sys/cdefs.h>
     43  1.113  dholland __KERNEL_RCSID(0, "$NetBSD: vnode_if.c,v 1.116 2022/05/03 08:35:11 hannken Exp $");
     44   1.39     lukem 
     45  1.116   hannken #ifdef _KERNEL_OPT
     46  1.116   hannken #include "opt_vnode_lockdebug.h"
     47  1.116   hannken #endif /* _KERNEL_OPT */
     48  1.116   hannken 
     49    1.1       cgd #include <sys/param.h>
     50    1.1       cgd #include <sys/mount.h>
     51   1.23   thorpej #include <sys/buf.h>
     52  1.115   thorpej #include <sys/fcntl.h>
     53    1.1       cgd #include <sys/vnode.h>
     54   1.72        ad #include <sys/lock.h>
     55   1.97   hannken #include <sys/fstrans.h>
     56    1.1       cgd 
     57  1.108   hannken enum fst_op { FST_NO, FST_YES, FST_LAZY, FST_TRY };
     58  1.105   hannken 
     59  1.105   hannken static inline int
     60  1.105   hannken vop_pre(vnode_t *vp, struct mount **mp, bool *mpsafe, enum fst_op op)
     61  1.105   hannken {
     62  1.105   hannken 	int error;
     63  1.105   hannken 
     64  1.105   hannken 	*mpsafe = (vp->v_vflag & VV_MPSAFE);
     65  1.105   hannken 
     66  1.105   hannken 	if (!*mpsafe) {
     67  1.105   hannken 		KERNEL_LOCK(1, curlwp);
     68  1.105   hannken 	}
     69  1.105   hannken 
     70  1.108   hannken 	if (op == FST_YES || op == FST_LAZY || op == FST_TRY) {
     71  1.105   hannken 		for (;;) {
     72  1.105   hannken 			*mp = vp->v_mount;
     73  1.105   hannken 			if (op == FST_TRY) {
     74  1.106   hannken 				error = fstrans_start_nowait(*mp);
     75  1.105   hannken 				if (error) {
     76  1.105   hannken 					if (!*mpsafe) {
     77  1.105   hannken 						KERNEL_UNLOCK_ONE(curlwp);
     78  1.105   hannken 					}
     79  1.105   hannken 					return error;
     80  1.105   hannken 				}
     81  1.108   hannken 			} else if (op == FST_LAZY) {
     82  1.108   hannken 				fstrans_start_lazy(*mp);
     83  1.105   hannken 			} else {
     84  1.106   hannken 				fstrans_start(*mp);
     85  1.105   hannken 			}
     86  1.105   hannken 			if (__predict_true(*mp == vp->v_mount))
     87  1.105   hannken 				break;
     88  1.105   hannken 			fstrans_done(*mp);
     89  1.105   hannken 		}
     90  1.105   hannken 	} else {
     91  1.105   hannken 		*mp = vp->v_mount;
     92  1.105   hannken 	}
     93  1.105   hannken 
     94  1.105   hannken 	return 0;
     95  1.105   hannken }
     96  1.105   hannken 
     97  1.115   thorpej static inline u_quad_t
     98  1.115   thorpej vop_pre_get_size(struct vnode *vp)
     99  1.115   thorpej {
    100  1.115   thorpej 	mutex_enter(vp->v_interlock);
    101  1.115   thorpej 	KASSERT(vp->v_size != VSIZENOTSET);
    102  1.115   thorpej 	u_quad_t rv = (u_quad_t)vp->v_size;
    103  1.115   thorpej 	mutex_exit(vp->v_interlock);
    104  1.115   thorpej 
    105  1.115   thorpej 	return rv;
    106  1.115   thorpej }
    107  1.115   thorpej 
    108  1.115   thorpej /*
    109  1.115   thorpej  * VOP_RMDIR(), VOP_REMOVE(), and VOP_RENAME() need special handling
    110  1.115   thorpej  * because they each drop the caller's references on one or more of
    111  1.115   thorpej  * their arguments.  While there must be an open file descriptor in
    112  1.115   thorpej  * associated with a vnode in order for knotes to be attached to it,
    113  1.115   thorpej  * that status could change during the course of the operation.  So,
    114  1.115   thorpej  * for the vnode arguments that are WILLRELE or WILLPUT, we check
    115  1.115   thorpej  * pre-op if there are registered knotes, take a hold count if so,
    116  1.115   thorpej  * and post-op release the hold after activating any knotes still
    117  1.115   thorpej  * associated with the vnode.
    118  1.115   thorpej  */
    119  1.115   thorpej 
    120  1.115   thorpej #define	VOP_POST_KNOTE(thisvp, e, n)					\
    121  1.115   thorpej do {									\
    122  1.115   thorpej 	if (__predict_true((e) == 0)) {					\
    123  1.115   thorpej 		/*							\
    124  1.115   thorpej 		 * VN_KNOTE() does the VN_KEVENT_INTEREST()		\
    125  1.115   thorpej 		 * check for us.					\
    126  1.115   thorpej 		 */							\
    127  1.115   thorpej 		VN_KNOTE((thisvp), (n));				\
    128  1.115   thorpej 	}								\
    129  1.115   thorpej } while (/*CONSTCOND*/0)
    130  1.115   thorpej 
    131  1.115   thorpej #define	VOP_POST_KNOTE_HELD(thisvp, e, n)				\
    132  1.115   thorpej do {									\
    133  1.115   thorpej 	/*								\
    134  1.115   thorpej 	 * We don't perform a VN_KEVENT_INTEREST() check here; it	\
    135  1.115   thorpej 	 * was already performed when we did the pre-op work that	\
    136  1.115   thorpej 	 * caused the vnode to be held in the first place.		\
    137  1.115   thorpej 	 */								\
    138  1.115   thorpej 	mutex_enter((thisvp)->v_interlock);				\
    139  1.115   thorpej 	if (__predict_true((e) == 0)) {					\
    140  1.115   thorpej 		knote(&(thisvp)->v_klist, (n));				\
    141  1.115   thorpej 	}								\
    142  1.115   thorpej 	holdrelel((thisvp));						\
    143  1.115   thorpej 	mutex_exit((thisvp)->v_interlock);				\
    144  1.115   thorpej 	/*								\
    145  1.115   thorpej 	 * thisvp might be gone now!  Don't touch!			\
    146  1.115   thorpej 	 */								\
    147  1.115   thorpej } while (/*CONSTCOND*/0)
    148  1.115   thorpej 
    149  1.115   thorpej #define	vop_create_post(ap, e)						\
    150  1.115   thorpej 	VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE)
    151  1.115   thorpej 
    152  1.115   thorpej #define	vop_mknod_post(ap, e)						\
    153  1.115   thorpej 	VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE)
    154  1.115   thorpej 
    155  1.115   thorpej #define	vop_setattr_pre(ap)						\
    156  1.115   thorpej 	u_quad_t osize = 0;						\
    157  1.115   thorpej 	long vp_events =						\
    158  1.115   thorpej 	    VN_KEVENT_INTEREST((ap)->a_vp, NOTE_ATTRIB | NOTE_EXTEND)	\
    159  1.115   thorpej 	    ? NOTE_ATTRIB : 0;						\
    160  1.115   thorpej 	bool check_extend = false;					\
    161  1.115   thorpej 	if (__predict_false(vp_events != 0 &&				\
    162  1.115   thorpej 	    (ap)->a_vap->va_size != VNOVALSIZE)) {			\
    163  1.115   thorpej 		check_extend = true;					\
    164  1.115   thorpej 		osize = vop_pre_get_size((ap)->a_vp);			\
    165  1.115   thorpej 	}
    166  1.115   thorpej 
    167  1.115   thorpej #define	vop_setattr_post(ap, e)						\
    168  1.115   thorpej do {									\
    169  1.115   thorpej 	if (__predict_false(vp_events != 0)) {				\
    170  1.115   thorpej 		if (__predict_false(check_extend &&			\
    171  1.115   thorpej 		    (ap)->a_vap->va_size > osize)) {			\
    172  1.115   thorpej 			vp_events |= NOTE_EXTEND;			\
    173  1.115   thorpej 		}							\
    174  1.115   thorpej 		VOP_POST_KNOTE((ap)->a_vp, (e), vp_events);		\
    175  1.115   thorpej 	}								\
    176  1.115   thorpej } while (/*CONSTCOND*/0)
    177  1.115   thorpej 
    178  1.115   thorpej #define	vop_setacl_post(ap, e)						\
    179  1.115   thorpej 	VOP_POST_KNOTE((ap)->a_vp, (e), NOTE_ATTRIB)
    180  1.115   thorpej 
    181  1.115   thorpej #define	vop_link_post(ap, e)						\
    182  1.115   thorpej do {									\
    183  1.115   thorpej 	VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE);			\
    184  1.115   thorpej 	VOP_POST_KNOTE((ap)->a_vp, (e), NOTE_LINK);			\
    185  1.115   thorpej } while (/*CONSTCOND*/0)
    186  1.115   thorpej 
    187  1.115   thorpej #define	vop_mkdir_post(ap, e)						\
    188  1.115   thorpej 	VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE | NOTE_LINK)
    189  1.115   thorpej 
    190  1.115   thorpej #define	vop_remove_pre_common(ap)					\
    191  1.115   thorpej 	bool post_event_vp =						\
    192  1.115   thorpej 	    VN_KEVENT_INTEREST((ap)->a_vp, NOTE_DELETE | NOTE_LINK);	\
    193  1.115   thorpej 	if (__predict_false(post_event_vp)) {				\
    194  1.115   thorpej 		vhold((ap)->a_vp);					\
    195  1.115   thorpej 	}
    196  1.115   thorpej 
    197  1.115   thorpej #define	vop_remove_post_common(ap, e, dn, lc)				\
    198  1.115   thorpej do {									\
    199  1.115   thorpej 	VOP_POST_KNOTE((ap)->a_dvp, (e), (dn));				\
    200  1.115   thorpej 	if (__predict_false(post_event_vp)) {				\
    201  1.115   thorpej 		VOP_POST_KNOTE_HELD((ap)->a_vp, (e),			\
    202  1.115   thorpej 		    (lc) ? NOTE_LINK : NOTE_DELETE);			\
    203  1.115   thorpej 	}								\
    204  1.115   thorpej } while (/*CONSTCOND*/0)
    205  1.115   thorpej 
    206  1.115   thorpej /*
    207  1.115   thorpej  * One could make the argument that VOP_REMOVE() should send NOTE_LINK
    208  1.115   thorpej  * on vp if the resulting link count is not zero, but that's not what
    209  1.115   thorpej  * the documentation says.
    210  1.115   thorpej  *
    211  1.115   thorpej  * We could change this easily by passing ap->ctx_vp_new_nlink to
    212  1.115   thorpej  * vop_remove_post_common().
    213  1.115   thorpej  */
    214  1.115   thorpej #define	vop_remove_pre(ap)						\
    215  1.115   thorpej 	vop_remove_pre_common((ap));					\
    216  1.115   thorpej 	/*								\
    217  1.115   thorpej 	 * We will assume that the file being removed is deleted unless	\
    218  1.115   thorpej 	 * the file system tells us otherwise by updating vp_new_nlink.	\
    219  1.115   thorpej 	 */								\
    220  1.115   thorpej 	(ap)->ctx_vp_new_nlink = 0;
    221  1.115   thorpej 
    222  1.115   thorpej #define	vop_remove_post(ap, e)						\
    223  1.115   thorpej 	vop_remove_post_common((ap), (e), NOTE_WRITE, 0)
    224  1.115   thorpej 
    225  1.115   thorpej #define	vop_rmdir_pre(ap)						\
    226  1.115   thorpej 	vop_remove_pre_common(ap)
    227  1.115   thorpej 
    228  1.115   thorpej #define	vop_rmdir_post(ap, e)						\
    229  1.115   thorpej 	vop_remove_post_common((ap), (e), NOTE_WRITE | NOTE_LINK, 0)
    230  1.115   thorpej 
    231  1.115   thorpej #define	vop_symlink_post(ap, e)						\
    232  1.115   thorpej 	VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE)
    233  1.115   thorpej 
    234  1.115   thorpej #define	vop_open_post(ap, e)						\
    235  1.115   thorpej 	VOP_POST_KNOTE((ap)->a_vp, (e), NOTE_OPEN)
    236  1.115   thorpej 
    237  1.115   thorpej #define	vop_close_post(ap, e)						\
    238  1.115   thorpej do {									\
    239  1.115   thorpej 	extern int (**dead_vnodeop_p)(void *);				\
    240  1.115   thorpej 									\
    241  1.115   thorpej 	/* See the definition of VN_KNOTE() in <sys/vnode.h>. */	\
    242  1.115   thorpej 	if (__predict_false(VN_KEVENT_INTEREST((ap)->a_vp,		\
    243  1.115   thorpej 	    NOTE_CLOSE_WRITE | NOTE_CLOSE) && (e) == 0)) {		\
    244  1.115   thorpej 		struct vnode *thisvp = (ap)->a_vp;			\
    245  1.115   thorpej 		mutex_enter(thisvp->v_interlock);			\
    246  1.115   thorpej 		/*							\
    247  1.115   thorpej 		 * Don't send NOTE_CLOSE when closing a vnode that's	\
    248  1.115   thorpej 		 * been reclaimed or otherwise revoked; a NOTE_REVOKE	\
    249  1.115   thorpej 		 * has already been sent, and this close is effectively	\
    250  1.115   thorpej 		 * meaningless from the watcher's perspective.		\
    251  1.115   thorpej 		 */							\
    252  1.115   thorpej 		if (__predict_true(thisvp->v_op != dead_vnodeop_p)) {	\
    253  1.115   thorpej 			knote(&thisvp->v_klist,				\
    254  1.115   thorpej 			    ((ap)->a_fflag & FWRITE)			\
    255  1.115   thorpej 			    ? NOTE_CLOSE_WRITE : NOTE_CLOSE);		\
    256  1.115   thorpej 		}							\
    257  1.115   thorpej 		mutex_exit(thisvp->v_interlock);			\
    258  1.115   thorpej 	}								\
    259  1.115   thorpej } while (/*CONSTCOND*/0)
    260  1.115   thorpej 
    261  1.115   thorpej #define	vop_read_post(ap, e)						\
    262  1.115   thorpej 	VOP_POST_KNOTE((ap)->a_vp, (e), NOTE_READ)
    263  1.115   thorpej 
    264  1.115   thorpej #define	vop_write_pre(ap)						\
    265  1.115   thorpej 	off_t ooffset = 0, noffset = 0;					\
    266  1.115   thorpej 	u_quad_t osize = 0;						\
    267  1.115   thorpej 	long vp_events =						\
    268  1.115   thorpej 	    VN_KEVENT_INTEREST((ap)->a_vp, NOTE_WRITE | NOTE_EXTEND)	\
    269  1.115   thorpej 	    ? NOTE_WRITE : 0;						\
    270  1.115   thorpej 	if (__predict_false(vp_events != 0)) {				\
    271  1.115   thorpej 		ooffset = (ap)->a_uio->uio_offset;			\
    272  1.115   thorpej 		osize = vop_pre_get_size((ap)->a_vp);			\
    273  1.115   thorpej 	}
    274  1.115   thorpej 
    275  1.115   thorpej #define	vop_write_post(ap, e)						\
    276  1.115   thorpej do {									\
    277  1.115   thorpej 	/*								\
    278  1.115   thorpej 	 * If any data was written, we'll post an event, even if	\
    279  1.115   thorpej 	 * there was an error.						\
    280  1.115   thorpej 	 */								\
    281  1.115   thorpej 	noffset = (ap)->a_uio->uio_offset;				\
    282  1.115   thorpej 	if (__predict_false(vp_events != 0 && noffset > ooffset)) {	\
    283  1.115   thorpej 		if (noffset > osize) {					\
    284  1.115   thorpej 			vp_events |= NOTE_EXTEND;			\
    285  1.115   thorpej 		}							\
    286  1.115   thorpej 		VN_KNOTE((ap)->a_vp, vp_events);			\
    287  1.115   thorpej 	}								\
    288  1.115   thorpej } while (/*CONSTCOND*/0)
    289  1.115   thorpej 
    290  1.105   hannken static inline void
    291  1.105   hannken vop_post(vnode_t *vp, struct mount *mp, bool mpsafe, enum fst_op op)
    292  1.105   hannken {
    293  1.105   hannken 
    294  1.108   hannken 	if (op == FST_YES || op == FST_LAZY) {
    295  1.105   hannken 		fstrans_done(mp);
    296  1.105   hannken 	}
    297  1.105   hannken 
    298  1.105   hannken 	if (!mpsafe) {
    299  1.105   hannken 		KERNEL_UNLOCK_ONE(curlwp);
    300  1.105   hannken 	}
    301  1.105   hannken }
    302  1.105   hannken 
    303  1.116   hannken static inline void
    304  1.116   hannken assert_vop_unlocked(vnode_t *vp, const char *str)
    305  1.116   hannken {
    306  1.116   hannken 
    307  1.116   hannken 	if (VOP_ISLOCKED(vp) == LK_EXCLUSIVE)
    308  1.116   hannken 		panic("%s: %p %d/%d is locked but should not be",
    309  1.116   hannken 		    str, vp, vp->v_tag, vp->v_type);
    310  1.116   hannken }
    311  1.116   hannken 
    312  1.116   hannken static inline void
    313  1.116   hannken assert_vop_locked(vnode_t *vp, const char *str)
    314  1.116   hannken {
    315  1.116   hannken 
    316  1.116   hannken 	if (VOP_ISLOCKED(vp) == LK_NONE)
    317  1.116   hannken 		panic("%s: %p %d/%d is not locked but should be",
    318  1.116   hannken 		    str, vp, vp->v_tag, vp->v_type);
    319  1.116   hannken }
    320  1.116   hannken 
    321  1.116   hannken static inline void
    322  1.116   hannken assert_vop_elocked(vnode_t *vp, const char *str)
    323  1.116   hannken {
    324  1.116   hannken 
    325  1.116   hannken 	if (VOP_ISLOCKED(vp) != LK_EXCLUSIVE)
    326  1.116   hannken 		panic("%s: %p %d/%d is not exclusive locked but should be",
    327  1.116   hannken 		    str, vp, vp->v_tag, vp->v_type);
    328  1.116   hannken }
    329  1.116   hannken 
    330   1.34     lukem const struct vnodeop_desc vop_default_desc = {
    331    1.1       cgd 	0,
    332    1.1       cgd 	"default",
    333    1.1       cgd 	0,
    334    1.1       cgd 	NULL,
    335    1.1       cgd 	VDESC_NO_OFFSET,
    336    1.1       cgd 	VDESC_NO_OFFSET,
    337    1.1       cgd 	VDESC_NO_OFFSET,
    338    1.1       cgd };
    339    1.1       cgd 
    340    1.1       cgd 
    341   1.33  jdolecek const int vop_bwrite_vp_offsets[] = {
    342   1.88   hannken 	VOPARG_OFFSETOF(struct vop_bwrite_args,a_vp),
    343   1.33  jdolecek 	VDESC_NO_OFFSET
    344   1.33  jdolecek };
    345   1.33  jdolecek const struct vnodeop_desc vop_bwrite_desc = {
    346   1.67     pooka 	VOP_BWRITE_DESCOFFSET,
    347   1.33  jdolecek 	"vop_bwrite",
    348   1.33  jdolecek 	0,
    349   1.33  jdolecek 	vop_bwrite_vp_offsets,
    350   1.33  jdolecek 	VDESC_NO_OFFSET,
    351   1.33  jdolecek 	VDESC_NO_OFFSET,
    352   1.33  jdolecek 	VDESC_NO_OFFSET,
    353   1.33  jdolecek };
    354   1.33  jdolecek int
    355   1.88   hannken VOP_BWRITE(struct vnode *vp,
    356   1.88   hannken     struct buf *bp)
    357   1.33  jdolecek {
    358   1.72        ad 	int error;
    359   1.72        ad 	bool mpsafe;
    360   1.33  jdolecek 	struct vop_bwrite_args a;
    361  1.105   hannken 	struct mount *mp;
    362   1.33  jdolecek 	a.a_desc = VDESC(vop_bwrite);
    363   1.88   hannken 	a.a_vp = vp;
    364   1.33  jdolecek 	a.a_bp = bp;
    365  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_YES);
    366  1.105   hannken 	if (error)
    367  1.105   hannken 		return error;
    368   1.88   hannken 	error = (VCALL(vp, VOFFSET(vop_bwrite), &a));
    369  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_YES);
    370   1.72        ad 	return error;
    371   1.33  jdolecek }
    372   1.33  jdolecek 
    373  1.113  dholland const int vop_parsepath_vp_offsets[] = {
    374  1.113  dholland 	VOPARG_OFFSETOF(struct vop_parsepath_args,a_dvp),
    375  1.113  dholland 	VDESC_NO_OFFSET
    376  1.113  dholland };
    377  1.113  dholland const struct vnodeop_desc vop_parsepath_desc = {
    378  1.113  dholland 	VOP_PARSEPATH_DESCOFFSET,
    379  1.113  dholland 	"vop_parsepath",
    380  1.113  dholland 	0,
    381  1.113  dholland 	vop_parsepath_vp_offsets,
    382  1.113  dholland 	VDESC_NO_OFFSET,
    383  1.113  dholland 	VDESC_NO_OFFSET,
    384  1.113  dholland 	VDESC_NO_OFFSET,
    385  1.113  dholland };
    386  1.113  dholland int
    387  1.113  dholland VOP_PARSEPATH(struct vnode *dvp,
    388  1.113  dholland     const char *name,
    389  1.113  dholland     size_t *retval)
    390  1.113  dholland {
    391  1.113  dholland 	int error;
    392  1.113  dholland 	bool mpsafe;
    393  1.113  dholland 	struct vop_parsepath_args a;
    394  1.113  dholland 	struct mount *mp;
    395  1.113  dholland 	a.a_desc = VDESC(vop_parsepath);
    396  1.113  dholland 	a.a_dvp = dvp;
    397  1.113  dholland 	a.a_name = name;
    398  1.113  dholland 	a.a_retval = retval;
    399  1.114  dholland 	error = vop_pre(dvp, &mp, &mpsafe, FST_NO);
    400  1.113  dholland 	if (error)
    401  1.113  dholland 		return error;
    402  1.113  dholland 	error = (VCALL(dvp, VOFFSET(vop_parsepath), &a));
    403  1.114  dholland 	vop_post(dvp, mp, mpsafe, FST_NO);
    404  1.113  dholland 	return error;
    405  1.113  dholland }
    406  1.113  dholland 
    407   1.31  jdolecek const int vop_lookup_vp_offsets[] = {
    408   1.92   hannken 	VOPARG_OFFSETOF(struct vop_lookup_v2_args,a_dvp),
    409    1.1       cgd 	VDESC_NO_OFFSET
    410    1.1       cgd };
    411   1.33  jdolecek const struct vnodeop_desc vop_lookup_desc = {
    412   1.67     pooka 	VOP_LOOKUP_DESCOFFSET,
    413    1.1       cgd 	"vop_lookup",
    414    1.1       cgd 	0,
    415    1.1       cgd 	vop_lookup_vp_offsets,
    416   1.92   hannken 	VOPARG_OFFSETOF(struct vop_lookup_v2_args, a_vpp),
    417    1.1       cgd 	VDESC_NO_OFFSET,
    418   1.92   hannken 	VOPARG_OFFSETOF(struct vop_lookup_v2_args, a_cnp),
    419    1.1       cgd };
    420   1.23   thorpej int
    421   1.60   thorpej VOP_LOOKUP(struct vnode *dvp,
    422   1.60   thorpej     struct vnode **vpp,
    423   1.60   thorpej     struct componentname *cnp)
    424   1.23   thorpej {
    425   1.72        ad 	int error;
    426   1.72        ad 	bool mpsafe;
    427   1.92   hannken 	struct vop_lookup_v2_args a;
    428  1.105   hannken 	struct mount *mp;
    429   1.23   thorpej 	a.a_desc = VDESC(vop_lookup);
    430   1.23   thorpej 	a.a_dvp = dvp;
    431   1.23   thorpej 	a.a_vpp = vpp;
    432   1.23   thorpej 	a.a_cnp = cnp;
    433  1.116   hannken 	assert_vop_locked(dvp, "vop_lookup: dvp");
    434  1.105   hannken 	error = vop_pre(dvp, &mp, &mpsafe, FST_NO);
    435  1.105   hannken 	if (error)
    436  1.105   hannken 		return error;
    437   1.72        ad 	error = (VCALL(dvp, VOFFSET(vop_lookup), &a));
    438  1.105   hannken 	vop_post(dvp, mp, mpsafe, FST_NO);
    439   1.69     pooka #ifdef DIAGNOSTIC
    440   1.72        ad 	if (error == 0)
    441   1.69     pooka 		KASSERT((*vpp)->v_size != VSIZENOTSET
    442   1.69     pooka 		    && (*vpp)->v_writesize != VSIZENOTSET);
    443   1.69     pooka #endif /* DIAGNOSTIC */
    444   1.72        ad 	return error;
    445   1.23   thorpej }
    446    1.1       cgd 
    447   1.31  jdolecek const int vop_create_vp_offsets[] = {
    448   1.91   hannken 	VOPARG_OFFSETOF(struct vop_create_v3_args,a_dvp),
    449    1.1       cgd 	VDESC_NO_OFFSET
    450    1.1       cgd };
    451   1.33  jdolecek const struct vnodeop_desc vop_create_desc = {
    452   1.67     pooka 	VOP_CREATE_DESCOFFSET,
    453    1.1       cgd 	"vop_create",
    454   1.90   hannken 	0,
    455    1.1       cgd 	vop_create_vp_offsets,
    456   1.91   hannken 	VOPARG_OFFSETOF(struct vop_create_v3_args, a_vpp),
    457    1.1       cgd 	VDESC_NO_OFFSET,
    458   1.91   hannken 	VOPARG_OFFSETOF(struct vop_create_v3_args, a_cnp),
    459    1.1       cgd };
    460   1.23   thorpej int
    461   1.60   thorpej VOP_CREATE(struct vnode *dvp,
    462   1.60   thorpej     struct vnode **vpp,
    463   1.60   thorpej     struct componentname *cnp,
    464   1.60   thorpej     struct vattr *vap)
    465   1.23   thorpej {
    466   1.72        ad 	int error;
    467   1.72        ad 	bool mpsafe;
    468   1.91   hannken 	struct vop_create_v3_args a;
    469  1.105   hannken 	struct mount *mp;
    470   1.23   thorpej 	a.a_desc = VDESC(vop_create);
    471   1.23   thorpej 	a.a_dvp = dvp;
    472   1.23   thorpej 	a.a_vpp = vpp;
    473   1.23   thorpej 	a.a_cnp = cnp;
    474   1.23   thorpej 	a.a_vap = vap;
    475  1.116   hannken 	assert_vop_elocked(dvp, "vop_create: dvp");
    476  1.105   hannken 	error = vop_pre(dvp, &mp, &mpsafe, FST_NO);
    477  1.105   hannken 	if (error)
    478  1.105   hannken 		return error;
    479   1.72        ad 	error = (VCALL(dvp, VOFFSET(vop_create), &a));
    480  1.105   hannken 	vop_post(dvp, mp, mpsafe, FST_NO);
    481  1.115   thorpej 	vop_create_post(&a, error);
    482   1.69     pooka #ifdef DIAGNOSTIC
    483   1.72        ad 	if (error == 0)
    484   1.69     pooka 		KASSERT((*vpp)->v_size != VSIZENOTSET
    485   1.69     pooka 		    && (*vpp)->v_writesize != VSIZENOTSET);
    486   1.69     pooka #endif /* DIAGNOSTIC */
    487   1.72        ad 	return error;
    488   1.23   thorpej }
    489    1.1       cgd 
    490   1.31  jdolecek const int vop_mknod_vp_offsets[] = {
    491   1.91   hannken 	VOPARG_OFFSETOF(struct vop_mknod_v3_args,a_dvp),
    492    1.1       cgd 	VDESC_NO_OFFSET
    493    1.1       cgd };
    494   1.33  jdolecek const struct vnodeop_desc vop_mknod_desc = {
    495   1.67     pooka 	VOP_MKNOD_DESCOFFSET,
    496    1.1       cgd 	"vop_mknod",
    497   1.90   hannken 	0,
    498    1.1       cgd 	vop_mknod_vp_offsets,
    499   1.91   hannken 	VOPARG_OFFSETOF(struct vop_mknod_v3_args, a_vpp),
    500    1.1       cgd 	VDESC_NO_OFFSET,
    501   1.91   hannken 	VOPARG_OFFSETOF(struct vop_mknod_v3_args, a_cnp),
    502    1.1       cgd };
    503   1.23   thorpej int
    504   1.60   thorpej VOP_MKNOD(struct vnode *dvp,
    505   1.60   thorpej     struct vnode **vpp,
    506   1.60   thorpej     struct componentname *cnp,
    507   1.60   thorpej     struct vattr *vap)
    508   1.23   thorpej {
    509   1.72        ad 	int error;
    510   1.72        ad 	bool mpsafe;
    511   1.91   hannken 	struct vop_mknod_v3_args a;
    512  1.105   hannken 	struct mount *mp;
    513   1.23   thorpej 	a.a_desc = VDESC(vop_mknod);
    514   1.23   thorpej 	a.a_dvp = dvp;
    515   1.23   thorpej 	a.a_vpp = vpp;
    516   1.23   thorpej 	a.a_cnp = cnp;
    517   1.23   thorpej 	a.a_vap = vap;
    518  1.116   hannken 	assert_vop_elocked(dvp, "vop_mknod: dvp");
    519  1.105   hannken 	error = vop_pre(dvp, &mp, &mpsafe, FST_NO);
    520  1.105   hannken 	if (error)
    521  1.105   hannken 		return error;
    522   1.72        ad 	error = (VCALL(dvp, VOFFSET(vop_mknod), &a));
    523  1.105   hannken 	vop_post(dvp, mp, mpsafe, FST_NO);
    524  1.115   thorpej 	vop_mknod_post(&a, error);
    525   1.69     pooka #ifdef DIAGNOSTIC
    526   1.72        ad 	if (error == 0)
    527   1.69     pooka 		KASSERT((*vpp)->v_size != VSIZENOTSET
    528   1.69     pooka 		    && (*vpp)->v_writesize != VSIZENOTSET);
    529   1.69     pooka #endif /* DIAGNOSTIC */
    530   1.72        ad 	return error;
    531   1.23   thorpej }
    532    1.1       cgd 
    533   1.31  jdolecek const int vop_open_vp_offsets[] = {
    534    1.1       cgd 	VOPARG_OFFSETOF(struct vop_open_args,a_vp),
    535    1.1       cgd 	VDESC_NO_OFFSET
    536    1.1       cgd };
    537   1.33  jdolecek const struct vnodeop_desc vop_open_desc = {
    538   1.67     pooka 	VOP_OPEN_DESCOFFSET,
    539    1.1       cgd 	"vop_open",
    540    1.1       cgd 	0,
    541    1.1       cgd 	vop_open_vp_offsets,
    542    1.1       cgd 	VDESC_NO_OFFSET,
    543    1.1       cgd 	VOPARG_OFFSETOF(struct vop_open_args, a_cred),
    544    1.1       cgd 	VDESC_NO_OFFSET,
    545    1.1       cgd };
    546   1.23   thorpej int
    547   1.60   thorpej VOP_OPEN(struct vnode *vp,
    548   1.60   thorpej     int mode,
    549   1.73     pooka     kauth_cred_t cred)
    550   1.23   thorpej {
    551   1.72        ad 	int error;
    552   1.72        ad 	bool mpsafe;
    553   1.23   thorpej 	struct vop_open_args a;
    554  1.105   hannken 	struct mount *mp;
    555   1.23   thorpej 	a.a_desc = VDESC(vop_open);
    556   1.23   thorpej 	a.a_vp = vp;
    557   1.23   thorpej 	a.a_mode = mode;
    558   1.23   thorpej 	a.a_cred = cred;
    559  1.116   hannken 	assert_vop_locked(vp, "vop_open: vp");
    560  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
    561  1.105   hannken 	if (error)
    562  1.105   hannken 		return error;
    563   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_open), &a));
    564  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
    565  1.115   thorpej 	vop_open_post(&a, error);
    566   1.72        ad 	return error;
    567   1.23   thorpej }
    568    1.1       cgd 
    569   1.31  jdolecek const int vop_close_vp_offsets[] = {
    570    1.1       cgd 	VOPARG_OFFSETOF(struct vop_close_args,a_vp),
    571    1.1       cgd 	VDESC_NO_OFFSET
    572    1.1       cgd };
    573   1.33  jdolecek const struct vnodeop_desc vop_close_desc = {
    574   1.67     pooka 	VOP_CLOSE_DESCOFFSET,
    575    1.1       cgd 	"vop_close",
    576    1.1       cgd 	0,
    577    1.1       cgd 	vop_close_vp_offsets,
    578    1.1       cgd 	VDESC_NO_OFFSET,
    579    1.1       cgd 	VOPARG_OFFSETOF(struct vop_close_args, a_cred),
    580    1.1       cgd 	VDESC_NO_OFFSET,
    581    1.1       cgd };
    582   1.23   thorpej int
    583   1.60   thorpej VOP_CLOSE(struct vnode *vp,
    584   1.60   thorpej     int fflag,
    585   1.73     pooka     kauth_cred_t cred)
    586   1.23   thorpej {
    587   1.72        ad 	int error;
    588   1.72        ad 	bool mpsafe;
    589   1.23   thorpej 	struct vop_close_args a;
    590  1.105   hannken 	struct mount *mp;
    591   1.23   thorpej 	a.a_desc = VDESC(vop_close);
    592   1.23   thorpej 	a.a_vp = vp;
    593   1.23   thorpej 	a.a_fflag = fflag;
    594   1.23   thorpej 	a.a_cred = cred;
    595  1.116   hannken 	assert_vop_locked(vp, "vop_close: vp");
    596  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
    597  1.105   hannken 	if (error)
    598  1.105   hannken 		return error;
    599   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_close), &a));
    600  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
    601  1.115   thorpej 	vop_close_post(&a, error);
    602   1.72        ad 	return error;
    603   1.23   thorpej }
    604    1.1       cgd 
    605   1.31  jdolecek const int vop_access_vp_offsets[] = {
    606    1.1       cgd 	VOPARG_OFFSETOF(struct vop_access_args,a_vp),
    607    1.1       cgd 	VDESC_NO_OFFSET
    608    1.1       cgd };
    609   1.33  jdolecek const struct vnodeop_desc vop_access_desc = {
    610   1.67     pooka 	VOP_ACCESS_DESCOFFSET,
    611    1.1       cgd 	"vop_access",
    612    1.1       cgd 	0,
    613    1.1       cgd 	vop_access_vp_offsets,
    614    1.1       cgd 	VDESC_NO_OFFSET,
    615    1.1       cgd 	VOPARG_OFFSETOF(struct vop_access_args, a_cred),
    616    1.1       cgd 	VDESC_NO_OFFSET,
    617    1.1       cgd };
    618   1.23   thorpej int
    619   1.60   thorpej VOP_ACCESS(struct vnode *vp,
    620  1.111  christos     accmode_t accmode,
    621   1.73     pooka     kauth_cred_t cred)
    622   1.23   thorpej {
    623   1.72        ad 	int error;
    624   1.72        ad 	bool mpsafe;
    625   1.23   thorpej 	struct vop_access_args a;
    626  1.105   hannken 	struct mount *mp;
    627   1.23   thorpej 	a.a_desc = VDESC(vop_access);
    628   1.23   thorpej 	a.a_vp = vp;
    629  1.111  christos 	a.a_accmode = accmode;
    630   1.23   thorpej 	a.a_cred = cred;
    631  1.116   hannken 	assert_vop_locked(vp, "vop_access: vp");
    632  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
    633  1.105   hannken 	if (error)
    634  1.105   hannken 		return error;
    635   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_access), &a));
    636  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
    637   1.72        ad 	return error;
    638   1.23   thorpej }
    639    1.1       cgd 
    640  1.111  christos const int vop_accessx_vp_offsets[] = {
    641  1.111  christos 	VOPARG_OFFSETOF(struct vop_accessx_args,a_vp),
    642  1.111  christos 	VDESC_NO_OFFSET
    643  1.111  christos };
    644  1.111  christos const struct vnodeop_desc vop_accessx_desc = {
    645  1.111  christos 	VOP_ACCESSX_DESCOFFSET,
    646  1.111  christos 	"vop_accessx",
    647  1.111  christos 	0,
    648  1.111  christos 	vop_accessx_vp_offsets,
    649  1.111  christos 	VDESC_NO_OFFSET,
    650  1.111  christos 	VOPARG_OFFSETOF(struct vop_accessx_args, a_cred),
    651  1.111  christos 	VDESC_NO_OFFSET,
    652  1.111  christos };
    653  1.111  christos int
    654  1.111  christos VOP_ACCESSX(struct vnode *vp,
    655  1.111  christos     accmode_t accmode,
    656  1.111  christos     kauth_cred_t cred)
    657  1.111  christos {
    658  1.111  christos 	int error;
    659  1.111  christos 	bool mpsafe;
    660  1.111  christos 	struct vop_accessx_args a;
    661  1.111  christos 	struct mount *mp;
    662  1.111  christos 	a.a_desc = VDESC(vop_accessx);
    663  1.111  christos 	a.a_vp = vp;
    664  1.111  christos 	a.a_accmode = accmode;
    665  1.111  christos 	a.a_cred = cred;
    666  1.116   hannken 	assert_vop_locked(vp, "vop_accessx: vp");
    667  1.111  christos 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
    668  1.111  christos 	if (error)
    669  1.111  christos 		return error;
    670  1.111  christos 	error = (VCALL(vp, VOFFSET(vop_accessx), &a));
    671  1.111  christos 	vop_post(vp, mp, mpsafe, FST_NO);
    672  1.111  christos 	return error;
    673  1.111  christos }
    674  1.111  christos 
    675   1.31  jdolecek const int vop_getattr_vp_offsets[] = {
    676    1.1       cgd 	VOPARG_OFFSETOF(struct vop_getattr_args,a_vp),
    677    1.1       cgd 	VDESC_NO_OFFSET
    678    1.1       cgd };
    679   1.33  jdolecek const struct vnodeop_desc vop_getattr_desc = {
    680   1.67     pooka 	VOP_GETATTR_DESCOFFSET,
    681    1.1       cgd 	"vop_getattr",
    682    1.1       cgd 	0,
    683    1.1       cgd 	vop_getattr_vp_offsets,
    684    1.1       cgd 	VDESC_NO_OFFSET,
    685    1.1       cgd 	VOPARG_OFFSETOF(struct vop_getattr_args, a_cred),
    686    1.1       cgd 	VDESC_NO_OFFSET,
    687    1.1       cgd };
    688   1.23   thorpej int
    689   1.60   thorpej VOP_GETATTR(struct vnode *vp,
    690   1.60   thorpej     struct vattr *vap,
    691   1.73     pooka     kauth_cred_t cred)
    692   1.23   thorpej {
    693   1.72        ad 	int error;
    694   1.72        ad 	bool mpsafe;
    695   1.23   thorpej 	struct vop_getattr_args a;
    696  1.105   hannken 	struct mount *mp;
    697   1.23   thorpej 	a.a_desc = VDESC(vop_getattr);
    698   1.23   thorpej 	a.a_vp = vp;
    699   1.23   thorpej 	a.a_vap = vap;
    700   1.23   thorpej 	a.a_cred = cred;
    701  1.116   hannken 	assert_vop_locked(vp, "vop_getattr: vp");
    702  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
    703  1.105   hannken 	if (error)
    704  1.105   hannken 		return error;
    705   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_getattr), &a));
    706  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
    707   1.72        ad 	return error;
    708   1.23   thorpej }
    709    1.1       cgd 
    710   1.31  jdolecek const int vop_setattr_vp_offsets[] = {
    711    1.1       cgd 	VOPARG_OFFSETOF(struct vop_setattr_args,a_vp),
    712    1.1       cgd 	VDESC_NO_OFFSET
    713    1.1       cgd };
    714   1.33  jdolecek const struct vnodeop_desc vop_setattr_desc = {
    715   1.67     pooka 	VOP_SETATTR_DESCOFFSET,
    716    1.1       cgd 	"vop_setattr",
    717    1.1       cgd 	0,
    718    1.1       cgd 	vop_setattr_vp_offsets,
    719    1.1       cgd 	VDESC_NO_OFFSET,
    720    1.1       cgd 	VOPARG_OFFSETOF(struct vop_setattr_args, a_cred),
    721    1.1       cgd 	VDESC_NO_OFFSET,
    722    1.1       cgd };
    723   1.23   thorpej int
    724   1.60   thorpej VOP_SETATTR(struct vnode *vp,
    725   1.60   thorpej     struct vattr *vap,
    726   1.73     pooka     kauth_cred_t cred)
    727   1.23   thorpej {
    728   1.72        ad 	int error;
    729   1.72        ad 	bool mpsafe;
    730   1.23   thorpej 	struct vop_setattr_args a;
    731  1.105   hannken 	struct mount *mp;
    732   1.23   thorpej 	a.a_desc = VDESC(vop_setattr);
    733   1.23   thorpej 	a.a_vp = vp;
    734   1.23   thorpej 	a.a_vap = vap;
    735   1.23   thorpej 	a.a_cred = cred;
    736  1.116   hannken 	assert_vop_elocked(vp, "vop_setattr: vp");
    737  1.115   thorpej 	vop_setattr_pre(&a);
    738  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
    739  1.105   hannken 	if (error)
    740  1.105   hannken 		return error;
    741   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_setattr), &a));
    742  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
    743  1.115   thorpej 	vop_setattr_post(&a, error);
    744   1.72        ad 	return error;
    745   1.23   thorpej }
    746    1.1       cgd 
    747   1.31  jdolecek const int vop_read_vp_offsets[] = {
    748    1.1       cgd 	VOPARG_OFFSETOF(struct vop_read_args,a_vp),
    749    1.1       cgd 	VDESC_NO_OFFSET
    750    1.1       cgd };
    751   1.33  jdolecek const struct vnodeop_desc vop_read_desc = {
    752   1.67     pooka 	VOP_READ_DESCOFFSET,
    753    1.1       cgd 	"vop_read",
    754    1.1       cgd 	0,
    755    1.1       cgd 	vop_read_vp_offsets,
    756    1.1       cgd 	VDESC_NO_OFFSET,
    757    1.1       cgd 	VOPARG_OFFSETOF(struct vop_read_args, a_cred),
    758    1.1       cgd 	VDESC_NO_OFFSET,
    759    1.1       cgd };
    760   1.23   thorpej int
    761   1.60   thorpej VOP_READ(struct vnode *vp,
    762   1.60   thorpej     struct uio *uio,
    763   1.60   thorpej     int ioflag,
    764   1.65      elad     kauth_cred_t cred)
    765   1.23   thorpej {
    766   1.72        ad 	int error;
    767   1.72        ad 	bool mpsafe;
    768   1.23   thorpej 	struct vop_read_args a;
    769  1.105   hannken 	struct mount *mp;
    770   1.23   thorpej 	a.a_desc = VDESC(vop_read);
    771   1.23   thorpej 	a.a_vp = vp;
    772   1.23   thorpej 	a.a_uio = uio;
    773   1.23   thorpej 	a.a_ioflag = ioflag;
    774   1.23   thorpej 	a.a_cred = cred;
    775  1.116   hannken 	assert_vop_locked(vp, "vop_read: vp");
    776  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
    777  1.105   hannken 	if (error)
    778  1.105   hannken 		return error;
    779   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_read), &a));
    780  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
    781  1.115   thorpej 	vop_read_post(&a, error);
    782   1.72        ad 	return error;
    783   1.23   thorpej }
    784    1.1       cgd 
    785   1.31  jdolecek const int vop_write_vp_offsets[] = {
    786    1.1       cgd 	VOPARG_OFFSETOF(struct vop_write_args,a_vp),
    787    1.1       cgd 	VDESC_NO_OFFSET
    788    1.1       cgd };
    789   1.33  jdolecek const struct vnodeop_desc vop_write_desc = {
    790   1.67     pooka 	VOP_WRITE_DESCOFFSET,
    791    1.1       cgd 	"vop_write",
    792    1.1       cgd 	0,
    793    1.1       cgd 	vop_write_vp_offsets,
    794    1.1       cgd 	VDESC_NO_OFFSET,
    795    1.1       cgd 	VOPARG_OFFSETOF(struct vop_write_args, a_cred),
    796    1.1       cgd 	VDESC_NO_OFFSET,
    797    1.1       cgd };
    798   1.23   thorpej int
    799   1.60   thorpej VOP_WRITE(struct vnode *vp,
    800   1.60   thorpej     struct uio *uio,
    801   1.60   thorpej     int ioflag,
    802   1.65      elad     kauth_cred_t cred)
    803   1.23   thorpej {
    804   1.72        ad 	int error;
    805   1.72        ad 	bool mpsafe;
    806   1.23   thorpej 	struct vop_write_args a;
    807  1.105   hannken 	struct mount *mp;
    808   1.23   thorpej 	a.a_desc = VDESC(vop_write);
    809   1.23   thorpej 	a.a_vp = vp;
    810   1.23   thorpej 	a.a_uio = uio;
    811   1.23   thorpej 	a.a_ioflag = ioflag;
    812   1.23   thorpej 	a.a_cred = cred;
    813  1.116   hannken 	assert_vop_locked(vp, "vop_write: vp");
    814  1.115   thorpej 	vop_write_pre(&a);
    815  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
    816  1.105   hannken 	if (error)
    817  1.105   hannken 		return error;
    818   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_write), &a));
    819  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
    820  1.115   thorpej 	vop_write_post(&a, error);
    821   1.72        ad 	return error;
    822   1.23   thorpej }
    823    1.1       cgd 
    824   1.93  dholland const int vop_fallocate_vp_offsets[] = {
    825   1.93  dholland 	VOPARG_OFFSETOF(struct vop_fallocate_args,a_vp),
    826   1.93  dholland 	VDESC_NO_OFFSET
    827   1.93  dholland };
    828   1.93  dholland const struct vnodeop_desc vop_fallocate_desc = {
    829   1.93  dholland 	VOP_FALLOCATE_DESCOFFSET,
    830   1.93  dholland 	"vop_fallocate",
    831   1.93  dholland 	0,
    832   1.93  dholland 	vop_fallocate_vp_offsets,
    833   1.93  dholland 	VDESC_NO_OFFSET,
    834   1.93  dholland 	VDESC_NO_OFFSET,
    835   1.93  dholland 	VDESC_NO_OFFSET,
    836   1.93  dholland };
    837   1.93  dholland int
    838   1.93  dholland VOP_FALLOCATE(struct vnode *vp,
    839   1.93  dholland     off_t pos,
    840   1.93  dholland     off_t len)
    841   1.93  dholland {
    842   1.93  dholland 	int error;
    843   1.93  dholland 	bool mpsafe;
    844   1.93  dholland 	struct vop_fallocate_args a;
    845  1.105   hannken 	struct mount *mp;
    846   1.93  dholland 	a.a_desc = VDESC(vop_fallocate);
    847   1.93  dholland 	a.a_vp = vp;
    848   1.93  dholland 	a.a_pos = pos;
    849   1.93  dholland 	a.a_len = len;
    850  1.116   hannken 	assert_vop_locked(vp, "vop_fallocate: vp");
    851  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
    852  1.105   hannken 	if (error)
    853  1.105   hannken 		return error;
    854   1.93  dholland 	error = (VCALL(vp, VOFFSET(vop_fallocate), &a));
    855  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
    856   1.93  dholland 	return error;
    857   1.93  dholland }
    858   1.93  dholland 
    859   1.93  dholland const int vop_fdiscard_vp_offsets[] = {
    860   1.93  dholland 	VOPARG_OFFSETOF(struct vop_fdiscard_args,a_vp),
    861   1.93  dholland 	VDESC_NO_OFFSET
    862   1.93  dholland };
    863   1.93  dholland const struct vnodeop_desc vop_fdiscard_desc = {
    864   1.93  dholland 	VOP_FDISCARD_DESCOFFSET,
    865   1.93  dholland 	"vop_fdiscard",
    866   1.93  dholland 	0,
    867   1.93  dholland 	vop_fdiscard_vp_offsets,
    868   1.93  dholland 	VDESC_NO_OFFSET,
    869   1.93  dholland 	VDESC_NO_OFFSET,
    870   1.93  dholland 	VDESC_NO_OFFSET,
    871   1.93  dholland };
    872   1.93  dholland int
    873   1.93  dholland VOP_FDISCARD(struct vnode *vp,
    874   1.93  dholland     off_t pos,
    875   1.93  dholland     off_t len)
    876   1.93  dholland {
    877   1.93  dholland 	int error;
    878   1.93  dholland 	bool mpsafe;
    879   1.93  dholland 	struct vop_fdiscard_args a;
    880  1.105   hannken 	struct mount *mp;
    881   1.93  dholland 	a.a_desc = VDESC(vop_fdiscard);
    882   1.93  dholland 	a.a_vp = vp;
    883   1.93  dholland 	a.a_pos = pos;
    884   1.93  dholland 	a.a_len = len;
    885  1.116   hannken 	assert_vop_locked(vp, "vop_fdiscard: vp");
    886  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
    887  1.105   hannken 	if (error)
    888  1.105   hannken 		return error;
    889   1.93  dholland 	error = (VCALL(vp, VOFFSET(vop_fdiscard), &a));
    890  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
    891   1.93  dholland 	return error;
    892   1.93  dholland }
    893   1.93  dholland 
    894   1.31  jdolecek const int vop_ioctl_vp_offsets[] = {
    895    1.1       cgd 	VOPARG_OFFSETOF(struct vop_ioctl_args,a_vp),
    896    1.1       cgd 	VDESC_NO_OFFSET
    897    1.1       cgd };
    898   1.33  jdolecek const struct vnodeop_desc vop_ioctl_desc = {
    899   1.67     pooka 	VOP_IOCTL_DESCOFFSET,
    900    1.1       cgd 	"vop_ioctl",
    901    1.1       cgd 	0,
    902    1.1       cgd 	vop_ioctl_vp_offsets,
    903    1.1       cgd 	VDESC_NO_OFFSET,
    904    1.1       cgd 	VOPARG_OFFSETOF(struct vop_ioctl_args, a_cred),
    905    1.1       cgd 	VDESC_NO_OFFSET,
    906    1.1       cgd };
    907   1.23   thorpej int
    908   1.60   thorpej VOP_IOCTL(struct vnode *vp,
    909   1.60   thorpej     u_long command,
    910   1.60   thorpej     void *data,
    911   1.60   thorpej     int fflag,
    912   1.73     pooka     kauth_cred_t cred)
    913   1.23   thorpej {
    914   1.72        ad 	int error;
    915   1.72        ad 	bool mpsafe;
    916   1.23   thorpej 	struct vop_ioctl_args a;
    917  1.105   hannken 	struct mount *mp;
    918   1.23   thorpej 	a.a_desc = VDESC(vop_ioctl);
    919   1.23   thorpej 	a.a_vp = vp;
    920   1.23   thorpej 	a.a_command = command;
    921   1.23   thorpej 	a.a_data = data;
    922   1.23   thorpej 	a.a_fflag = fflag;
    923   1.23   thorpej 	a.a_cred = cred;
    924  1.116   hannken 	assert_vop_unlocked(vp, "vop_ioctl: vp");
    925  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
    926  1.105   hannken 	if (error)
    927  1.105   hannken 		return error;
    928   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_ioctl), &a));
    929  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
    930   1.72        ad 	return error;
    931   1.23   thorpej }
    932    1.1       cgd 
    933   1.31  jdolecek const int vop_fcntl_vp_offsets[] = {
    934   1.18  wrstuden 	VOPARG_OFFSETOF(struct vop_fcntl_args,a_vp),
    935   1.18  wrstuden 	VDESC_NO_OFFSET
    936   1.18  wrstuden };
    937   1.33  jdolecek const struct vnodeop_desc vop_fcntl_desc = {
    938   1.67     pooka 	VOP_FCNTL_DESCOFFSET,
    939   1.18  wrstuden 	"vop_fcntl",
    940   1.18  wrstuden 	0,
    941   1.18  wrstuden 	vop_fcntl_vp_offsets,
    942   1.18  wrstuden 	VDESC_NO_OFFSET,
    943   1.18  wrstuden 	VOPARG_OFFSETOF(struct vop_fcntl_args, a_cred),
    944   1.18  wrstuden 	VDESC_NO_OFFSET,
    945   1.18  wrstuden };
    946   1.23   thorpej int
    947   1.60   thorpej VOP_FCNTL(struct vnode *vp,
    948   1.60   thorpej     u_int command,
    949   1.60   thorpej     void *data,
    950   1.60   thorpej     int fflag,
    951   1.73     pooka     kauth_cred_t cred)
    952   1.23   thorpej {
    953   1.72        ad 	int error;
    954   1.72        ad 	bool mpsafe;
    955   1.23   thorpej 	struct vop_fcntl_args a;
    956  1.105   hannken 	struct mount *mp;
    957   1.23   thorpej 	a.a_desc = VDESC(vop_fcntl);
    958   1.23   thorpej 	a.a_vp = vp;
    959   1.23   thorpej 	a.a_command = command;
    960   1.23   thorpej 	a.a_data = data;
    961   1.23   thorpej 	a.a_fflag = fflag;
    962   1.23   thorpej 	a.a_cred = cred;
    963  1.116   hannken 	assert_vop_unlocked(vp, "vop_fcntl: vp");
    964  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
    965  1.105   hannken 	if (error)
    966  1.105   hannken 		return error;
    967   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_fcntl), &a));
    968  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
    969   1.72        ad 	return error;
    970   1.23   thorpej }
    971   1.18  wrstuden 
    972   1.31  jdolecek const int vop_poll_vp_offsets[] = {
    973    1.3   mycroft 	VOPARG_OFFSETOF(struct vop_poll_args,a_vp),
    974    1.1       cgd 	VDESC_NO_OFFSET
    975    1.1       cgd };
    976   1.33  jdolecek const struct vnodeop_desc vop_poll_desc = {
    977   1.67     pooka 	VOP_POLL_DESCOFFSET,
    978    1.3   mycroft 	"vop_poll",
    979    1.1       cgd 	0,
    980    1.3   mycroft 	vop_poll_vp_offsets,
    981    1.1       cgd 	VDESC_NO_OFFSET,
    982    1.3   mycroft 	VDESC_NO_OFFSET,
    983    1.1       cgd 	VDESC_NO_OFFSET,
    984    1.1       cgd };
    985   1.23   thorpej int
    986   1.60   thorpej VOP_POLL(struct vnode *vp,
    987   1.73     pooka     int events)
    988   1.23   thorpej {
    989   1.72        ad 	int error;
    990   1.72        ad 	bool mpsafe;
    991   1.23   thorpej 	struct vop_poll_args a;
    992  1.105   hannken 	struct mount *mp;
    993   1.23   thorpej 	a.a_desc = VDESC(vop_poll);
    994   1.23   thorpej 	a.a_vp = vp;
    995   1.23   thorpej 	a.a_events = events;
    996  1.116   hannken 	assert_vop_unlocked(vp, "vop_poll: vp");
    997  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_YES);
    998  1.105   hannken 	if (error)
    999  1.105   hannken 		return error;
   1000   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_poll), &a));
   1001  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_YES);
   1002   1.72        ad 	return error;
   1003   1.23   thorpej }
   1004    1.1       cgd 
   1005   1.40  jdolecek const int vop_kqfilter_vp_offsets[] = {
   1006   1.40  jdolecek 	VOPARG_OFFSETOF(struct vop_kqfilter_args,a_vp),
   1007   1.40  jdolecek 	VDESC_NO_OFFSET
   1008   1.40  jdolecek };
   1009   1.40  jdolecek const struct vnodeop_desc vop_kqfilter_desc = {
   1010   1.67     pooka 	VOP_KQFILTER_DESCOFFSET,
   1011   1.40  jdolecek 	"vop_kqfilter",
   1012   1.40  jdolecek 	0,
   1013   1.40  jdolecek 	vop_kqfilter_vp_offsets,
   1014   1.40  jdolecek 	VDESC_NO_OFFSET,
   1015   1.40  jdolecek 	VDESC_NO_OFFSET,
   1016   1.40  jdolecek 	VDESC_NO_OFFSET,
   1017   1.40  jdolecek };
   1018   1.40  jdolecek int
   1019   1.60   thorpej VOP_KQFILTER(struct vnode *vp,
   1020   1.60   thorpej     struct knote *kn)
   1021   1.40  jdolecek {
   1022   1.72        ad 	int error;
   1023   1.72        ad 	bool mpsafe;
   1024   1.40  jdolecek 	struct vop_kqfilter_args a;
   1025  1.105   hannken 	struct mount *mp;
   1026   1.40  jdolecek 	a.a_desc = VDESC(vop_kqfilter);
   1027   1.40  jdolecek 	a.a_vp = vp;
   1028   1.40  jdolecek 	a.a_kn = kn;
   1029  1.116   hannken 	assert_vop_unlocked(vp, "vop_kqfilter: vp");
   1030  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_YES);
   1031  1.105   hannken 	if (error)
   1032  1.105   hannken 		return error;
   1033   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_kqfilter), &a));
   1034  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_YES);
   1035   1.72        ad 	return error;
   1036   1.40  jdolecek }
   1037   1.40  jdolecek 
   1038   1.31  jdolecek const int vop_revoke_vp_offsets[] = {
   1039   1.10      fvdl 	VOPARG_OFFSETOF(struct vop_revoke_args,a_vp),
   1040   1.10      fvdl 	VDESC_NO_OFFSET
   1041   1.10      fvdl };
   1042   1.33  jdolecek const struct vnodeop_desc vop_revoke_desc = {
   1043   1.67     pooka 	VOP_REVOKE_DESCOFFSET,
   1044   1.10      fvdl 	"vop_revoke",
   1045   1.10      fvdl 	0,
   1046   1.10      fvdl 	vop_revoke_vp_offsets,
   1047   1.10      fvdl 	VDESC_NO_OFFSET,
   1048   1.10      fvdl 	VDESC_NO_OFFSET,
   1049   1.10      fvdl 	VDESC_NO_OFFSET,
   1050   1.10      fvdl };
   1051   1.23   thorpej int
   1052   1.60   thorpej VOP_REVOKE(struct vnode *vp,
   1053   1.60   thorpej     int flags)
   1054   1.23   thorpej {
   1055   1.72        ad 	int error;
   1056   1.72        ad 	bool mpsafe;
   1057   1.23   thorpej 	struct vop_revoke_args a;
   1058  1.105   hannken 	struct mount *mp;
   1059   1.23   thorpej 	a.a_desc = VDESC(vop_revoke);
   1060   1.23   thorpej 	a.a_vp = vp;
   1061   1.23   thorpej 	a.a_flags = flags;
   1062  1.116   hannken 	assert_vop_unlocked(vp, "vop_revoke: vp");
   1063  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1064  1.105   hannken 	if (error)
   1065  1.105   hannken 		return error;
   1066   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_revoke), &a));
   1067  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1068   1.72        ad 	return error;
   1069   1.23   thorpej }
   1070   1.10      fvdl 
   1071   1.31  jdolecek const int vop_mmap_vp_offsets[] = {
   1072    1.1       cgd 	VOPARG_OFFSETOF(struct vop_mmap_args,a_vp),
   1073    1.1       cgd 	VDESC_NO_OFFSET
   1074    1.1       cgd };
   1075   1.33  jdolecek const struct vnodeop_desc vop_mmap_desc = {
   1076   1.67     pooka 	VOP_MMAP_DESCOFFSET,
   1077    1.1       cgd 	"vop_mmap",
   1078    1.1       cgd 	0,
   1079    1.1       cgd 	vop_mmap_vp_offsets,
   1080    1.1       cgd 	VDESC_NO_OFFSET,
   1081    1.1       cgd 	VOPARG_OFFSETOF(struct vop_mmap_args, a_cred),
   1082    1.1       cgd 	VDESC_NO_OFFSET,
   1083    1.1       cgd };
   1084   1.23   thorpej int
   1085   1.60   thorpej VOP_MMAP(struct vnode *vp,
   1086   1.70     pooka     vm_prot_t prot,
   1087   1.73     pooka     kauth_cred_t cred)
   1088   1.23   thorpej {
   1089   1.72        ad 	int error;
   1090   1.72        ad 	bool mpsafe;
   1091   1.23   thorpej 	struct vop_mmap_args a;
   1092  1.105   hannken 	struct mount *mp;
   1093   1.23   thorpej 	a.a_desc = VDESC(vop_mmap);
   1094   1.23   thorpej 	a.a_vp = vp;
   1095   1.70     pooka 	a.a_prot = prot;
   1096   1.23   thorpej 	a.a_cred = cred;
   1097  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_YES);
   1098  1.105   hannken 	if (error)
   1099  1.105   hannken 		return error;
   1100   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_mmap), &a));
   1101  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_YES);
   1102   1.72        ad 	return error;
   1103   1.23   thorpej }
   1104    1.1       cgd 
   1105   1.31  jdolecek const int vop_fsync_vp_offsets[] = {
   1106    1.1       cgd 	VOPARG_OFFSETOF(struct vop_fsync_args,a_vp),
   1107    1.1       cgd 	VDESC_NO_OFFSET
   1108    1.1       cgd };
   1109   1.33  jdolecek const struct vnodeop_desc vop_fsync_desc = {
   1110   1.67     pooka 	VOP_FSYNC_DESCOFFSET,
   1111    1.1       cgd 	"vop_fsync",
   1112    1.1       cgd 	0,
   1113    1.1       cgd 	vop_fsync_vp_offsets,
   1114    1.1       cgd 	VDESC_NO_OFFSET,
   1115    1.1       cgd 	VOPARG_OFFSETOF(struct vop_fsync_args, a_cred),
   1116    1.1       cgd 	VDESC_NO_OFFSET,
   1117    1.1       cgd };
   1118   1.23   thorpej int
   1119   1.60   thorpej VOP_FSYNC(struct vnode *vp,
   1120   1.65      elad     kauth_cred_t cred,
   1121   1.60   thorpej     int flags,
   1122   1.60   thorpej     off_t offlo,
   1123   1.73     pooka     off_t offhi)
   1124   1.23   thorpej {
   1125   1.72        ad 	int error;
   1126   1.72        ad 	bool mpsafe;
   1127   1.23   thorpej 	struct vop_fsync_args a;
   1128  1.105   hannken 	struct mount *mp;
   1129   1.23   thorpej 	a.a_desc = VDESC(vop_fsync);
   1130   1.23   thorpej 	a.a_vp = vp;
   1131   1.23   thorpej 	a.a_cred = cred;
   1132   1.23   thorpej 	a.a_flags = flags;
   1133   1.25      fvdl 	a.a_offlo = offlo;
   1134   1.25      fvdl 	a.a_offhi = offhi;
   1135  1.116   hannken 	assert_vop_locked(vp, "vop_fsync: vp");
   1136  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1137  1.105   hannken 	if (error)
   1138  1.105   hannken 		return error;
   1139   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_fsync), &a));
   1140  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1141   1.72        ad 	return error;
   1142   1.23   thorpej }
   1143    1.1       cgd 
   1144   1.31  jdolecek const int vop_seek_vp_offsets[] = {
   1145    1.1       cgd 	VOPARG_OFFSETOF(struct vop_seek_args,a_vp),
   1146    1.1       cgd 	VDESC_NO_OFFSET
   1147    1.1       cgd };
   1148   1.33  jdolecek const struct vnodeop_desc vop_seek_desc = {
   1149   1.67     pooka 	VOP_SEEK_DESCOFFSET,
   1150    1.1       cgd 	"vop_seek",
   1151    1.1       cgd 	0,
   1152    1.1       cgd 	vop_seek_vp_offsets,
   1153    1.1       cgd 	VDESC_NO_OFFSET,
   1154    1.1       cgd 	VOPARG_OFFSETOF(struct vop_seek_args, a_cred),
   1155    1.1       cgd 	VDESC_NO_OFFSET,
   1156    1.1       cgd };
   1157   1.23   thorpej int
   1158   1.60   thorpej VOP_SEEK(struct vnode *vp,
   1159   1.60   thorpej     off_t oldoff,
   1160   1.60   thorpej     off_t newoff,
   1161   1.65      elad     kauth_cred_t cred)
   1162   1.23   thorpej {
   1163   1.72        ad 	int error;
   1164   1.72        ad 	bool mpsafe;
   1165   1.23   thorpej 	struct vop_seek_args a;
   1166  1.105   hannken 	struct mount *mp;
   1167   1.23   thorpej 	a.a_desc = VDESC(vop_seek);
   1168   1.23   thorpej 	a.a_vp = vp;
   1169   1.23   thorpej 	a.a_oldoff = oldoff;
   1170   1.23   thorpej 	a.a_newoff = newoff;
   1171   1.23   thorpej 	a.a_cred = cred;
   1172  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_YES);
   1173  1.105   hannken 	if (error)
   1174  1.105   hannken 		return error;
   1175   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_seek), &a));
   1176  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_YES);
   1177   1.72        ad 	return error;
   1178   1.23   thorpej }
   1179    1.1       cgd 
   1180   1.31  jdolecek const int vop_remove_vp_offsets[] = {
   1181  1.115   thorpej 	VOPARG_OFFSETOF(struct vop_remove_v3_args,a_dvp),
   1182  1.115   thorpej 	VOPARG_OFFSETOF(struct vop_remove_v3_args,a_vp),
   1183    1.1       cgd 	VDESC_NO_OFFSET
   1184    1.1       cgd };
   1185   1.33  jdolecek const struct vnodeop_desc vop_remove_desc = {
   1186   1.67     pooka 	VOP_REMOVE_DESCOFFSET,
   1187    1.1       cgd 	"vop_remove",
   1188  1.103  riastrad 	0 | VDESC_VP1_WILLPUT,
   1189    1.1       cgd 	vop_remove_vp_offsets,
   1190    1.1       cgd 	VDESC_NO_OFFSET,
   1191    1.1       cgd 	VDESC_NO_OFFSET,
   1192  1.115   thorpej 	VOPARG_OFFSETOF(struct vop_remove_v3_args, a_cnp),
   1193    1.1       cgd };
   1194   1.23   thorpej int
   1195   1.60   thorpej VOP_REMOVE(struct vnode *dvp,
   1196   1.60   thorpej     struct vnode *vp,
   1197   1.60   thorpej     struct componentname *cnp)
   1198   1.23   thorpej {
   1199   1.72        ad 	int error;
   1200   1.72        ad 	bool mpsafe;
   1201  1.115   thorpej 	struct vop_remove_v3_args a;
   1202  1.105   hannken 	struct mount *mp;
   1203   1.23   thorpej 	a.a_desc = VDESC(vop_remove);
   1204   1.23   thorpej 	a.a_dvp = dvp;
   1205   1.81     pooka 	a.a_vp = vp;
   1206   1.23   thorpej 	a.a_cnp = cnp;
   1207  1.116   hannken 	assert_vop_elocked(dvp, "vop_remove: dvp");
   1208  1.116   hannken 	assert_vop_locked(vp, "vop_remove: vp");
   1209  1.115   thorpej 	vop_remove_pre(&a);
   1210  1.105   hannken 	error = vop_pre(dvp, &mp, &mpsafe, FST_NO);
   1211  1.105   hannken 	if (error)
   1212  1.105   hannken 		return error;
   1213   1.72        ad 	error = (VCALL(dvp, VOFFSET(vop_remove), &a));
   1214  1.105   hannken 	vop_post(dvp, mp, mpsafe, FST_NO);
   1215  1.115   thorpej 	vop_remove_post(&a, error);
   1216   1.72        ad 	return error;
   1217   1.23   thorpej }
   1218    1.1       cgd 
   1219   1.31  jdolecek const int vop_link_vp_offsets[] = {
   1220   1.94  riastrad 	VOPARG_OFFSETOF(struct vop_link_v2_args,a_dvp),
   1221   1.94  riastrad 	VOPARG_OFFSETOF(struct vop_link_v2_args,a_vp),
   1222    1.1       cgd 	VDESC_NO_OFFSET
   1223    1.1       cgd };
   1224   1.33  jdolecek const struct vnodeop_desc vop_link_desc = {
   1225   1.67     pooka 	VOP_LINK_DESCOFFSET,
   1226    1.1       cgd 	"vop_link",
   1227   1.94  riastrad 	0,
   1228    1.1       cgd 	vop_link_vp_offsets,
   1229    1.1       cgd 	VDESC_NO_OFFSET,
   1230    1.1       cgd 	VDESC_NO_OFFSET,
   1231   1.94  riastrad 	VOPARG_OFFSETOF(struct vop_link_v2_args, a_cnp),
   1232    1.1       cgd };
   1233   1.23   thorpej int
   1234   1.60   thorpej VOP_LINK(struct vnode *dvp,
   1235   1.60   thorpej     struct vnode *vp,
   1236   1.60   thorpej     struct componentname *cnp)
   1237   1.23   thorpej {
   1238   1.72        ad 	int error;
   1239   1.72        ad 	bool mpsafe;
   1240   1.94  riastrad 	struct vop_link_v2_args a;
   1241  1.105   hannken 	struct mount *mp;
   1242   1.23   thorpej 	a.a_desc = VDESC(vop_link);
   1243   1.23   thorpej 	a.a_dvp = dvp;
   1244   1.81     pooka 	a.a_vp = vp;
   1245   1.23   thorpej 	a.a_cnp = cnp;
   1246  1.116   hannken 	assert_vop_elocked(dvp, "vop_link: dvp");
   1247  1.116   hannken 	assert_vop_unlocked(vp, "vop_link: vp");
   1248  1.105   hannken 	error = vop_pre(dvp, &mp, &mpsafe, FST_NO);
   1249  1.105   hannken 	if (error)
   1250  1.105   hannken 		return error;
   1251   1.72        ad 	error = (VCALL(dvp, VOFFSET(vop_link), &a));
   1252  1.105   hannken 	vop_post(dvp, mp, mpsafe, FST_NO);
   1253  1.115   thorpej 	vop_link_post(&a, error);
   1254   1.72        ad 	return error;
   1255   1.23   thorpej }
   1256    1.1       cgd 
   1257   1.31  jdolecek const int vop_rename_vp_offsets[] = {
   1258    1.1       cgd 	VOPARG_OFFSETOF(struct vop_rename_args,a_fdvp),
   1259    1.1       cgd 	VOPARG_OFFSETOF(struct vop_rename_args,a_fvp),
   1260    1.1       cgd 	VOPARG_OFFSETOF(struct vop_rename_args,a_tdvp),
   1261    1.1       cgd 	VOPARG_OFFSETOF(struct vop_rename_args,a_tvp),
   1262    1.1       cgd 	VDESC_NO_OFFSET
   1263    1.1       cgd };
   1264   1.33  jdolecek const struct vnodeop_desc vop_rename_desc = {
   1265   1.67     pooka 	VOP_RENAME_DESCOFFSET,
   1266    1.1       cgd 	"vop_rename",
   1267   1.42  jdolecek 	0 | VDESC_VP0_WILLRELE | VDESC_VP1_WILLRELE | VDESC_VP2_WILLPUT | VDESC_VP3_WILLPUT,
   1268    1.1       cgd 	vop_rename_vp_offsets,
   1269    1.1       cgd 	VDESC_NO_OFFSET,
   1270    1.1       cgd 	VDESC_NO_OFFSET,
   1271    1.1       cgd 	VOPARG_OFFSETOF(struct vop_rename_args, a_fcnp),
   1272    1.1       cgd };
   1273   1.23   thorpej int
   1274   1.60   thorpej VOP_RENAME(struct vnode *fdvp,
   1275   1.60   thorpej     struct vnode *fvp,
   1276   1.60   thorpej     struct componentname *fcnp,
   1277   1.60   thorpej     struct vnode *tdvp,
   1278   1.60   thorpej     struct vnode *tvp,
   1279   1.60   thorpej     struct componentname *tcnp)
   1280   1.23   thorpej {
   1281   1.72        ad 	int error;
   1282   1.72        ad 	bool mpsafe;
   1283   1.23   thorpej 	struct vop_rename_args a;
   1284  1.105   hannken 	struct mount *mp;
   1285   1.23   thorpej 	a.a_desc = VDESC(vop_rename);
   1286   1.23   thorpej 	a.a_fdvp = fdvp;
   1287   1.23   thorpej 	a.a_fvp = fvp;
   1288   1.23   thorpej 	a.a_fcnp = fcnp;
   1289   1.23   thorpej 	a.a_tdvp = tdvp;
   1290   1.23   thorpej 	a.a_tvp = tvp;
   1291   1.23   thorpej 	a.a_tcnp = tcnp;
   1292  1.116   hannken 	assert_vop_locked(tdvp, "vop_rename: tdvp");
   1293  1.105   hannken 	error = vop_pre(fdvp, &mp, &mpsafe, FST_YES);
   1294  1.105   hannken 	if (error)
   1295  1.105   hannken 		return error;
   1296   1.72        ad 	error = (VCALL(fdvp, VOFFSET(vop_rename), &a));
   1297  1.105   hannken 	vop_post(fdvp, mp, mpsafe, FST_YES);
   1298   1.72        ad 	return error;
   1299   1.23   thorpej }
   1300    1.1       cgd 
   1301   1.31  jdolecek const int vop_mkdir_vp_offsets[] = {
   1302   1.91   hannken 	VOPARG_OFFSETOF(struct vop_mkdir_v3_args,a_dvp),
   1303    1.1       cgd 	VDESC_NO_OFFSET
   1304    1.1       cgd };
   1305   1.33  jdolecek const struct vnodeop_desc vop_mkdir_desc = {
   1306   1.67     pooka 	VOP_MKDIR_DESCOFFSET,
   1307    1.1       cgd 	"vop_mkdir",
   1308   1.90   hannken 	0,
   1309    1.1       cgd 	vop_mkdir_vp_offsets,
   1310   1.91   hannken 	VOPARG_OFFSETOF(struct vop_mkdir_v3_args, a_vpp),
   1311    1.1       cgd 	VDESC_NO_OFFSET,
   1312   1.91   hannken 	VOPARG_OFFSETOF(struct vop_mkdir_v3_args, a_cnp),
   1313    1.1       cgd };
   1314   1.23   thorpej int
   1315   1.60   thorpej VOP_MKDIR(struct vnode *dvp,
   1316   1.60   thorpej     struct vnode **vpp,
   1317   1.60   thorpej     struct componentname *cnp,
   1318   1.60   thorpej     struct vattr *vap)
   1319   1.23   thorpej {
   1320   1.72        ad 	int error;
   1321   1.72        ad 	bool mpsafe;
   1322   1.91   hannken 	struct vop_mkdir_v3_args a;
   1323  1.105   hannken 	struct mount *mp;
   1324   1.23   thorpej 	a.a_desc = VDESC(vop_mkdir);
   1325   1.23   thorpej 	a.a_dvp = dvp;
   1326   1.23   thorpej 	a.a_vpp = vpp;
   1327   1.23   thorpej 	a.a_cnp = cnp;
   1328   1.23   thorpej 	a.a_vap = vap;
   1329  1.116   hannken 	assert_vop_elocked(dvp, "vop_mkdir: dvp");
   1330  1.105   hannken 	error = vop_pre(dvp, &mp, &mpsafe, FST_NO);
   1331  1.105   hannken 	if (error)
   1332  1.105   hannken 		return error;
   1333   1.72        ad 	error = (VCALL(dvp, VOFFSET(vop_mkdir), &a));
   1334  1.105   hannken 	vop_post(dvp, mp, mpsafe, FST_NO);
   1335  1.115   thorpej 	vop_mkdir_post(&a, error);
   1336   1.69     pooka #ifdef DIAGNOSTIC
   1337   1.72        ad 	if (error == 0)
   1338   1.69     pooka 		KASSERT((*vpp)->v_size != VSIZENOTSET
   1339   1.69     pooka 		    && (*vpp)->v_writesize != VSIZENOTSET);
   1340   1.69     pooka #endif /* DIAGNOSTIC */
   1341   1.72        ad 	return error;
   1342   1.23   thorpej }
   1343    1.1       cgd 
   1344   1.31  jdolecek const int vop_rmdir_vp_offsets[] = {
   1345  1.103  riastrad 	VOPARG_OFFSETOF(struct vop_rmdir_v2_args,a_dvp),
   1346  1.103  riastrad 	VOPARG_OFFSETOF(struct vop_rmdir_v2_args,a_vp),
   1347    1.1       cgd 	VDESC_NO_OFFSET
   1348    1.1       cgd };
   1349   1.33  jdolecek const struct vnodeop_desc vop_rmdir_desc = {
   1350   1.67     pooka 	VOP_RMDIR_DESCOFFSET,
   1351    1.1       cgd 	"vop_rmdir",
   1352  1.103  riastrad 	0 | VDESC_VP1_WILLPUT,
   1353    1.1       cgd 	vop_rmdir_vp_offsets,
   1354    1.1       cgd 	VDESC_NO_OFFSET,
   1355    1.1       cgd 	VDESC_NO_OFFSET,
   1356  1.103  riastrad 	VOPARG_OFFSETOF(struct vop_rmdir_v2_args, a_cnp),
   1357    1.1       cgd };
   1358   1.23   thorpej int
   1359   1.60   thorpej VOP_RMDIR(struct vnode *dvp,
   1360   1.60   thorpej     struct vnode *vp,
   1361   1.60   thorpej     struct componentname *cnp)
   1362   1.23   thorpej {
   1363   1.72        ad 	int error;
   1364   1.72        ad 	bool mpsafe;
   1365  1.103  riastrad 	struct vop_rmdir_v2_args a;
   1366  1.105   hannken 	struct mount *mp;
   1367   1.23   thorpej 	a.a_desc = VDESC(vop_rmdir);
   1368   1.23   thorpej 	a.a_dvp = dvp;
   1369   1.81     pooka 	a.a_vp = vp;
   1370   1.23   thorpej 	a.a_cnp = cnp;
   1371  1.116   hannken 	assert_vop_elocked(dvp, "vop_rmdir: dvp");
   1372  1.116   hannken 	assert_vop_elocked(vp, "vop_rmdir: vp");
   1373  1.115   thorpej 	vop_rmdir_pre(&a);
   1374  1.105   hannken 	error = vop_pre(dvp, &mp, &mpsafe, FST_NO);
   1375  1.105   hannken 	if (error)
   1376  1.105   hannken 		return error;
   1377   1.72        ad 	error = (VCALL(dvp, VOFFSET(vop_rmdir), &a));
   1378  1.105   hannken 	vop_post(dvp, mp, mpsafe, FST_NO);
   1379  1.115   thorpej 	vop_rmdir_post(&a, error);
   1380   1.72        ad 	return error;
   1381   1.23   thorpej }
   1382    1.1       cgd 
   1383   1.31  jdolecek const int vop_symlink_vp_offsets[] = {
   1384   1.91   hannken 	VOPARG_OFFSETOF(struct vop_symlink_v3_args,a_dvp),
   1385    1.1       cgd 	VDESC_NO_OFFSET
   1386    1.1       cgd };
   1387   1.33  jdolecek const struct vnodeop_desc vop_symlink_desc = {
   1388   1.67     pooka 	VOP_SYMLINK_DESCOFFSET,
   1389    1.1       cgd 	"vop_symlink",
   1390   1.90   hannken 	0,
   1391    1.1       cgd 	vop_symlink_vp_offsets,
   1392   1.91   hannken 	VOPARG_OFFSETOF(struct vop_symlink_v3_args, a_vpp),
   1393    1.1       cgd 	VDESC_NO_OFFSET,
   1394   1.91   hannken 	VOPARG_OFFSETOF(struct vop_symlink_v3_args, a_cnp),
   1395    1.1       cgd };
   1396   1.23   thorpej int
   1397   1.60   thorpej VOP_SYMLINK(struct vnode *dvp,
   1398   1.60   thorpej     struct vnode **vpp,
   1399   1.60   thorpej     struct componentname *cnp,
   1400   1.60   thorpej     struct vattr *vap,
   1401   1.60   thorpej     char *target)
   1402   1.23   thorpej {
   1403   1.72        ad 	int error;
   1404   1.72        ad 	bool mpsafe;
   1405   1.91   hannken 	struct vop_symlink_v3_args a;
   1406  1.105   hannken 	struct mount *mp;
   1407   1.23   thorpej 	a.a_desc = VDESC(vop_symlink);
   1408   1.23   thorpej 	a.a_dvp = dvp;
   1409   1.23   thorpej 	a.a_vpp = vpp;
   1410   1.23   thorpej 	a.a_cnp = cnp;
   1411   1.23   thorpej 	a.a_vap = vap;
   1412   1.23   thorpej 	a.a_target = target;
   1413  1.116   hannken 	assert_vop_elocked(dvp, "vop_symlink: dvp");
   1414  1.105   hannken 	error = vop_pre(dvp, &mp, &mpsafe, FST_NO);
   1415  1.105   hannken 	if (error)
   1416  1.105   hannken 		return error;
   1417   1.72        ad 	error = (VCALL(dvp, VOFFSET(vop_symlink), &a));
   1418  1.105   hannken 	vop_post(dvp, mp, mpsafe, FST_NO);
   1419  1.115   thorpej 	vop_symlink_post(&a, error);
   1420   1.69     pooka #ifdef DIAGNOSTIC
   1421   1.72        ad 	if (error == 0)
   1422   1.69     pooka 		KASSERT((*vpp)->v_size != VSIZENOTSET
   1423   1.69     pooka 		    && (*vpp)->v_writesize != VSIZENOTSET);
   1424   1.69     pooka #endif /* DIAGNOSTIC */
   1425   1.72        ad 	return error;
   1426   1.23   thorpej }
   1427    1.1       cgd 
   1428   1.31  jdolecek const int vop_readdir_vp_offsets[] = {
   1429    1.1       cgd 	VOPARG_OFFSETOF(struct vop_readdir_args,a_vp),
   1430    1.1       cgd 	VDESC_NO_OFFSET
   1431    1.1       cgd };
   1432   1.33  jdolecek const struct vnodeop_desc vop_readdir_desc = {
   1433   1.67     pooka 	VOP_READDIR_DESCOFFSET,
   1434    1.1       cgd 	"vop_readdir",
   1435    1.1       cgd 	0,
   1436    1.1       cgd 	vop_readdir_vp_offsets,
   1437    1.1       cgd 	VDESC_NO_OFFSET,
   1438    1.1       cgd 	VOPARG_OFFSETOF(struct vop_readdir_args, a_cred),
   1439    1.1       cgd 	VDESC_NO_OFFSET,
   1440    1.1       cgd };
   1441   1.23   thorpej int
   1442   1.60   thorpej VOP_READDIR(struct vnode *vp,
   1443   1.60   thorpej     struct uio *uio,
   1444   1.65      elad     kauth_cred_t cred,
   1445   1.60   thorpej     int *eofflag,
   1446   1.60   thorpej     off_t **cookies,
   1447   1.60   thorpej     int *ncookies)
   1448   1.23   thorpej {
   1449   1.72        ad 	int error;
   1450   1.72        ad 	bool mpsafe;
   1451   1.23   thorpej 	struct vop_readdir_args a;
   1452  1.105   hannken 	struct mount *mp;
   1453   1.23   thorpej 	a.a_desc = VDESC(vop_readdir);
   1454   1.23   thorpej 	a.a_vp = vp;
   1455   1.23   thorpej 	a.a_uio = uio;
   1456   1.23   thorpej 	a.a_cred = cred;
   1457   1.23   thorpej 	a.a_eofflag = eofflag;
   1458   1.23   thorpej 	a.a_cookies = cookies;
   1459   1.23   thorpej 	a.a_ncookies = ncookies;
   1460  1.116   hannken 	assert_vop_locked(vp, "vop_readdir: vp");
   1461  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1462  1.105   hannken 	if (error)
   1463  1.105   hannken 		return error;
   1464   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_readdir), &a));
   1465  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1466   1.72        ad 	return error;
   1467   1.23   thorpej }
   1468    1.1       cgd 
   1469   1.31  jdolecek const int vop_readlink_vp_offsets[] = {
   1470    1.1       cgd 	VOPARG_OFFSETOF(struct vop_readlink_args,a_vp),
   1471    1.1       cgd 	VDESC_NO_OFFSET
   1472    1.1       cgd };
   1473   1.33  jdolecek const struct vnodeop_desc vop_readlink_desc = {
   1474   1.67     pooka 	VOP_READLINK_DESCOFFSET,
   1475    1.1       cgd 	"vop_readlink",
   1476    1.1       cgd 	0,
   1477    1.1       cgd 	vop_readlink_vp_offsets,
   1478    1.1       cgd 	VDESC_NO_OFFSET,
   1479    1.1       cgd 	VOPARG_OFFSETOF(struct vop_readlink_args, a_cred),
   1480    1.1       cgd 	VDESC_NO_OFFSET,
   1481    1.1       cgd };
   1482   1.23   thorpej int
   1483   1.60   thorpej VOP_READLINK(struct vnode *vp,
   1484   1.60   thorpej     struct uio *uio,
   1485   1.65      elad     kauth_cred_t cred)
   1486   1.23   thorpej {
   1487   1.72        ad 	int error;
   1488   1.72        ad 	bool mpsafe;
   1489   1.23   thorpej 	struct vop_readlink_args a;
   1490  1.105   hannken 	struct mount *mp;
   1491   1.23   thorpej 	a.a_desc = VDESC(vop_readlink);
   1492   1.23   thorpej 	a.a_vp = vp;
   1493   1.23   thorpej 	a.a_uio = uio;
   1494   1.23   thorpej 	a.a_cred = cred;
   1495  1.116   hannken 	assert_vop_locked(vp, "vop_readlink: vp");
   1496  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1497  1.105   hannken 	if (error)
   1498  1.105   hannken 		return error;
   1499   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_readlink), &a));
   1500  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1501   1.72        ad 	return error;
   1502   1.23   thorpej }
   1503    1.1       cgd 
   1504   1.31  jdolecek const int vop_abortop_vp_offsets[] = {
   1505    1.1       cgd 	VOPARG_OFFSETOF(struct vop_abortop_args,a_dvp),
   1506    1.1       cgd 	VDESC_NO_OFFSET
   1507    1.1       cgd };
   1508   1.33  jdolecek const struct vnodeop_desc vop_abortop_desc = {
   1509   1.67     pooka 	VOP_ABORTOP_DESCOFFSET,
   1510    1.1       cgd 	"vop_abortop",
   1511    1.1       cgd 	0,
   1512    1.1       cgd 	vop_abortop_vp_offsets,
   1513    1.1       cgd 	VDESC_NO_OFFSET,
   1514    1.1       cgd 	VDESC_NO_OFFSET,
   1515    1.1       cgd 	VOPARG_OFFSETOF(struct vop_abortop_args, a_cnp),
   1516    1.1       cgd };
   1517   1.23   thorpej int
   1518   1.60   thorpej VOP_ABORTOP(struct vnode *dvp,
   1519   1.60   thorpej     struct componentname *cnp)
   1520   1.23   thorpej {
   1521   1.72        ad 	int error;
   1522   1.72        ad 	bool mpsafe;
   1523   1.23   thorpej 	struct vop_abortop_args a;
   1524  1.105   hannken 	struct mount *mp;
   1525   1.23   thorpej 	a.a_desc = VDESC(vop_abortop);
   1526   1.23   thorpej 	a.a_dvp = dvp;
   1527   1.23   thorpej 	a.a_cnp = cnp;
   1528  1.105   hannken 	error = vop_pre(dvp, &mp, &mpsafe, FST_YES);
   1529  1.105   hannken 	if (error)
   1530  1.105   hannken 		return error;
   1531   1.72        ad 	error = (VCALL(dvp, VOFFSET(vop_abortop), &a));
   1532  1.105   hannken 	vop_post(dvp, mp, mpsafe, FST_YES);
   1533   1.72        ad 	return error;
   1534   1.23   thorpej }
   1535    1.1       cgd 
   1536   1.31  jdolecek const int vop_inactive_vp_offsets[] = {
   1537   1.98  riastrad 	VOPARG_OFFSETOF(struct vop_inactive_v2_args,a_vp),
   1538    1.1       cgd 	VDESC_NO_OFFSET
   1539    1.1       cgd };
   1540   1.33  jdolecek const struct vnodeop_desc vop_inactive_desc = {
   1541   1.67     pooka 	VOP_INACTIVE_DESCOFFSET,
   1542    1.1       cgd 	"vop_inactive",
   1543   1.98  riastrad 	0,
   1544    1.1       cgd 	vop_inactive_vp_offsets,
   1545    1.1       cgd 	VDESC_NO_OFFSET,
   1546    1.1       cgd 	VDESC_NO_OFFSET,
   1547    1.1       cgd 	VDESC_NO_OFFSET,
   1548    1.1       cgd };
   1549   1.23   thorpej int
   1550   1.75        ad VOP_INACTIVE(struct vnode *vp,
   1551   1.75        ad     bool *recycle)
   1552   1.23   thorpej {
   1553   1.72        ad 	int error;
   1554   1.72        ad 	bool mpsafe;
   1555   1.98  riastrad 	struct vop_inactive_v2_args a;
   1556  1.105   hannken 	struct mount *mp;
   1557   1.23   thorpej 	a.a_desc = VDESC(vop_inactive);
   1558   1.23   thorpej 	a.a_vp = vp;
   1559   1.75        ad 	a.a_recycle = recycle;
   1560  1.116   hannken 	assert_vop_elocked(vp, "vop_inactive: vp");
   1561  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1562  1.105   hannken 	if (error)
   1563  1.105   hannken 		return error;
   1564   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_inactive), &a));
   1565  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1566   1.72        ad 	return error;
   1567   1.23   thorpej }
   1568    1.1       cgd 
   1569   1.31  jdolecek const int vop_reclaim_vp_offsets[] = {
   1570  1.104  riastrad 	VOPARG_OFFSETOF(struct vop_reclaim_v2_args,a_vp),
   1571    1.1       cgd 	VDESC_NO_OFFSET
   1572    1.1       cgd };
   1573   1.33  jdolecek const struct vnodeop_desc vop_reclaim_desc = {
   1574   1.67     pooka 	VOP_RECLAIM_DESCOFFSET,
   1575    1.1       cgd 	"vop_reclaim",
   1576    1.1       cgd 	0,
   1577    1.1       cgd 	vop_reclaim_vp_offsets,
   1578    1.1       cgd 	VDESC_NO_OFFSET,
   1579    1.1       cgd 	VDESC_NO_OFFSET,
   1580    1.1       cgd 	VDESC_NO_OFFSET,
   1581    1.1       cgd };
   1582   1.23   thorpej int
   1583   1.73     pooka VOP_RECLAIM(struct vnode *vp)
   1584   1.23   thorpej {
   1585   1.72        ad 	int error;
   1586   1.72        ad 	bool mpsafe;
   1587  1.104  riastrad 	struct vop_reclaim_v2_args a;
   1588  1.105   hannken 	struct mount *mp;
   1589   1.23   thorpej 	a.a_desc = VDESC(vop_reclaim);
   1590   1.23   thorpej 	a.a_vp = vp;
   1591  1.116   hannken 	assert_vop_elocked(vp, "vop_reclaim: vp");
   1592  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1593  1.105   hannken 	if (error)
   1594  1.105   hannken 		return error;
   1595   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_reclaim), &a));
   1596  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1597   1.72        ad 	return error;
   1598   1.23   thorpej }
   1599    1.1       cgd 
   1600   1.31  jdolecek const int vop_lock_vp_offsets[] = {
   1601    1.1       cgd 	VOPARG_OFFSETOF(struct vop_lock_args,a_vp),
   1602    1.1       cgd 	VDESC_NO_OFFSET
   1603    1.1       cgd };
   1604   1.33  jdolecek const struct vnodeop_desc vop_lock_desc = {
   1605   1.67     pooka 	VOP_LOCK_DESCOFFSET,
   1606    1.1       cgd 	"vop_lock",
   1607    1.1       cgd 	0,
   1608    1.1       cgd 	vop_lock_vp_offsets,
   1609    1.1       cgd 	VDESC_NO_OFFSET,
   1610    1.1       cgd 	VDESC_NO_OFFSET,
   1611    1.1       cgd 	VDESC_NO_OFFSET,
   1612    1.1       cgd };
   1613   1.23   thorpej int
   1614   1.60   thorpej VOP_LOCK(struct vnode *vp,
   1615   1.60   thorpej     int flags)
   1616   1.23   thorpej {
   1617   1.72        ad 	int error;
   1618   1.72        ad 	bool mpsafe;
   1619   1.23   thorpej 	struct vop_lock_args a;
   1620  1.105   hannken 	struct mount *mp;
   1621   1.23   thorpej 	a.a_desc = VDESC(vop_lock);
   1622   1.23   thorpej 	a.a_vp = vp;
   1623   1.23   thorpej 	a.a_flags = flags;
   1624  1.110        ad 	error = vop_pre(vp, &mp, &mpsafe, (!(flags & (LK_SHARED|LK_EXCLUSIVE)) ? FST_NO : (flags & LK_NOWAIT ? FST_TRY : FST_YES)));
   1625  1.105   hannken 	if (error)
   1626  1.105   hannken 		return error;
   1627   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_lock), &a));
   1628  1.109        ad 	vop_post(vp, mp, mpsafe, (flags & (LK_UPGRADE|LK_DOWNGRADE) ? FST_NO : (error ? FST_YES : FST_NO)));
   1629   1.72        ad 	return error;
   1630   1.23   thorpej }
   1631    1.1       cgd 
   1632   1.31  jdolecek const int vop_unlock_vp_offsets[] = {
   1633    1.1       cgd 	VOPARG_OFFSETOF(struct vop_unlock_args,a_vp),
   1634    1.1       cgd 	VDESC_NO_OFFSET
   1635    1.1       cgd };
   1636   1.33  jdolecek const struct vnodeop_desc vop_unlock_desc = {
   1637   1.67     pooka 	VOP_UNLOCK_DESCOFFSET,
   1638    1.1       cgd 	"vop_unlock",
   1639    1.1       cgd 	0,
   1640    1.1       cgd 	vop_unlock_vp_offsets,
   1641    1.1       cgd 	VDESC_NO_OFFSET,
   1642    1.1       cgd 	VDESC_NO_OFFSET,
   1643    1.1       cgd 	VDESC_NO_OFFSET,
   1644    1.1       cgd };
   1645   1.23   thorpej int
   1646   1.85   hannken VOP_UNLOCK(struct vnode *vp)
   1647   1.23   thorpej {
   1648   1.72        ad 	int error;
   1649   1.72        ad 	bool mpsafe;
   1650   1.23   thorpej 	struct vop_unlock_args a;
   1651  1.105   hannken 	struct mount *mp;
   1652   1.23   thorpej 	a.a_desc = VDESC(vop_unlock);
   1653   1.23   thorpej 	a.a_vp = vp;
   1654  1.116   hannken 	assert_vop_locked(vp, "vop_unlock: vp");
   1655  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1656  1.105   hannken 	if (error)
   1657  1.105   hannken 		return error;
   1658   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_unlock), &a));
   1659  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_YES);
   1660   1.72        ad 	return error;
   1661   1.23   thorpej }
   1662    1.1       cgd 
   1663   1.31  jdolecek const int vop_bmap_vp_offsets[] = {
   1664    1.1       cgd 	VOPARG_OFFSETOF(struct vop_bmap_args,a_vp),
   1665    1.1       cgd 	VDESC_NO_OFFSET
   1666    1.1       cgd };
   1667   1.33  jdolecek const struct vnodeop_desc vop_bmap_desc = {
   1668   1.67     pooka 	VOP_BMAP_DESCOFFSET,
   1669    1.1       cgd 	"vop_bmap",
   1670    1.1       cgd 	0,
   1671    1.1       cgd 	vop_bmap_vp_offsets,
   1672    1.1       cgd 	VOPARG_OFFSETOF(struct vop_bmap_args, a_vpp),
   1673    1.1       cgd 	VDESC_NO_OFFSET,
   1674    1.1       cgd 	VDESC_NO_OFFSET,
   1675    1.1       cgd };
   1676   1.23   thorpej int
   1677   1.60   thorpej VOP_BMAP(struct vnode *vp,
   1678   1.60   thorpej     daddr_t bn,
   1679   1.60   thorpej     struct vnode **vpp,
   1680   1.60   thorpej     daddr_t *bnp,
   1681   1.60   thorpej     int *runp)
   1682   1.23   thorpej {
   1683   1.72        ad 	int error;
   1684   1.72        ad 	bool mpsafe;
   1685   1.23   thorpej 	struct vop_bmap_args a;
   1686  1.105   hannken 	struct mount *mp;
   1687   1.23   thorpej 	a.a_desc = VDESC(vop_bmap);
   1688   1.23   thorpej 	a.a_vp = vp;
   1689   1.23   thorpej 	a.a_bn = bn;
   1690   1.23   thorpej 	a.a_vpp = vpp;
   1691   1.23   thorpej 	a.a_bnp = bnp;
   1692   1.23   thorpej 	a.a_runp = runp;
   1693  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_YES);
   1694  1.105   hannken 	if (error)
   1695  1.105   hannken 		return error;
   1696   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_bmap), &a));
   1697  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_YES);
   1698   1.72        ad 	return error;
   1699   1.23   thorpej }
   1700    1.1       cgd 
   1701   1.46   hannken const int vop_strategy_vp_offsets[] = {
   1702   1.46   hannken 	VOPARG_OFFSETOF(struct vop_strategy_args,a_vp),
   1703   1.46   hannken 	VDESC_NO_OFFSET
   1704   1.46   hannken };
   1705   1.46   hannken const struct vnodeop_desc vop_strategy_desc = {
   1706   1.67     pooka 	VOP_STRATEGY_DESCOFFSET,
   1707   1.46   hannken 	"vop_strategy",
   1708   1.46   hannken 	0,
   1709   1.46   hannken 	vop_strategy_vp_offsets,
   1710   1.46   hannken 	VDESC_NO_OFFSET,
   1711   1.46   hannken 	VDESC_NO_OFFSET,
   1712   1.46   hannken 	VDESC_NO_OFFSET,
   1713   1.46   hannken };
   1714   1.46   hannken int
   1715   1.60   thorpej VOP_STRATEGY(struct vnode *vp,
   1716   1.60   thorpej     struct buf *bp)
   1717   1.46   hannken {
   1718   1.72        ad 	int error;
   1719   1.72        ad 	bool mpsafe;
   1720   1.46   hannken 	struct vop_strategy_args a;
   1721  1.105   hannken 	struct mount *mp;
   1722   1.46   hannken 	a.a_desc = VDESC(vop_strategy);
   1723   1.46   hannken 	a.a_vp = vp;
   1724   1.46   hannken 	a.a_bp = bp;
   1725  1.112   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1726  1.105   hannken 	if (error)
   1727  1.105   hannken 		return error;
   1728   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_strategy), &a));
   1729  1.112   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1730   1.72        ad 	return error;
   1731   1.46   hannken }
   1732   1.46   hannken 
   1733   1.31  jdolecek const int vop_print_vp_offsets[] = {
   1734    1.1       cgd 	VOPARG_OFFSETOF(struct vop_print_args,a_vp),
   1735    1.1       cgd 	VDESC_NO_OFFSET
   1736    1.1       cgd };
   1737   1.33  jdolecek const struct vnodeop_desc vop_print_desc = {
   1738   1.67     pooka 	VOP_PRINT_DESCOFFSET,
   1739    1.1       cgd 	"vop_print",
   1740    1.1       cgd 	0,
   1741    1.1       cgd 	vop_print_vp_offsets,
   1742    1.1       cgd 	VDESC_NO_OFFSET,
   1743    1.1       cgd 	VDESC_NO_OFFSET,
   1744    1.1       cgd 	VDESC_NO_OFFSET,
   1745    1.1       cgd };
   1746   1.23   thorpej int
   1747   1.60   thorpej VOP_PRINT(struct vnode *vp)
   1748   1.23   thorpej {
   1749   1.72        ad 	int error;
   1750   1.72        ad 	bool mpsafe;
   1751   1.23   thorpej 	struct vop_print_args a;
   1752  1.105   hannken 	struct mount *mp;
   1753   1.23   thorpej 	a.a_desc = VDESC(vop_print);
   1754   1.23   thorpej 	a.a_vp = vp;
   1755  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_YES);
   1756  1.105   hannken 	if (error)
   1757  1.105   hannken 		return error;
   1758   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_print), &a));
   1759  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_YES);
   1760   1.72        ad 	return error;
   1761   1.23   thorpej }
   1762    1.1       cgd 
   1763   1.31  jdolecek const int vop_islocked_vp_offsets[] = {
   1764    1.1       cgd 	VOPARG_OFFSETOF(struct vop_islocked_args,a_vp),
   1765    1.1       cgd 	VDESC_NO_OFFSET
   1766    1.1       cgd };
   1767   1.33  jdolecek const struct vnodeop_desc vop_islocked_desc = {
   1768   1.67     pooka 	VOP_ISLOCKED_DESCOFFSET,
   1769    1.1       cgd 	"vop_islocked",
   1770    1.1       cgd 	0,
   1771    1.1       cgd 	vop_islocked_vp_offsets,
   1772    1.1       cgd 	VDESC_NO_OFFSET,
   1773    1.1       cgd 	VDESC_NO_OFFSET,
   1774    1.1       cgd 	VDESC_NO_OFFSET,
   1775    1.1       cgd };
   1776   1.23   thorpej int
   1777   1.60   thorpej VOP_ISLOCKED(struct vnode *vp)
   1778   1.23   thorpej {
   1779   1.72        ad 	int error;
   1780   1.72        ad 	bool mpsafe;
   1781   1.23   thorpej 	struct vop_islocked_args a;
   1782  1.105   hannken 	struct mount *mp;
   1783   1.23   thorpej 	a.a_desc = VDESC(vop_islocked);
   1784   1.23   thorpej 	a.a_vp = vp;
   1785  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1786  1.105   hannken 	if (error)
   1787  1.105   hannken 		return error;
   1788   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_islocked), &a));
   1789  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1790   1.72        ad 	return error;
   1791   1.23   thorpej }
   1792    1.1       cgd 
   1793   1.31  jdolecek const int vop_pathconf_vp_offsets[] = {
   1794    1.1       cgd 	VOPARG_OFFSETOF(struct vop_pathconf_args,a_vp),
   1795    1.1       cgd 	VDESC_NO_OFFSET
   1796    1.1       cgd };
   1797   1.33  jdolecek const struct vnodeop_desc vop_pathconf_desc = {
   1798   1.67     pooka 	VOP_PATHCONF_DESCOFFSET,
   1799    1.1       cgd 	"vop_pathconf",
   1800    1.1       cgd 	0,
   1801    1.1       cgd 	vop_pathconf_vp_offsets,
   1802    1.1       cgd 	VDESC_NO_OFFSET,
   1803    1.1       cgd 	VDESC_NO_OFFSET,
   1804    1.1       cgd 	VDESC_NO_OFFSET,
   1805    1.1       cgd };
   1806   1.23   thorpej int
   1807   1.60   thorpej VOP_PATHCONF(struct vnode *vp,
   1808   1.60   thorpej     int name,
   1809   1.60   thorpej     register_t *retval)
   1810   1.23   thorpej {
   1811   1.72        ad 	int error;
   1812   1.72        ad 	bool mpsafe;
   1813   1.23   thorpej 	struct vop_pathconf_args a;
   1814  1.105   hannken 	struct mount *mp;
   1815   1.23   thorpej 	a.a_desc = VDESC(vop_pathconf);
   1816   1.23   thorpej 	a.a_vp = vp;
   1817   1.23   thorpej 	a.a_name = name;
   1818   1.23   thorpej 	a.a_retval = retval;
   1819  1.116   hannken 	assert_vop_locked(vp, "vop_pathconf: vp");
   1820  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1821  1.105   hannken 	if (error)
   1822  1.105   hannken 		return error;
   1823   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_pathconf), &a));
   1824  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1825   1.72        ad 	return error;
   1826   1.23   thorpej }
   1827    1.1       cgd 
   1828   1.31  jdolecek const int vop_advlock_vp_offsets[] = {
   1829    1.1       cgd 	VOPARG_OFFSETOF(struct vop_advlock_args,a_vp),
   1830    1.1       cgd 	VDESC_NO_OFFSET
   1831    1.1       cgd };
   1832   1.33  jdolecek const struct vnodeop_desc vop_advlock_desc = {
   1833   1.67     pooka 	VOP_ADVLOCK_DESCOFFSET,
   1834    1.1       cgd 	"vop_advlock",
   1835    1.1       cgd 	0,
   1836    1.1       cgd 	vop_advlock_vp_offsets,
   1837    1.1       cgd 	VDESC_NO_OFFSET,
   1838    1.1       cgd 	VDESC_NO_OFFSET,
   1839    1.1       cgd 	VDESC_NO_OFFSET,
   1840    1.1       cgd };
   1841   1.23   thorpej int
   1842   1.60   thorpej VOP_ADVLOCK(struct vnode *vp,
   1843   1.60   thorpej     void *id,
   1844   1.60   thorpej     int op,
   1845   1.60   thorpej     struct flock *fl,
   1846   1.60   thorpej     int flags)
   1847   1.23   thorpej {
   1848   1.72        ad 	int error;
   1849   1.72        ad 	bool mpsafe;
   1850   1.23   thorpej 	struct vop_advlock_args a;
   1851  1.105   hannken 	struct mount *mp;
   1852   1.23   thorpej 	a.a_desc = VDESC(vop_advlock);
   1853   1.23   thorpej 	a.a_vp = vp;
   1854   1.23   thorpej 	a.a_id = id;
   1855   1.23   thorpej 	a.a_op = op;
   1856   1.23   thorpej 	a.a_fl = fl;
   1857   1.23   thorpej 	a.a_flags = flags;
   1858  1.116   hannken 	assert_vop_unlocked(vp, "vop_advlock: vp");
   1859  1.107   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1860  1.105   hannken 	if (error)
   1861  1.105   hannken 		return error;
   1862   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_advlock), &a));
   1863  1.107   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1864   1.72        ad 	return error;
   1865   1.23   thorpej }
   1866    1.1       cgd 
   1867   1.31  jdolecek const int vop_whiteout_vp_offsets[] = {
   1868    1.1       cgd 	VOPARG_OFFSETOF(struct vop_whiteout_args,a_dvp),
   1869    1.1       cgd 	VDESC_NO_OFFSET
   1870    1.1       cgd };
   1871   1.33  jdolecek const struct vnodeop_desc vop_whiteout_desc = {
   1872   1.67     pooka 	VOP_WHITEOUT_DESCOFFSET,
   1873    1.1       cgd 	"vop_whiteout",
   1874    1.1       cgd 	0,
   1875    1.1       cgd 	vop_whiteout_vp_offsets,
   1876    1.1       cgd 	VDESC_NO_OFFSET,
   1877    1.1       cgd 	VDESC_NO_OFFSET,
   1878    1.1       cgd 	VOPARG_OFFSETOF(struct vop_whiteout_args, a_cnp),
   1879    1.1       cgd };
   1880   1.23   thorpej int
   1881   1.60   thorpej VOP_WHITEOUT(struct vnode *dvp,
   1882   1.60   thorpej     struct componentname *cnp,
   1883   1.60   thorpej     int flags)
   1884   1.23   thorpej {
   1885   1.72        ad 	int error;
   1886   1.72        ad 	bool mpsafe;
   1887   1.23   thorpej 	struct vop_whiteout_args a;
   1888  1.105   hannken 	struct mount *mp;
   1889   1.23   thorpej 	a.a_desc = VDESC(vop_whiteout);
   1890   1.23   thorpej 	a.a_dvp = dvp;
   1891   1.23   thorpej 	a.a_cnp = cnp;
   1892   1.23   thorpej 	a.a_flags = flags;
   1893  1.116   hannken 	assert_vop_elocked(dvp, "vop_whiteout: dvp");
   1894  1.105   hannken 	error = vop_pre(dvp, &mp, &mpsafe, FST_NO);
   1895  1.105   hannken 	if (error)
   1896  1.105   hannken 		return error;
   1897   1.72        ad 	error = (VCALL(dvp, VOFFSET(vop_whiteout), &a));
   1898  1.105   hannken 	vop_post(dvp, mp, mpsafe, FST_NO);
   1899   1.72        ad 	return error;
   1900   1.23   thorpej }
   1901    1.1       cgd 
   1902   1.31  jdolecek const int vop_getpages_vp_offsets[] = {
   1903   1.26       chs 	VOPARG_OFFSETOF(struct vop_getpages_args,a_vp),
   1904   1.26       chs 	VDESC_NO_OFFSET
   1905   1.26       chs };
   1906   1.33  jdolecek const struct vnodeop_desc vop_getpages_desc = {
   1907   1.67     pooka 	VOP_GETPAGES_DESCOFFSET,
   1908   1.26       chs 	"vop_getpages",
   1909   1.26       chs 	0,
   1910   1.26       chs 	vop_getpages_vp_offsets,
   1911   1.26       chs 	VDESC_NO_OFFSET,
   1912   1.26       chs 	VDESC_NO_OFFSET,
   1913   1.26       chs 	VDESC_NO_OFFSET,
   1914   1.26       chs };
   1915   1.26       chs int
   1916   1.60   thorpej VOP_GETPAGES(struct vnode *vp,
   1917   1.60   thorpej     voff_t offset,
   1918   1.60   thorpej     struct vm_page **m,
   1919   1.60   thorpej     int *count,
   1920   1.60   thorpej     int centeridx,
   1921   1.60   thorpej     vm_prot_t access_type,
   1922   1.60   thorpej     int advice,
   1923   1.60   thorpej     int flags)
   1924   1.26       chs {
   1925   1.72        ad 	int error;
   1926   1.72        ad 	bool mpsafe;
   1927   1.26       chs 	struct vop_getpages_args a;
   1928  1.105   hannken 	struct mount *mp;
   1929   1.26       chs 	a.a_desc = VDESC(vop_getpages);
   1930   1.26       chs 	a.a_vp = vp;
   1931   1.26       chs 	a.a_offset = offset;
   1932   1.26       chs 	a.a_m = m;
   1933   1.26       chs 	a.a_count = count;
   1934   1.26       chs 	a.a_centeridx = centeridx;
   1935   1.26       chs 	a.a_access_type = access_type;
   1936   1.26       chs 	a.a_advice = advice;
   1937   1.26       chs 	a.a_flags = flags;
   1938  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1939  1.105   hannken 	if (error)
   1940  1.105   hannken 		return error;
   1941   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_getpages), &a));
   1942  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1943   1.72        ad 	return error;
   1944   1.26       chs }
   1945   1.26       chs 
   1946   1.31  jdolecek const int vop_putpages_vp_offsets[] = {
   1947   1.26       chs 	VOPARG_OFFSETOF(struct vop_putpages_args,a_vp),
   1948   1.26       chs 	VDESC_NO_OFFSET
   1949   1.26       chs };
   1950   1.33  jdolecek const struct vnodeop_desc vop_putpages_desc = {
   1951   1.67     pooka 	VOP_PUTPAGES_DESCOFFSET,
   1952   1.26       chs 	"vop_putpages",
   1953   1.26       chs 	0,
   1954   1.26       chs 	vop_putpages_vp_offsets,
   1955   1.26       chs 	VDESC_NO_OFFSET,
   1956   1.26       chs 	VDESC_NO_OFFSET,
   1957   1.26       chs 	VDESC_NO_OFFSET,
   1958   1.26       chs };
   1959   1.26       chs int
   1960   1.60   thorpej VOP_PUTPAGES(struct vnode *vp,
   1961   1.60   thorpej     voff_t offlo,
   1962   1.60   thorpej     voff_t offhi,
   1963   1.60   thorpej     int flags)
   1964   1.26       chs {
   1965   1.72        ad 	int error;
   1966   1.72        ad 	bool mpsafe;
   1967   1.26       chs 	struct vop_putpages_args a;
   1968  1.105   hannken 	struct mount *mp;
   1969   1.26       chs 	a.a_desc = VDESC(vop_putpages);
   1970   1.26       chs 	a.a_vp = vp;
   1971   1.38       chs 	a.a_offlo = offlo;
   1972   1.38       chs 	a.a_offhi = offhi;
   1973   1.26       chs 	a.a_flags = flags;
   1974  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1975  1.105   hannken 	if (error)
   1976  1.105   hannken 		return error;
   1977   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_putpages), &a));
   1978  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1979   1.72        ad 	return error;
   1980   1.26       chs }
   1981   1.26       chs 
   1982  1.111  christos const int vop_getacl_vp_offsets[] = {
   1983  1.111  christos 	VOPARG_OFFSETOF(struct vop_getacl_args,a_vp),
   1984  1.111  christos 	VDESC_NO_OFFSET
   1985  1.111  christos };
   1986  1.111  christos const struct vnodeop_desc vop_getacl_desc = {
   1987  1.111  christos 	VOP_GETACL_DESCOFFSET,
   1988  1.111  christos 	"vop_getacl",
   1989  1.111  christos 	0,
   1990  1.111  christos 	vop_getacl_vp_offsets,
   1991  1.111  christos 	VDESC_NO_OFFSET,
   1992  1.111  christos 	VOPARG_OFFSETOF(struct vop_getacl_args, a_cred),
   1993  1.111  christos 	VDESC_NO_OFFSET,
   1994  1.111  christos };
   1995  1.111  christos int
   1996  1.111  christos VOP_GETACL(struct vnode *vp,
   1997  1.111  christos     acl_type_t type,
   1998  1.111  christos     struct acl *aclp,
   1999  1.111  christos     kauth_cred_t cred)
   2000  1.111  christos {
   2001  1.111  christos 	int error;
   2002  1.111  christos 	bool mpsafe;
   2003  1.111  christos 	struct vop_getacl_args a;
   2004  1.111  christos 	struct mount *mp;
   2005  1.111  christos 	a.a_desc = VDESC(vop_getacl);
   2006  1.111  christos 	a.a_vp = vp;
   2007  1.111  christos 	a.a_type = type;
   2008  1.111  christos 	a.a_aclp = aclp;
   2009  1.111  christos 	a.a_cred = cred;
   2010  1.111  christos 	error = vop_pre(vp, &mp, &mpsafe, FST_YES);
   2011  1.111  christos 	if (error)
   2012  1.111  christos 		return error;
   2013  1.111  christos 	error = (VCALL(vp, VOFFSET(vop_getacl), &a));
   2014  1.111  christos 	vop_post(vp, mp, mpsafe, FST_YES);
   2015  1.111  christos 	return error;
   2016  1.111  christos }
   2017  1.111  christos 
   2018  1.111  christos const int vop_setacl_vp_offsets[] = {
   2019  1.111  christos 	VOPARG_OFFSETOF(struct vop_setacl_args,a_vp),
   2020  1.111  christos 	VDESC_NO_OFFSET
   2021  1.111  christos };
   2022  1.111  christos const struct vnodeop_desc vop_setacl_desc = {
   2023  1.111  christos 	VOP_SETACL_DESCOFFSET,
   2024  1.111  christos 	"vop_setacl",
   2025  1.111  christos 	0,
   2026  1.111  christos 	vop_setacl_vp_offsets,
   2027  1.111  christos 	VDESC_NO_OFFSET,
   2028  1.111  christos 	VOPARG_OFFSETOF(struct vop_setacl_args, a_cred),
   2029  1.111  christos 	VDESC_NO_OFFSET,
   2030  1.111  christos };
   2031  1.111  christos int
   2032  1.111  christos VOP_SETACL(struct vnode *vp,
   2033  1.111  christos     acl_type_t type,
   2034  1.111  christos     struct acl *aclp,
   2035  1.111  christos     kauth_cred_t cred)
   2036  1.111  christos {
   2037  1.111  christos 	int error;
   2038  1.111  christos 	bool mpsafe;
   2039  1.111  christos 	struct vop_setacl_args a;
   2040  1.111  christos 	struct mount *mp;
   2041  1.111  christos 	a.a_desc = VDESC(vop_setacl);
   2042  1.111  christos 	a.a_vp = vp;
   2043  1.111  christos 	a.a_type = type;
   2044  1.111  christos 	a.a_aclp = aclp;
   2045  1.111  christos 	a.a_cred = cred;
   2046  1.116   hannken 	assert_vop_elocked(vp, "vop_setacl: vp");
   2047  1.116   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   2048  1.111  christos 	if (error)
   2049  1.111  christos 		return error;
   2050  1.111  christos 	error = (VCALL(vp, VOFFSET(vop_setacl), &a));
   2051  1.116   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   2052  1.115   thorpej 	vop_setacl_post(&a, error);
   2053  1.111  christos 	return error;
   2054  1.111  christos }
   2055  1.111  christos 
   2056  1.111  christos const int vop_aclcheck_vp_offsets[] = {
   2057  1.111  christos 	VOPARG_OFFSETOF(struct vop_aclcheck_args,a_vp),
   2058  1.111  christos 	VDESC_NO_OFFSET
   2059  1.111  christos };
   2060  1.111  christos const struct vnodeop_desc vop_aclcheck_desc = {
   2061  1.111  christos 	VOP_ACLCHECK_DESCOFFSET,
   2062  1.111  christos 	"vop_aclcheck",
   2063  1.111  christos 	0,
   2064  1.111  christos 	vop_aclcheck_vp_offsets,
   2065  1.111  christos 	VDESC_NO_OFFSET,
   2066  1.111  christos 	VOPARG_OFFSETOF(struct vop_aclcheck_args, a_cred),
   2067  1.111  christos 	VDESC_NO_OFFSET,
   2068  1.111  christos };
   2069  1.111  christos int
   2070  1.111  christos VOP_ACLCHECK(struct vnode *vp,
   2071  1.111  christos     acl_type_t type,
   2072  1.111  christos     struct acl *aclp,
   2073  1.111  christos     kauth_cred_t cred)
   2074  1.111  christos {
   2075  1.111  christos 	int error;
   2076  1.111  christos 	bool mpsafe;
   2077  1.111  christos 	struct vop_aclcheck_args a;
   2078  1.111  christos 	struct mount *mp;
   2079  1.111  christos 	a.a_desc = VDESC(vop_aclcheck);
   2080  1.111  christos 	a.a_vp = vp;
   2081  1.111  christos 	a.a_type = type;
   2082  1.111  christos 	a.a_aclp = aclp;
   2083  1.111  christos 	a.a_cred = cred;
   2084  1.111  christos 	error = vop_pre(vp, &mp, &mpsafe, FST_YES);
   2085  1.111  christos 	if (error)
   2086  1.111  christos 		return error;
   2087  1.111  christos 	error = (VCALL(vp, VOFFSET(vop_aclcheck), &a));
   2088  1.111  christos 	vop_post(vp, mp, mpsafe, FST_YES);
   2089  1.111  christos 	return error;
   2090  1.111  christos }
   2091  1.111  christos 
   2092   1.51   thorpej const int vop_closeextattr_vp_offsets[] = {
   2093   1.51   thorpej 	VOPARG_OFFSETOF(struct vop_closeextattr_args,a_vp),
   2094   1.51   thorpej 	VDESC_NO_OFFSET
   2095   1.51   thorpej };
   2096   1.51   thorpej const struct vnodeop_desc vop_closeextattr_desc = {
   2097   1.67     pooka 	VOP_CLOSEEXTATTR_DESCOFFSET,
   2098   1.51   thorpej 	"vop_closeextattr",
   2099   1.51   thorpej 	0,
   2100   1.51   thorpej 	vop_closeextattr_vp_offsets,
   2101   1.51   thorpej 	VDESC_NO_OFFSET,
   2102   1.51   thorpej 	VOPARG_OFFSETOF(struct vop_closeextattr_args, a_cred),
   2103   1.51   thorpej 	VDESC_NO_OFFSET,
   2104   1.51   thorpej };
   2105   1.51   thorpej int
   2106   1.60   thorpej VOP_CLOSEEXTATTR(struct vnode *vp,
   2107   1.60   thorpej     int commit,
   2108   1.73     pooka     kauth_cred_t cred)
   2109   1.51   thorpej {
   2110   1.72        ad 	int error;
   2111   1.72        ad 	bool mpsafe;
   2112   1.51   thorpej 	struct vop_closeextattr_args a;
   2113  1.105   hannken 	struct mount *mp;
   2114   1.51   thorpej 	a.a_desc = VDESC(vop_closeextattr);
   2115   1.51   thorpej 	a.a_vp = vp;
   2116   1.51   thorpej 	a.a_commit = commit;
   2117   1.51   thorpej 	a.a_cred = cred;
   2118  1.116   hannken 	assert_vop_locked(vp, "vop_closeextattr: vp");
   2119  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   2120  1.105   hannken 	if (error)
   2121  1.105   hannken 		return error;
   2122   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_closeextattr), &a));
   2123  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   2124   1.72        ad 	return error;
   2125   1.51   thorpej }
   2126   1.51   thorpej 
   2127   1.51   thorpej const int vop_getextattr_vp_offsets[] = {
   2128   1.51   thorpej 	VOPARG_OFFSETOF(struct vop_getextattr_args,a_vp),
   2129   1.51   thorpej 	VDESC_NO_OFFSET
   2130   1.51   thorpej };
   2131   1.51   thorpej const struct vnodeop_desc vop_getextattr_desc = {
   2132   1.67     pooka 	VOP_GETEXTATTR_DESCOFFSET,
   2133   1.51   thorpej 	"vop_getextattr",
   2134   1.51   thorpej 	0,
   2135   1.51   thorpej 	vop_getextattr_vp_offsets,
   2136   1.51   thorpej 	VDESC_NO_OFFSET,
   2137   1.51   thorpej 	VOPARG_OFFSETOF(struct vop_getextattr_args, a_cred),
   2138   1.51   thorpej 	VDESC_NO_OFFSET,
   2139   1.51   thorpej };
   2140   1.51   thorpej int
   2141   1.60   thorpej VOP_GETEXTATTR(struct vnode *vp,
   2142   1.60   thorpej     int attrnamespace,
   2143   1.60   thorpej     const char *name,
   2144   1.60   thorpej     struct uio *uio,
   2145   1.60   thorpej     size_t *size,
   2146   1.73     pooka     kauth_cred_t cred)
   2147   1.51   thorpej {
   2148   1.72        ad 	int error;
   2149   1.72        ad 	bool mpsafe;
   2150   1.51   thorpej 	struct vop_getextattr_args a;
   2151  1.105   hannken 	struct mount *mp;
   2152   1.51   thorpej 	a.a_desc = VDESC(vop_getextattr);
   2153   1.51   thorpej 	a.a_vp = vp;
   2154   1.51   thorpej 	a.a_attrnamespace = attrnamespace;
   2155   1.51   thorpej 	a.a_name = name;
   2156   1.51   thorpej 	a.a_uio = uio;
   2157   1.51   thorpej 	a.a_size = size;
   2158   1.51   thorpej 	a.a_cred = cred;
   2159  1.116   hannken 	assert_vop_locked(vp, "vop_getextattr: vp");
   2160  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   2161  1.105   hannken 	if (error)
   2162  1.105   hannken 		return error;
   2163   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_getextattr), &a));
   2164  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   2165   1.72        ad 	return error;
   2166   1.51   thorpej }
   2167   1.51   thorpej 
   2168   1.51   thorpej const int vop_listextattr_vp_offsets[] = {
   2169   1.51   thorpej 	VOPARG_OFFSETOF(struct vop_listextattr_args,a_vp),
   2170   1.51   thorpej 	VDESC_NO_OFFSET
   2171   1.51   thorpej };
   2172   1.51   thorpej const struct vnodeop_desc vop_listextattr_desc = {
   2173   1.67     pooka 	VOP_LISTEXTATTR_DESCOFFSET,
   2174   1.51   thorpej 	"vop_listextattr",
   2175   1.51   thorpej 	0,
   2176   1.51   thorpej 	vop_listextattr_vp_offsets,
   2177   1.51   thorpej 	VDESC_NO_OFFSET,
   2178   1.51   thorpej 	VOPARG_OFFSETOF(struct vop_listextattr_args, a_cred),
   2179   1.51   thorpej 	VDESC_NO_OFFSET,
   2180   1.51   thorpej };
   2181   1.51   thorpej int
   2182   1.60   thorpej VOP_LISTEXTATTR(struct vnode *vp,
   2183   1.60   thorpej     int attrnamespace,
   2184   1.60   thorpej     struct uio *uio,
   2185   1.60   thorpej     size_t *size,
   2186   1.87      manu     int flag,
   2187   1.73     pooka     kauth_cred_t cred)
   2188   1.51   thorpej {
   2189   1.72        ad 	int error;
   2190   1.72        ad 	bool mpsafe;
   2191   1.51   thorpej 	struct vop_listextattr_args a;
   2192  1.105   hannken 	struct mount *mp;
   2193   1.51   thorpej 	a.a_desc = VDESC(vop_listextattr);
   2194   1.51   thorpej 	a.a_vp = vp;
   2195   1.51   thorpej 	a.a_attrnamespace = attrnamespace;
   2196   1.51   thorpej 	a.a_uio = uio;
   2197   1.51   thorpej 	a.a_size = size;
   2198   1.87      manu 	a.a_flag = flag;
   2199   1.51   thorpej 	a.a_cred = cred;
   2200  1.116   hannken 	assert_vop_locked(vp, "vop_listextattr: vp");
   2201  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   2202  1.105   hannken 	if (error)
   2203  1.105   hannken 		return error;
   2204   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_listextattr), &a));
   2205  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   2206   1.72        ad 	return error;
   2207   1.51   thorpej }
   2208   1.51   thorpej 
   2209   1.51   thorpej const int vop_openextattr_vp_offsets[] = {
   2210   1.51   thorpej 	VOPARG_OFFSETOF(struct vop_openextattr_args,a_vp),
   2211   1.51   thorpej 	VDESC_NO_OFFSET
   2212   1.51   thorpej };
   2213   1.51   thorpej const struct vnodeop_desc vop_openextattr_desc = {
   2214   1.67     pooka 	VOP_OPENEXTATTR_DESCOFFSET,
   2215   1.51   thorpej 	"vop_openextattr",
   2216   1.51   thorpej 	0,
   2217   1.51   thorpej 	vop_openextattr_vp_offsets,
   2218   1.51   thorpej 	VDESC_NO_OFFSET,
   2219   1.51   thorpej 	VOPARG_OFFSETOF(struct vop_openextattr_args, a_cred),
   2220   1.51   thorpej 	VDESC_NO_OFFSET,
   2221   1.51   thorpej };
   2222   1.51   thorpej int
   2223   1.60   thorpej VOP_OPENEXTATTR(struct vnode *vp,
   2224   1.73     pooka     kauth_cred_t cred)
   2225   1.51   thorpej {
   2226   1.72        ad 	int error;
   2227   1.72        ad 	bool mpsafe;
   2228   1.51   thorpej 	struct vop_openextattr_args a;
   2229  1.105   hannken 	struct mount *mp;
   2230   1.51   thorpej 	a.a_desc = VDESC(vop_openextattr);
   2231   1.51   thorpej 	a.a_vp = vp;
   2232   1.51   thorpej 	a.a_cred = cred;
   2233  1.116   hannken 	assert_vop_locked(vp, "vop_openextattr: vp");
   2234  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   2235  1.105   hannken 	if (error)
   2236  1.105   hannken 		return error;
   2237   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_openextattr), &a));
   2238  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   2239   1.72        ad 	return error;
   2240   1.51   thorpej }
   2241   1.51   thorpej 
   2242   1.51   thorpej const int vop_deleteextattr_vp_offsets[] = {
   2243   1.51   thorpej 	VOPARG_OFFSETOF(struct vop_deleteextattr_args,a_vp),
   2244   1.51   thorpej 	VDESC_NO_OFFSET
   2245   1.51   thorpej };
   2246   1.51   thorpej const struct vnodeop_desc vop_deleteextattr_desc = {
   2247   1.67     pooka 	VOP_DELETEEXTATTR_DESCOFFSET,
   2248   1.51   thorpej 	"vop_deleteextattr",
   2249   1.51   thorpej 	0,
   2250   1.51   thorpej 	vop_deleteextattr_vp_offsets,
   2251   1.51   thorpej 	VDESC_NO_OFFSET,
   2252   1.51   thorpej 	VOPARG_OFFSETOF(struct vop_deleteextattr_args, a_cred),
   2253   1.51   thorpej 	VDESC_NO_OFFSET,
   2254   1.51   thorpej };
   2255   1.51   thorpej int
   2256   1.60   thorpej VOP_DELETEEXTATTR(struct vnode *vp,
   2257   1.60   thorpej     int attrnamespace,
   2258   1.60   thorpej     const char *name,
   2259   1.73     pooka     kauth_cred_t cred)
   2260   1.51   thorpej {
   2261   1.72        ad 	int error;
   2262   1.72        ad 	bool mpsafe;
   2263   1.51   thorpej 	struct vop_deleteextattr_args a;
   2264  1.105   hannken 	struct mount *mp;
   2265   1.51   thorpej 	a.a_desc = VDESC(vop_deleteextattr);
   2266   1.51   thorpej 	a.a_vp = vp;
   2267   1.51   thorpej 	a.a_attrnamespace = attrnamespace;
   2268   1.51   thorpej 	a.a_name = name;
   2269   1.51   thorpej 	a.a_cred = cred;
   2270  1.116   hannken 	assert_vop_elocked(vp, "vop_deleteextattr: vp");
   2271  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   2272  1.105   hannken 	if (error)
   2273  1.105   hannken 		return error;
   2274   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_deleteextattr), &a));
   2275  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   2276   1.72        ad 	return error;
   2277   1.51   thorpej }
   2278   1.51   thorpej 
   2279   1.51   thorpej const int vop_setextattr_vp_offsets[] = {
   2280   1.51   thorpej 	VOPARG_OFFSETOF(struct vop_setextattr_args,a_vp),
   2281   1.51   thorpej 	VDESC_NO_OFFSET
   2282   1.51   thorpej };
   2283   1.51   thorpej const struct vnodeop_desc vop_setextattr_desc = {
   2284   1.67     pooka 	VOP_SETEXTATTR_DESCOFFSET,
   2285   1.51   thorpej 	"vop_setextattr",
   2286   1.51   thorpej 	0,
   2287   1.51   thorpej 	vop_setextattr_vp_offsets,
   2288   1.51   thorpej 	VDESC_NO_OFFSET,
   2289   1.51   thorpej 	VOPARG_OFFSETOF(struct vop_setextattr_args, a_cred),
   2290   1.51   thorpej 	VDESC_NO_OFFSET,
   2291   1.51   thorpej };
   2292   1.51   thorpej int
   2293   1.60   thorpej VOP_SETEXTATTR(struct vnode *vp,
   2294   1.60   thorpej     int attrnamespace,
   2295   1.60   thorpej     const char *name,
   2296   1.60   thorpej     struct uio *uio,
   2297   1.73     pooka     kauth_cred_t cred)
   2298   1.51   thorpej {
   2299   1.72        ad 	int error;
   2300   1.72        ad 	bool mpsafe;
   2301   1.51   thorpej 	struct vop_setextattr_args a;
   2302  1.105   hannken 	struct mount *mp;
   2303   1.51   thorpej 	a.a_desc = VDESC(vop_setextattr);
   2304   1.51   thorpej 	a.a_vp = vp;
   2305   1.51   thorpej 	a.a_attrnamespace = attrnamespace;
   2306   1.51   thorpej 	a.a_name = name;
   2307   1.51   thorpej 	a.a_uio = uio;
   2308   1.51   thorpej 	a.a_cred = cred;
   2309  1.116   hannken 	assert_vop_elocked(vp, "vop_setextattr: vp");
   2310  1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   2311  1.105   hannken 	if (error)
   2312  1.105   hannken 		return error;
   2313   1.72        ad 	error = (VCALL(vp, VOFFSET(vop_setextattr), &a));
   2314  1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   2315   1.72        ad 	return error;
   2316   1.51   thorpej }
   2317   1.51   thorpej 
   2318   1.33  jdolecek const struct vnodeop_desc * const vfs_op_descs[] = {
   2319    1.1       cgd 	&vop_default_desc,	/* MUST BE FIRST */
   2320    1.1       cgd 
   2321   1.88   hannken 	&vop_bwrite_desc,
   2322  1.113  dholland 	&vop_parsepath_desc,
   2323    1.1       cgd 	&vop_lookup_desc,
   2324    1.1       cgd 	&vop_create_desc,
   2325    1.1       cgd 	&vop_mknod_desc,
   2326    1.1       cgd 	&vop_open_desc,
   2327    1.1       cgd 	&vop_close_desc,
   2328    1.1       cgd 	&vop_access_desc,
   2329  1.111  christos 	&vop_accessx_desc,
   2330    1.1       cgd 	&vop_getattr_desc,
   2331    1.1       cgd 	&vop_setattr_desc,
   2332    1.1       cgd 	&vop_read_desc,
   2333    1.1       cgd 	&vop_write_desc,
   2334   1.93  dholland 	&vop_fallocate_desc,
   2335   1.93  dholland 	&vop_fdiscard_desc,
   2336    1.1       cgd 	&vop_ioctl_desc,
   2337   1.18  wrstuden 	&vop_fcntl_desc,
   2338    1.3   mycroft 	&vop_poll_desc,
   2339   1.40  jdolecek 	&vop_kqfilter_desc,
   2340   1.10      fvdl 	&vop_revoke_desc,
   2341    1.1       cgd 	&vop_mmap_desc,
   2342    1.1       cgd 	&vop_fsync_desc,
   2343    1.1       cgd 	&vop_seek_desc,
   2344    1.1       cgd 	&vop_remove_desc,
   2345    1.1       cgd 	&vop_link_desc,
   2346    1.1       cgd 	&vop_rename_desc,
   2347    1.1       cgd 	&vop_mkdir_desc,
   2348    1.1       cgd 	&vop_rmdir_desc,
   2349    1.1       cgd 	&vop_symlink_desc,
   2350    1.1       cgd 	&vop_readdir_desc,
   2351    1.1       cgd 	&vop_readlink_desc,
   2352    1.1       cgd 	&vop_abortop_desc,
   2353    1.1       cgd 	&vop_inactive_desc,
   2354    1.1       cgd 	&vop_reclaim_desc,
   2355    1.1       cgd 	&vop_lock_desc,
   2356    1.1       cgd 	&vop_unlock_desc,
   2357    1.1       cgd 	&vop_bmap_desc,
   2358   1.46   hannken 	&vop_strategy_desc,
   2359    1.1       cgd 	&vop_print_desc,
   2360    1.1       cgd 	&vop_islocked_desc,
   2361    1.1       cgd 	&vop_pathconf_desc,
   2362    1.1       cgd 	&vop_advlock_desc,
   2363    1.1       cgd 	&vop_whiteout_desc,
   2364   1.26       chs 	&vop_getpages_desc,
   2365   1.26       chs 	&vop_putpages_desc,
   2366  1.111  christos 	&vop_getacl_desc,
   2367  1.111  christos 	&vop_setacl_desc,
   2368  1.111  christos 	&vop_aclcheck_desc,
   2369   1.51   thorpej 	&vop_closeextattr_desc,
   2370   1.51   thorpej 	&vop_getextattr_desc,
   2371   1.51   thorpej 	&vop_listextattr_desc,
   2372   1.51   thorpej 	&vop_openextattr_desc,
   2373   1.51   thorpej 	&vop_deleteextattr_desc,
   2374   1.51   thorpej 	&vop_setextattr_desc,
   2375    1.1       cgd 	NULL
   2376    1.1       cgd };
   2377