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