Home | History | Annotate | Line # | Download | only in kern
vnode_if.c revision 1.118.4.1
      1      1.113  dholland /*	$NetBSD: vnode_if.c,v 1.118.4.1 2023/06/21 16:52:28 martin 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.118.4.1    martin  *	NetBSD: vnode_if.src,v 1.84.4.1 2023/06/21 16:50:21 martin Exp
      9        1.1       cgd  * by the script:
     10  1.118.4.1    martin  *	NetBSD: vnode_if.sh,v 1.77 2022/10/26 23:39:43 riastradh 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.118.4.1 2023/06/21 16:52:28 martin 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.118.4.1    martin #include <miscfs/deadfs/deadfs.h>
     58  1.118.4.1    martin 
     59      1.108   hannken enum fst_op { FST_NO, FST_YES, FST_LAZY, FST_TRY };
     60      1.105   hannken 
     61      1.105   hannken static inline int
     62      1.105   hannken vop_pre(vnode_t *vp, struct mount **mp, bool *mpsafe, enum fst_op op)
     63      1.105   hannken {
     64      1.105   hannken 	int error;
     65      1.105   hannken 
     66      1.105   hannken 	*mpsafe = (vp->v_vflag & VV_MPSAFE);
     67      1.105   hannken 
     68      1.105   hannken 	if (!*mpsafe) {
     69      1.105   hannken 		KERNEL_LOCK(1, curlwp);
     70      1.105   hannken 	}
     71      1.105   hannken 
     72      1.108   hannken 	if (op == FST_YES || op == FST_LAZY || op == FST_TRY) {
     73      1.105   hannken 		for (;;) {
     74      1.105   hannken 			*mp = vp->v_mount;
     75      1.105   hannken 			if (op == FST_TRY) {
     76      1.106   hannken 				error = fstrans_start_nowait(*mp);
     77      1.105   hannken 				if (error) {
     78      1.105   hannken 					if (!*mpsafe) {
     79      1.105   hannken 						KERNEL_UNLOCK_ONE(curlwp);
     80      1.105   hannken 					}
     81      1.105   hannken 					return error;
     82      1.105   hannken 				}
     83      1.108   hannken 			} else if (op == FST_LAZY) {
     84      1.108   hannken 				fstrans_start_lazy(*mp);
     85      1.105   hannken 			} else {
     86      1.106   hannken 				fstrans_start(*mp);
     87      1.105   hannken 			}
     88      1.105   hannken 			if (__predict_true(*mp == vp->v_mount))
     89      1.105   hannken 				break;
     90      1.105   hannken 			fstrans_done(*mp);
     91      1.105   hannken 		}
     92      1.105   hannken 	} else {
     93      1.105   hannken 		*mp = vp->v_mount;
     94      1.105   hannken 	}
     95      1.105   hannken 
     96      1.105   hannken 	return 0;
     97      1.105   hannken }
     98      1.105   hannken 
     99      1.115   thorpej static inline u_quad_t
    100      1.115   thorpej vop_pre_get_size(struct vnode *vp)
    101      1.115   thorpej {
    102      1.115   thorpej 	mutex_enter(vp->v_interlock);
    103      1.115   thorpej 	KASSERT(vp->v_size != VSIZENOTSET);
    104      1.115   thorpej 	u_quad_t rv = (u_quad_t)vp->v_size;
    105      1.115   thorpej 	mutex_exit(vp->v_interlock);
    106      1.115   thorpej 
    107      1.115   thorpej 	return rv;
    108      1.115   thorpej }
    109      1.115   thorpej 
    110      1.115   thorpej /*
    111      1.115   thorpej  * VOP_RMDIR(), VOP_REMOVE(), and VOP_RENAME() need special handling
    112      1.115   thorpej  * because they each drop the caller's references on one or more of
    113      1.115   thorpej  * their arguments.  While there must be an open file descriptor in
    114      1.115   thorpej  * associated with a vnode in order for knotes to be attached to it,
    115      1.115   thorpej  * that status could change during the course of the operation.  So,
    116      1.115   thorpej  * for the vnode arguments that are WILLRELE or WILLPUT, we check
    117      1.115   thorpej  * pre-op if there are registered knotes, take a hold count if so,
    118      1.115   thorpej  * and post-op release the hold after activating any knotes still
    119      1.115   thorpej  * associated with the vnode.
    120      1.115   thorpej  */
    121      1.115   thorpej 
    122      1.115   thorpej #define	VOP_POST_KNOTE(thisvp, e, n)					\
    123      1.115   thorpej do {									\
    124      1.115   thorpej 	if (__predict_true((e) == 0)) {					\
    125      1.115   thorpej 		/*							\
    126      1.115   thorpej 		 * VN_KNOTE() does the VN_KEVENT_INTEREST()		\
    127      1.115   thorpej 		 * check for us.					\
    128      1.115   thorpej 		 */							\
    129      1.115   thorpej 		VN_KNOTE((thisvp), (n));				\
    130      1.115   thorpej 	}								\
    131      1.115   thorpej } while (/*CONSTCOND*/0)
    132      1.115   thorpej 
    133      1.115   thorpej #define	VOP_POST_KNOTE_HELD(thisvp, e, n)				\
    134      1.115   thorpej do {									\
    135      1.115   thorpej 	/*								\
    136      1.115   thorpej 	 * We don't perform a VN_KEVENT_INTEREST() check here; it	\
    137      1.115   thorpej 	 * was already performed when we did the pre-op work that	\
    138      1.115   thorpej 	 * caused the vnode to be held in the first place.		\
    139      1.115   thorpej 	 */								\
    140      1.115   thorpej 	mutex_enter((thisvp)->v_interlock);				\
    141      1.115   thorpej 	if (__predict_true((e) == 0)) {					\
    142      1.118   thorpej 		knote(&(thisvp)->v_klist->vk_klist, (n));		\
    143      1.115   thorpej 	}								\
    144      1.115   thorpej 	holdrelel((thisvp));						\
    145      1.115   thorpej 	mutex_exit((thisvp)->v_interlock);				\
    146      1.115   thorpej 	/*								\
    147      1.115   thorpej 	 * thisvp might be gone now!  Don't touch!			\
    148      1.115   thorpej 	 */								\
    149      1.115   thorpej } while (/*CONSTCOND*/0)
    150      1.115   thorpej 
    151      1.115   thorpej #define	vop_create_post(ap, e)						\
    152      1.115   thorpej 	VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE)
    153      1.115   thorpej 
    154      1.115   thorpej #define	vop_mknod_post(ap, e)						\
    155      1.115   thorpej 	VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE)
    156      1.115   thorpej 
    157      1.115   thorpej #define	vop_setattr_pre(ap)						\
    158      1.115   thorpej 	u_quad_t osize = 0;						\
    159      1.115   thorpej 	long vp_events =						\
    160      1.115   thorpej 	    VN_KEVENT_INTEREST((ap)->a_vp, NOTE_ATTRIB | NOTE_EXTEND)	\
    161      1.115   thorpej 	    ? NOTE_ATTRIB : 0;						\
    162      1.115   thorpej 	bool check_extend = false;					\
    163      1.115   thorpej 	if (__predict_false(vp_events != 0 &&				\
    164      1.115   thorpej 	    (ap)->a_vap->va_size != VNOVALSIZE)) {			\
    165      1.115   thorpej 		check_extend = true;					\
    166      1.115   thorpej 		osize = vop_pre_get_size((ap)->a_vp);			\
    167      1.115   thorpej 	}
    168      1.115   thorpej 
    169      1.115   thorpej #define	vop_setattr_post(ap, e)						\
    170      1.115   thorpej do {									\
    171      1.115   thorpej 	if (__predict_false(vp_events != 0)) {				\
    172      1.115   thorpej 		if (__predict_false(check_extend &&			\
    173      1.115   thorpej 		    (ap)->a_vap->va_size > osize)) {			\
    174      1.115   thorpej 			vp_events |= NOTE_EXTEND;			\
    175      1.115   thorpej 		}							\
    176      1.115   thorpej 		VOP_POST_KNOTE((ap)->a_vp, (e), vp_events);		\
    177      1.115   thorpej 	}								\
    178      1.115   thorpej } while (/*CONSTCOND*/0)
    179      1.115   thorpej 
    180      1.115   thorpej #define	vop_setacl_post(ap, e)						\
    181      1.115   thorpej 	VOP_POST_KNOTE((ap)->a_vp, (e), NOTE_ATTRIB)
    182      1.115   thorpej 
    183      1.115   thorpej #define	vop_link_post(ap, e)						\
    184      1.115   thorpej do {									\
    185      1.115   thorpej 	VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE);			\
    186      1.115   thorpej 	VOP_POST_KNOTE((ap)->a_vp, (e), NOTE_LINK);			\
    187      1.115   thorpej } while (/*CONSTCOND*/0)
    188      1.115   thorpej 
    189      1.115   thorpej #define	vop_mkdir_post(ap, e)						\
    190      1.115   thorpej 	VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE | NOTE_LINK)
    191      1.115   thorpej 
    192      1.115   thorpej #define	vop_remove_pre_common(ap)					\
    193      1.115   thorpej 	bool post_event_vp =						\
    194      1.115   thorpej 	    VN_KEVENT_INTEREST((ap)->a_vp, NOTE_DELETE | NOTE_LINK);	\
    195      1.115   thorpej 	if (__predict_false(post_event_vp)) {				\
    196      1.115   thorpej 		vhold((ap)->a_vp);					\
    197      1.115   thorpej 	}
    198      1.115   thorpej 
    199      1.115   thorpej #define	vop_remove_post_common(ap, e, dn, lc)				\
    200      1.115   thorpej do {									\
    201      1.115   thorpej 	VOP_POST_KNOTE((ap)->a_dvp, (e), (dn));				\
    202      1.115   thorpej 	if (__predict_false(post_event_vp)) {				\
    203      1.115   thorpej 		VOP_POST_KNOTE_HELD((ap)->a_vp, (e),			\
    204      1.115   thorpej 		    (lc) ? NOTE_LINK : NOTE_DELETE);			\
    205      1.115   thorpej 	}								\
    206      1.115   thorpej } while (/*CONSTCOND*/0)
    207      1.115   thorpej 
    208      1.115   thorpej /*
    209      1.115   thorpej  * One could make the argument that VOP_REMOVE() should send NOTE_LINK
    210      1.115   thorpej  * on vp if the resulting link count is not zero, but that's not what
    211      1.115   thorpej  * the documentation says.
    212      1.115   thorpej  *
    213      1.115   thorpej  * We could change this easily by passing ap->ctx_vp_new_nlink to
    214      1.115   thorpej  * vop_remove_post_common().
    215      1.115   thorpej  */
    216      1.115   thorpej #define	vop_remove_pre(ap)						\
    217      1.115   thorpej 	vop_remove_pre_common((ap));					\
    218      1.115   thorpej 	/*								\
    219      1.115   thorpej 	 * We will assume that the file being removed is deleted unless	\
    220      1.115   thorpej 	 * the file system tells us otherwise by updating vp_new_nlink.	\
    221      1.115   thorpej 	 */								\
    222      1.115   thorpej 	(ap)->ctx_vp_new_nlink = 0;
    223      1.115   thorpej 
    224      1.115   thorpej #define	vop_remove_post(ap, e)						\
    225      1.115   thorpej 	vop_remove_post_common((ap), (e), NOTE_WRITE, 0)
    226      1.115   thorpej 
    227      1.115   thorpej #define	vop_rmdir_pre(ap)						\
    228      1.115   thorpej 	vop_remove_pre_common(ap)
    229      1.115   thorpej 
    230      1.115   thorpej #define	vop_rmdir_post(ap, e)						\
    231      1.115   thorpej 	vop_remove_post_common((ap), (e), NOTE_WRITE | NOTE_LINK, 0)
    232      1.115   thorpej 
    233      1.115   thorpej #define	vop_symlink_post(ap, e)						\
    234      1.115   thorpej 	VOP_POST_KNOTE((ap)->a_dvp, (e), NOTE_WRITE)
    235      1.115   thorpej 
    236      1.115   thorpej #define	vop_open_post(ap, e)						\
    237      1.115   thorpej 	VOP_POST_KNOTE((ap)->a_vp, (e), NOTE_OPEN)
    238      1.115   thorpej 
    239      1.115   thorpej #define	vop_close_post(ap, e)						\
    240      1.115   thorpej do {									\
    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.118   thorpej 			knote(&thisvp->v_klist->vk_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.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
    931      1.105   hannken 	if (error)
    932      1.105   hannken 		return error;
    933       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_ioctl), &a));
    934      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
    935       1.72        ad 	return error;
    936       1.23   thorpej }
    937        1.1       cgd 
    938       1.31  jdolecek const int vop_fcntl_vp_offsets[] = {
    939       1.18  wrstuden 	VOPARG_OFFSETOF(struct vop_fcntl_args,a_vp),
    940       1.18  wrstuden 	VDESC_NO_OFFSET
    941       1.18  wrstuden };
    942       1.33  jdolecek const struct vnodeop_desc vop_fcntl_desc = {
    943       1.67     pooka 	VOP_FCNTL_DESCOFFSET,
    944       1.18  wrstuden 	"vop_fcntl",
    945       1.18  wrstuden 	0,
    946       1.18  wrstuden 	vop_fcntl_vp_offsets,
    947       1.18  wrstuden 	VDESC_NO_OFFSET,
    948       1.18  wrstuden 	VOPARG_OFFSETOF(struct vop_fcntl_args, a_cred),
    949       1.18  wrstuden 	VDESC_NO_OFFSET,
    950       1.18  wrstuden };
    951       1.23   thorpej int
    952       1.60   thorpej VOP_FCNTL(struct vnode *vp,
    953       1.60   thorpej     u_int command,
    954       1.60   thorpej     void *data,
    955       1.60   thorpej     int fflag,
    956       1.73     pooka     kauth_cred_t cred)
    957       1.23   thorpej {
    958       1.72        ad 	int error;
    959       1.72        ad 	bool mpsafe;
    960       1.23   thorpej 	struct vop_fcntl_args a;
    961      1.105   hannken 	struct mount *mp;
    962       1.23   thorpej 	a.a_desc = VDESC(vop_fcntl);
    963       1.23   thorpej 	a.a_vp = vp;
    964       1.23   thorpej 	a.a_command = command;
    965       1.23   thorpej 	a.a_data = data;
    966       1.23   thorpej 	a.a_fflag = fflag;
    967       1.23   thorpej 	a.a_cred = cred;
    968      1.116   hannken 	assert_vop_unlocked(vp, "vop_fcntl: vp");
    969      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
    970      1.105   hannken 	if (error)
    971      1.105   hannken 		return error;
    972       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_fcntl), &a));
    973      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
    974       1.72        ad 	return error;
    975       1.23   thorpej }
    976       1.18  wrstuden 
    977       1.31  jdolecek const int vop_poll_vp_offsets[] = {
    978        1.3   mycroft 	VOPARG_OFFSETOF(struct vop_poll_args,a_vp),
    979        1.1       cgd 	VDESC_NO_OFFSET
    980        1.1       cgd };
    981       1.33  jdolecek const struct vnodeop_desc vop_poll_desc = {
    982       1.67     pooka 	VOP_POLL_DESCOFFSET,
    983        1.3   mycroft 	"vop_poll",
    984        1.1       cgd 	0,
    985        1.3   mycroft 	vop_poll_vp_offsets,
    986        1.1       cgd 	VDESC_NO_OFFSET,
    987        1.3   mycroft 	VDESC_NO_OFFSET,
    988        1.1       cgd 	VDESC_NO_OFFSET,
    989        1.1       cgd };
    990       1.23   thorpej int
    991       1.60   thorpej VOP_POLL(struct vnode *vp,
    992       1.73     pooka     int events)
    993       1.23   thorpej {
    994       1.72        ad 	int error;
    995       1.72        ad 	bool mpsafe;
    996       1.23   thorpej 	struct vop_poll_args a;
    997      1.105   hannken 	struct mount *mp;
    998       1.23   thorpej 	a.a_desc = VDESC(vop_poll);
    999       1.23   thorpej 	a.a_vp = vp;
   1000       1.23   thorpej 	a.a_events = events;
   1001      1.116   hannken 	assert_vop_unlocked(vp, "vop_poll: vp");
   1002      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_YES);
   1003      1.105   hannken 	if (error)
   1004      1.105   hannken 		return error;
   1005       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_poll), &a));
   1006      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_YES);
   1007       1.72        ad 	return error;
   1008       1.23   thorpej }
   1009        1.1       cgd 
   1010       1.40  jdolecek const int vop_kqfilter_vp_offsets[] = {
   1011       1.40  jdolecek 	VOPARG_OFFSETOF(struct vop_kqfilter_args,a_vp),
   1012       1.40  jdolecek 	VDESC_NO_OFFSET
   1013       1.40  jdolecek };
   1014       1.40  jdolecek const struct vnodeop_desc vop_kqfilter_desc = {
   1015       1.67     pooka 	VOP_KQFILTER_DESCOFFSET,
   1016       1.40  jdolecek 	"vop_kqfilter",
   1017       1.40  jdolecek 	0,
   1018       1.40  jdolecek 	vop_kqfilter_vp_offsets,
   1019       1.40  jdolecek 	VDESC_NO_OFFSET,
   1020       1.40  jdolecek 	VDESC_NO_OFFSET,
   1021       1.40  jdolecek 	VDESC_NO_OFFSET,
   1022       1.40  jdolecek };
   1023       1.40  jdolecek int
   1024       1.60   thorpej VOP_KQFILTER(struct vnode *vp,
   1025       1.60   thorpej     struct knote *kn)
   1026       1.40  jdolecek {
   1027       1.72        ad 	int error;
   1028       1.72        ad 	bool mpsafe;
   1029       1.40  jdolecek 	struct vop_kqfilter_args a;
   1030      1.105   hannken 	struct mount *mp;
   1031       1.40  jdolecek 	a.a_desc = VDESC(vop_kqfilter);
   1032       1.40  jdolecek 	a.a_vp = vp;
   1033       1.40  jdolecek 	a.a_kn = kn;
   1034      1.116   hannken 	assert_vop_unlocked(vp, "vop_kqfilter: vp");
   1035      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_YES);
   1036      1.105   hannken 	if (error)
   1037      1.105   hannken 		return error;
   1038       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_kqfilter), &a));
   1039      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_YES);
   1040       1.72        ad 	return error;
   1041       1.40  jdolecek }
   1042       1.40  jdolecek 
   1043       1.31  jdolecek const int vop_revoke_vp_offsets[] = {
   1044       1.10      fvdl 	VOPARG_OFFSETOF(struct vop_revoke_args,a_vp),
   1045       1.10      fvdl 	VDESC_NO_OFFSET
   1046       1.10      fvdl };
   1047       1.33  jdolecek const struct vnodeop_desc vop_revoke_desc = {
   1048       1.67     pooka 	VOP_REVOKE_DESCOFFSET,
   1049       1.10      fvdl 	"vop_revoke",
   1050       1.10      fvdl 	0,
   1051       1.10      fvdl 	vop_revoke_vp_offsets,
   1052       1.10      fvdl 	VDESC_NO_OFFSET,
   1053       1.10      fvdl 	VDESC_NO_OFFSET,
   1054       1.10      fvdl 	VDESC_NO_OFFSET,
   1055       1.10      fvdl };
   1056       1.23   thorpej int
   1057       1.60   thorpej VOP_REVOKE(struct vnode *vp,
   1058       1.60   thorpej     int flags)
   1059       1.23   thorpej {
   1060       1.72        ad 	int error;
   1061       1.72        ad 	bool mpsafe;
   1062       1.23   thorpej 	struct vop_revoke_args a;
   1063      1.105   hannken 	struct mount *mp;
   1064       1.23   thorpej 	a.a_desc = VDESC(vop_revoke);
   1065       1.23   thorpej 	a.a_vp = vp;
   1066       1.23   thorpej 	a.a_flags = flags;
   1067      1.116   hannken 	assert_vop_unlocked(vp, "vop_revoke: vp");
   1068      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1069      1.105   hannken 	if (error)
   1070      1.105   hannken 		return error;
   1071       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_revoke), &a));
   1072      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1073       1.72        ad 	return error;
   1074       1.23   thorpej }
   1075       1.10      fvdl 
   1076       1.31  jdolecek const int vop_mmap_vp_offsets[] = {
   1077        1.1       cgd 	VOPARG_OFFSETOF(struct vop_mmap_args,a_vp),
   1078        1.1       cgd 	VDESC_NO_OFFSET
   1079        1.1       cgd };
   1080       1.33  jdolecek const struct vnodeop_desc vop_mmap_desc = {
   1081       1.67     pooka 	VOP_MMAP_DESCOFFSET,
   1082        1.1       cgd 	"vop_mmap",
   1083        1.1       cgd 	0,
   1084        1.1       cgd 	vop_mmap_vp_offsets,
   1085        1.1       cgd 	VDESC_NO_OFFSET,
   1086        1.1       cgd 	VOPARG_OFFSETOF(struct vop_mmap_args, a_cred),
   1087        1.1       cgd 	VDESC_NO_OFFSET,
   1088        1.1       cgd };
   1089       1.23   thorpej int
   1090       1.60   thorpej VOP_MMAP(struct vnode *vp,
   1091       1.70     pooka     vm_prot_t prot,
   1092       1.73     pooka     kauth_cred_t cred)
   1093       1.23   thorpej {
   1094       1.72        ad 	int error;
   1095       1.72        ad 	bool mpsafe;
   1096       1.23   thorpej 	struct vop_mmap_args a;
   1097      1.105   hannken 	struct mount *mp;
   1098       1.23   thorpej 	a.a_desc = VDESC(vop_mmap);
   1099       1.23   thorpej 	a.a_vp = vp;
   1100       1.70     pooka 	a.a_prot = prot;
   1101       1.23   thorpej 	a.a_cred = cred;
   1102      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_YES);
   1103      1.105   hannken 	if (error)
   1104      1.105   hannken 		return error;
   1105       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_mmap), &a));
   1106      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_YES);
   1107       1.72        ad 	return error;
   1108       1.23   thorpej }
   1109        1.1       cgd 
   1110       1.31  jdolecek const int vop_fsync_vp_offsets[] = {
   1111        1.1       cgd 	VOPARG_OFFSETOF(struct vop_fsync_args,a_vp),
   1112        1.1       cgd 	VDESC_NO_OFFSET
   1113        1.1       cgd };
   1114       1.33  jdolecek const struct vnodeop_desc vop_fsync_desc = {
   1115       1.67     pooka 	VOP_FSYNC_DESCOFFSET,
   1116        1.1       cgd 	"vop_fsync",
   1117        1.1       cgd 	0,
   1118        1.1       cgd 	vop_fsync_vp_offsets,
   1119        1.1       cgd 	VDESC_NO_OFFSET,
   1120        1.1       cgd 	VOPARG_OFFSETOF(struct vop_fsync_args, a_cred),
   1121        1.1       cgd 	VDESC_NO_OFFSET,
   1122        1.1       cgd };
   1123       1.23   thorpej int
   1124       1.60   thorpej VOP_FSYNC(struct vnode *vp,
   1125       1.65      elad     kauth_cred_t cred,
   1126       1.60   thorpej     int flags,
   1127       1.60   thorpej     off_t offlo,
   1128       1.73     pooka     off_t offhi)
   1129       1.23   thorpej {
   1130       1.72        ad 	int error;
   1131       1.72        ad 	bool mpsafe;
   1132       1.23   thorpej 	struct vop_fsync_args a;
   1133      1.105   hannken 	struct mount *mp;
   1134       1.23   thorpej 	a.a_desc = VDESC(vop_fsync);
   1135       1.23   thorpej 	a.a_vp = vp;
   1136       1.23   thorpej 	a.a_cred = cred;
   1137       1.23   thorpej 	a.a_flags = flags;
   1138       1.25      fvdl 	a.a_offlo = offlo;
   1139       1.25      fvdl 	a.a_offhi = offhi;
   1140      1.116   hannken 	assert_vop_locked(vp, "vop_fsync: vp");
   1141      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1142      1.105   hannken 	if (error)
   1143      1.105   hannken 		return error;
   1144       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_fsync), &a));
   1145      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1146       1.72        ad 	return error;
   1147       1.23   thorpej }
   1148        1.1       cgd 
   1149       1.31  jdolecek const int vop_seek_vp_offsets[] = {
   1150        1.1       cgd 	VOPARG_OFFSETOF(struct vop_seek_args,a_vp),
   1151        1.1       cgd 	VDESC_NO_OFFSET
   1152        1.1       cgd };
   1153       1.33  jdolecek const struct vnodeop_desc vop_seek_desc = {
   1154       1.67     pooka 	VOP_SEEK_DESCOFFSET,
   1155        1.1       cgd 	"vop_seek",
   1156        1.1       cgd 	0,
   1157        1.1       cgd 	vop_seek_vp_offsets,
   1158        1.1       cgd 	VDESC_NO_OFFSET,
   1159        1.1       cgd 	VOPARG_OFFSETOF(struct vop_seek_args, a_cred),
   1160        1.1       cgd 	VDESC_NO_OFFSET,
   1161        1.1       cgd };
   1162       1.23   thorpej int
   1163       1.60   thorpej VOP_SEEK(struct vnode *vp,
   1164       1.60   thorpej     off_t oldoff,
   1165       1.60   thorpej     off_t newoff,
   1166       1.65      elad     kauth_cred_t cred)
   1167       1.23   thorpej {
   1168       1.72        ad 	int error;
   1169       1.72        ad 	bool mpsafe;
   1170       1.23   thorpej 	struct vop_seek_args a;
   1171      1.105   hannken 	struct mount *mp;
   1172       1.23   thorpej 	a.a_desc = VDESC(vop_seek);
   1173       1.23   thorpej 	a.a_vp = vp;
   1174       1.23   thorpej 	a.a_oldoff = oldoff;
   1175       1.23   thorpej 	a.a_newoff = newoff;
   1176       1.23   thorpej 	a.a_cred = cred;
   1177      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_YES);
   1178      1.105   hannken 	if (error)
   1179      1.105   hannken 		return error;
   1180       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_seek), &a));
   1181      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_YES);
   1182       1.72        ad 	return error;
   1183       1.23   thorpej }
   1184        1.1       cgd 
   1185       1.31  jdolecek const int vop_remove_vp_offsets[] = {
   1186      1.115   thorpej 	VOPARG_OFFSETOF(struct vop_remove_v3_args,a_dvp),
   1187      1.115   thorpej 	VOPARG_OFFSETOF(struct vop_remove_v3_args,a_vp),
   1188        1.1       cgd 	VDESC_NO_OFFSET
   1189        1.1       cgd };
   1190       1.33  jdolecek const struct vnodeop_desc vop_remove_desc = {
   1191       1.67     pooka 	VOP_REMOVE_DESCOFFSET,
   1192        1.1       cgd 	"vop_remove",
   1193      1.103  riastrad 	0 | VDESC_VP1_WILLPUT,
   1194        1.1       cgd 	vop_remove_vp_offsets,
   1195        1.1       cgd 	VDESC_NO_OFFSET,
   1196        1.1       cgd 	VDESC_NO_OFFSET,
   1197      1.115   thorpej 	VOPARG_OFFSETOF(struct vop_remove_v3_args, a_cnp),
   1198        1.1       cgd };
   1199       1.23   thorpej int
   1200       1.60   thorpej VOP_REMOVE(struct vnode *dvp,
   1201       1.60   thorpej     struct vnode *vp,
   1202       1.60   thorpej     struct componentname *cnp)
   1203       1.23   thorpej {
   1204       1.72        ad 	int error;
   1205       1.72        ad 	bool mpsafe;
   1206      1.115   thorpej 	struct vop_remove_v3_args a;
   1207      1.105   hannken 	struct mount *mp;
   1208       1.23   thorpej 	a.a_desc = VDESC(vop_remove);
   1209       1.23   thorpej 	a.a_dvp = dvp;
   1210       1.81     pooka 	a.a_vp = vp;
   1211       1.23   thorpej 	a.a_cnp = cnp;
   1212      1.116   hannken 	assert_vop_elocked(dvp, "vop_remove: dvp");
   1213      1.116   hannken 	assert_vop_locked(vp, "vop_remove: vp");
   1214      1.115   thorpej 	vop_remove_pre(&a);
   1215      1.105   hannken 	error = vop_pre(dvp, &mp, &mpsafe, FST_NO);
   1216      1.105   hannken 	if (error)
   1217      1.105   hannken 		return error;
   1218       1.72        ad 	error = (VCALL(dvp, VOFFSET(vop_remove), &a));
   1219      1.105   hannken 	vop_post(dvp, mp, mpsafe, FST_NO);
   1220      1.115   thorpej 	vop_remove_post(&a, error);
   1221       1.72        ad 	return error;
   1222       1.23   thorpej }
   1223        1.1       cgd 
   1224       1.31  jdolecek const int vop_link_vp_offsets[] = {
   1225       1.94  riastrad 	VOPARG_OFFSETOF(struct vop_link_v2_args,a_dvp),
   1226       1.94  riastrad 	VOPARG_OFFSETOF(struct vop_link_v2_args,a_vp),
   1227        1.1       cgd 	VDESC_NO_OFFSET
   1228        1.1       cgd };
   1229       1.33  jdolecek const struct vnodeop_desc vop_link_desc = {
   1230       1.67     pooka 	VOP_LINK_DESCOFFSET,
   1231        1.1       cgd 	"vop_link",
   1232       1.94  riastrad 	0,
   1233        1.1       cgd 	vop_link_vp_offsets,
   1234        1.1       cgd 	VDESC_NO_OFFSET,
   1235        1.1       cgd 	VDESC_NO_OFFSET,
   1236       1.94  riastrad 	VOPARG_OFFSETOF(struct vop_link_v2_args, a_cnp),
   1237        1.1       cgd };
   1238       1.23   thorpej int
   1239       1.60   thorpej VOP_LINK(struct vnode *dvp,
   1240       1.60   thorpej     struct vnode *vp,
   1241       1.60   thorpej     struct componentname *cnp)
   1242       1.23   thorpej {
   1243       1.72        ad 	int error;
   1244       1.72        ad 	bool mpsafe;
   1245       1.94  riastrad 	struct vop_link_v2_args a;
   1246      1.105   hannken 	struct mount *mp;
   1247       1.23   thorpej 	a.a_desc = VDESC(vop_link);
   1248       1.23   thorpej 	a.a_dvp = dvp;
   1249       1.81     pooka 	a.a_vp = vp;
   1250       1.23   thorpej 	a.a_cnp = cnp;
   1251      1.116   hannken 	assert_vop_elocked(dvp, "vop_link: dvp");
   1252      1.116   hannken 	assert_vop_unlocked(vp, "vop_link: vp");
   1253      1.105   hannken 	error = vop_pre(dvp, &mp, &mpsafe, FST_NO);
   1254      1.105   hannken 	if (error)
   1255      1.105   hannken 		return error;
   1256       1.72        ad 	error = (VCALL(dvp, VOFFSET(vop_link), &a));
   1257      1.105   hannken 	vop_post(dvp, mp, mpsafe, FST_NO);
   1258      1.115   thorpej 	vop_link_post(&a, error);
   1259       1.72        ad 	return error;
   1260       1.23   thorpej }
   1261        1.1       cgd 
   1262       1.31  jdolecek const int vop_rename_vp_offsets[] = {
   1263        1.1       cgd 	VOPARG_OFFSETOF(struct vop_rename_args,a_fdvp),
   1264        1.1       cgd 	VOPARG_OFFSETOF(struct vop_rename_args,a_fvp),
   1265        1.1       cgd 	VOPARG_OFFSETOF(struct vop_rename_args,a_tdvp),
   1266        1.1       cgd 	VOPARG_OFFSETOF(struct vop_rename_args,a_tvp),
   1267        1.1       cgd 	VDESC_NO_OFFSET
   1268        1.1       cgd };
   1269       1.33  jdolecek const struct vnodeop_desc vop_rename_desc = {
   1270       1.67     pooka 	VOP_RENAME_DESCOFFSET,
   1271        1.1       cgd 	"vop_rename",
   1272       1.42  jdolecek 	0 | VDESC_VP0_WILLRELE | VDESC_VP1_WILLRELE | VDESC_VP2_WILLPUT | VDESC_VP3_WILLPUT,
   1273        1.1       cgd 	vop_rename_vp_offsets,
   1274        1.1       cgd 	VDESC_NO_OFFSET,
   1275        1.1       cgd 	VDESC_NO_OFFSET,
   1276        1.1       cgd 	VOPARG_OFFSETOF(struct vop_rename_args, a_fcnp),
   1277        1.1       cgd };
   1278       1.23   thorpej int
   1279       1.60   thorpej VOP_RENAME(struct vnode *fdvp,
   1280       1.60   thorpej     struct vnode *fvp,
   1281       1.60   thorpej     struct componentname *fcnp,
   1282       1.60   thorpej     struct vnode *tdvp,
   1283       1.60   thorpej     struct vnode *tvp,
   1284       1.60   thorpej     struct componentname *tcnp)
   1285       1.23   thorpej {
   1286       1.72        ad 	int error;
   1287       1.72        ad 	bool mpsafe;
   1288       1.23   thorpej 	struct vop_rename_args a;
   1289      1.105   hannken 	struct mount *mp;
   1290       1.23   thorpej 	a.a_desc = VDESC(vop_rename);
   1291       1.23   thorpej 	a.a_fdvp = fdvp;
   1292       1.23   thorpej 	a.a_fvp = fvp;
   1293       1.23   thorpej 	a.a_fcnp = fcnp;
   1294       1.23   thorpej 	a.a_tdvp = tdvp;
   1295       1.23   thorpej 	a.a_tvp = tvp;
   1296       1.23   thorpej 	a.a_tcnp = tcnp;
   1297      1.116   hannken 	assert_vop_locked(tdvp, "vop_rename: tdvp");
   1298      1.105   hannken 	error = vop_pre(fdvp, &mp, &mpsafe, FST_YES);
   1299      1.105   hannken 	if (error)
   1300      1.105   hannken 		return error;
   1301       1.72        ad 	error = (VCALL(fdvp, VOFFSET(vop_rename), &a));
   1302      1.105   hannken 	vop_post(fdvp, mp, mpsafe, FST_YES);
   1303       1.72        ad 	return error;
   1304       1.23   thorpej }
   1305        1.1       cgd 
   1306       1.31  jdolecek const int vop_mkdir_vp_offsets[] = {
   1307       1.91   hannken 	VOPARG_OFFSETOF(struct vop_mkdir_v3_args,a_dvp),
   1308        1.1       cgd 	VDESC_NO_OFFSET
   1309        1.1       cgd };
   1310       1.33  jdolecek const struct vnodeop_desc vop_mkdir_desc = {
   1311       1.67     pooka 	VOP_MKDIR_DESCOFFSET,
   1312        1.1       cgd 	"vop_mkdir",
   1313       1.90   hannken 	0,
   1314        1.1       cgd 	vop_mkdir_vp_offsets,
   1315       1.91   hannken 	VOPARG_OFFSETOF(struct vop_mkdir_v3_args, a_vpp),
   1316        1.1       cgd 	VDESC_NO_OFFSET,
   1317       1.91   hannken 	VOPARG_OFFSETOF(struct vop_mkdir_v3_args, a_cnp),
   1318        1.1       cgd };
   1319       1.23   thorpej int
   1320       1.60   thorpej VOP_MKDIR(struct vnode *dvp,
   1321       1.60   thorpej     struct vnode **vpp,
   1322       1.60   thorpej     struct componentname *cnp,
   1323       1.60   thorpej     struct vattr *vap)
   1324       1.23   thorpej {
   1325       1.72        ad 	int error;
   1326       1.72        ad 	bool mpsafe;
   1327       1.91   hannken 	struct vop_mkdir_v3_args a;
   1328      1.105   hannken 	struct mount *mp;
   1329       1.23   thorpej 	a.a_desc = VDESC(vop_mkdir);
   1330       1.23   thorpej 	a.a_dvp = dvp;
   1331       1.23   thorpej 	a.a_vpp = vpp;
   1332       1.23   thorpej 	a.a_cnp = cnp;
   1333       1.23   thorpej 	a.a_vap = vap;
   1334      1.116   hannken 	assert_vop_elocked(dvp, "vop_mkdir: dvp");
   1335      1.105   hannken 	error = vop_pre(dvp, &mp, &mpsafe, FST_NO);
   1336      1.105   hannken 	if (error)
   1337      1.105   hannken 		return error;
   1338       1.72        ad 	error = (VCALL(dvp, VOFFSET(vop_mkdir), &a));
   1339      1.105   hannken 	vop_post(dvp, mp, mpsafe, FST_NO);
   1340      1.115   thorpej 	vop_mkdir_post(&a, error);
   1341       1.69     pooka #ifdef DIAGNOSTIC
   1342       1.72        ad 	if (error == 0)
   1343       1.69     pooka 		KASSERT((*vpp)->v_size != VSIZENOTSET
   1344       1.69     pooka 		    && (*vpp)->v_writesize != VSIZENOTSET);
   1345       1.69     pooka #endif /* DIAGNOSTIC */
   1346       1.72        ad 	return error;
   1347       1.23   thorpej }
   1348        1.1       cgd 
   1349       1.31  jdolecek const int vop_rmdir_vp_offsets[] = {
   1350      1.103  riastrad 	VOPARG_OFFSETOF(struct vop_rmdir_v2_args,a_dvp),
   1351      1.103  riastrad 	VOPARG_OFFSETOF(struct vop_rmdir_v2_args,a_vp),
   1352        1.1       cgd 	VDESC_NO_OFFSET
   1353        1.1       cgd };
   1354       1.33  jdolecek const struct vnodeop_desc vop_rmdir_desc = {
   1355       1.67     pooka 	VOP_RMDIR_DESCOFFSET,
   1356        1.1       cgd 	"vop_rmdir",
   1357      1.103  riastrad 	0 | VDESC_VP1_WILLPUT,
   1358        1.1       cgd 	vop_rmdir_vp_offsets,
   1359        1.1       cgd 	VDESC_NO_OFFSET,
   1360        1.1       cgd 	VDESC_NO_OFFSET,
   1361      1.103  riastrad 	VOPARG_OFFSETOF(struct vop_rmdir_v2_args, a_cnp),
   1362        1.1       cgd };
   1363       1.23   thorpej int
   1364       1.60   thorpej VOP_RMDIR(struct vnode *dvp,
   1365       1.60   thorpej     struct vnode *vp,
   1366       1.60   thorpej     struct componentname *cnp)
   1367       1.23   thorpej {
   1368       1.72        ad 	int error;
   1369       1.72        ad 	bool mpsafe;
   1370      1.103  riastrad 	struct vop_rmdir_v2_args a;
   1371      1.105   hannken 	struct mount *mp;
   1372       1.23   thorpej 	a.a_desc = VDESC(vop_rmdir);
   1373       1.23   thorpej 	a.a_dvp = dvp;
   1374       1.81     pooka 	a.a_vp = vp;
   1375       1.23   thorpej 	a.a_cnp = cnp;
   1376      1.116   hannken 	assert_vop_elocked(dvp, "vop_rmdir: dvp");
   1377      1.116   hannken 	assert_vop_elocked(vp, "vop_rmdir: vp");
   1378      1.115   thorpej 	vop_rmdir_pre(&a);
   1379      1.105   hannken 	error = vop_pre(dvp, &mp, &mpsafe, FST_NO);
   1380      1.105   hannken 	if (error)
   1381      1.105   hannken 		return error;
   1382       1.72        ad 	error = (VCALL(dvp, VOFFSET(vop_rmdir), &a));
   1383      1.105   hannken 	vop_post(dvp, mp, mpsafe, FST_NO);
   1384      1.115   thorpej 	vop_rmdir_post(&a, error);
   1385       1.72        ad 	return error;
   1386       1.23   thorpej }
   1387        1.1       cgd 
   1388       1.31  jdolecek const int vop_symlink_vp_offsets[] = {
   1389       1.91   hannken 	VOPARG_OFFSETOF(struct vop_symlink_v3_args,a_dvp),
   1390        1.1       cgd 	VDESC_NO_OFFSET
   1391        1.1       cgd };
   1392       1.33  jdolecek const struct vnodeop_desc vop_symlink_desc = {
   1393       1.67     pooka 	VOP_SYMLINK_DESCOFFSET,
   1394        1.1       cgd 	"vop_symlink",
   1395       1.90   hannken 	0,
   1396        1.1       cgd 	vop_symlink_vp_offsets,
   1397       1.91   hannken 	VOPARG_OFFSETOF(struct vop_symlink_v3_args, a_vpp),
   1398        1.1       cgd 	VDESC_NO_OFFSET,
   1399       1.91   hannken 	VOPARG_OFFSETOF(struct vop_symlink_v3_args, a_cnp),
   1400        1.1       cgd };
   1401       1.23   thorpej int
   1402       1.60   thorpej VOP_SYMLINK(struct vnode *dvp,
   1403       1.60   thorpej     struct vnode **vpp,
   1404       1.60   thorpej     struct componentname *cnp,
   1405       1.60   thorpej     struct vattr *vap,
   1406       1.60   thorpej     char *target)
   1407       1.23   thorpej {
   1408       1.72        ad 	int error;
   1409       1.72        ad 	bool mpsafe;
   1410       1.91   hannken 	struct vop_symlink_v3_args a;
   1411      1.105   hannken 	struct mount *mp;
   1412       1.23   thorpej 	a.a_desc = VDESC(vop_symlink);
   1413       1.23   thorpej 	a.a_dvp = dvp;
   1414       1.23   thorpej 	a.a_vpp = vpp;
   1415       1.23   thorpej 	a.a_cnp = cnp;
   1416       1.23   thorpej 	a.a_vap = vap;
   1417       1.23   thorpej 	a.a_target = target;
   1418      1.116   hannken 	assert_vop_elocked(dvp, "vop_symlink: dvp");
   1419      1.105   hannken 	error = vop_pre(dvp, &mp, &mpsafe, FST_NO);
   1420      1.105   hannken 	if (error)
   1421      1.105   hannken 		return error;
   1422       1.72        ad 	error = (VCALL(dvp, VOFFSET(vop_symlink), &a));
   1423      1.105   hannken 	vop_post(dvp, mp, mpsafe, FST_NO);
   1424      1.115   thorpej 	vop_symlink_post(&a, error);
   1425       1.69     pooka #ifdef DIAGNOSTIC
   1426       1.72        ad 	if (error == 0)
   1427       1.69     pooka 		KASSERT((*vpp)->v_size != VSIZENOTSET
   1428       1.69     pooka 		    && (*vpp)->v_writesize != VSIZENOTSET);
   1429       1.69     pooka #endif /* DIAGNOSTIC */
   1430       1.72        ad 	return error;
   1431       1.23   thorpej }
   1432        1.1       cgd 
   1433       1.31  jdolecek const int vop_readdir_vp_offsets[] = {
   1434        1.1       cgd 	VOPARG_OFFSETOF(struct vop_readdir_args,a_vp),
   1435        1.1       cgd 	VDESC_NO_OFFSET
   1436        1.1       cgd };
   1437       1.33  jdolecek const struct vnodeop_desc vop_readdir_desc = {
   1438       1.67     pooka 	VOP_READDIR_DESCOFFSET,
   1439        1.1       cgd 	"vop_readdir",
   1440        1.1       cgd 	0,
   1441        1.1       cgd 	vop_readdir_vp_offsets,
   1442        1.1       cgd 	VDESC_NO_OFFSET,
   1443        1.1       cgd 	VOPARG_OFFSETOF(struct vop_readdir_args, a_cred),
   1444        1.1       cgd 	VDESC_NO_OFFSET,
   1445        1.1       cgd };
   1446       1.23   thorpej int
   1447       1.60   thorpej VOP_READDIR(struct vnode *vp,
   1448       1.60   thorpej     struct uio *uio,
   1449       1.65      elad     kauth_cred_t cred,
   1450       1.60   thorpej     int *eofflag,
   1451       1.60   thorpej     off_t **cookies,
   1452       1.60   thorpej     int *ncookies)
   1453       1.23   thorpej {
   1454       1.72        ad 	int error;
   1455       1.72        ad 	bool mpsafe;
   1456       1.23   thorpej 	struct vop_readdir_args a;
   1457      1.105   hannken 	struct mount *mp;
   1458       1.23   thorpej 	a.a_desc = VDESC(vop_readdir);
   1459       1.23   thorpej 	a.a_vp = vp;
   1460       1.23   thorpej 	a.a_uio = uio;
   1461       1.23   thorpej 	a.a_cred = cred;
   1462       1.23   thorpej 	a.a_eofflag = eofflag;
   1463       1.23   thorpej 	a.a_cookies = cookies;
   1464       1.23   thorpej 	a.a_ncookies = ncookies;
   1465      1.116   hannken 	assert_vop_locked(vp, "vop_readdir: vp");
   1466      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1467      1.105   hannken 	if (error)
   1468      1.105   hannken 		return error;
   1469       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_readdir), &a));
   1470      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1471       1.72        ad 	return error;
   1472       1.23   thorpej }
   1473        1.1       cgd 
   1474       1.31  jdolecek const int vop_readlink_vp_offsets[] = {
   1475        1.1       cgd 	VOPARG_OFFSETOF(struct vop_readlink_args,a_vp),
   1476        1.1       cgd 	VDESC_NO_OFFSET
   1477        1.1       cgd };
   1478       1.33  jdolecek const struct vnodeop_desc vop_readlink_desc = {
   1479       1.67     pooka 	VOP_READLINK_DESCOFFSET,
   1480        1.1       cgd 	"vop_readlink",
   1481        1.1       cgd 	0,
   1482        1.1       cgd 	vop_readlink_vp_offsets,
   1483        1.1       cgd 	VDESC_NO_OFFSET,
   1484        1.1       cgd 	VOPARG_OFFSETOF(struct vop_readlink_args, a_cred),
   1485        1.1       cgd 	VDESC_NO_OFFSET,
   1486        1.1       cgd };
   1487       1.23   thorpej int
   1488       1.60   thorpej VOP_READLINK(struct vnode *vp,
   1489       1.60   thorpej     struct uio *uio,
   1490       1.65      elad     kauth_cred_t cred)
   1491       1.23   thorpej {
   1492       1.72        ad 	int error;
   1493       1.72        ad 	bool mpsafe;
   1494       1.23   thorpej 	struct vop_readlink_args a;
   1495      1.105   hannken 	struct mount *mp;
   1496       1.23   thorpej 	a.a_desc = VDESC(vop_readlink);
   1497       1.23   thorpej 	a.a_vp = vp;
   1498       1.23   thorpej 	a.a_uio = uio;
   1499       1.23   thorpej 	a.a_cred = cred;
   1500      1.116   hannken 	assert_vop_locked(vp, "vop_readlink: vp");
   1501      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1502      1.105   hannken 	if (error)
   1503      1.105   hannken 		return error;
   1504       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_readlink), &a));
   1505      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1506       1.72        ad 	return error;
   1507       1.23   thorpej }
   1508        1.1       cgd 
   1509       1.31  jdolecek const int vop_abortop_vp_offsets[] = {
   1510        1.1       cgd 	VOPARG_OFFSETOF(struct vop_abortop_args,a_dvp),
   1511        1.1       cgd 	VDESC_NO_OFFSET
   1512        1.1       cgd };
   1513       1.33  jdolecek const struct vnodeop_desc vop_abortop_desc = {
   1514       1.67     pooka 	VOP_ABORTOP_DESCOFFSET,
   1515        1.1       cgd 	"vop_abortop",
   1516        1.1       cgd 	0,
   1517        1.1       cgd 	vop_abortop_vp_offsets,
   1518        1.1       cgd 	VDESC_NO_OFFSET,
   1519        1.1       cgd 	VDESC_NO_OFFSET,
   1520        1.1       cgd 	VOPARG_OFFSETOF(struct vop_abortop_args, a_cnp),
   1521        1.1       cgd };
   1522       1.23   thorpej int
   1523       1.60   thorpej VOP_ABORTOP(struct vnode *dvp,
   1524       1.60   thorpej     struct componentname *cnp)
   1525       1.23   thorpej {
   1526       1.72        ad 	int error;
   1527       1.72        ad 	bool mpsafe;
   1528       1.23   thorpej 	struct vop_abortop_args a;
   1529      1.105   hannken 	struct mount *mp;
   1530       1.23   thorpej 	a.a_desc = VDESC(vop_abortop);
   1531       1.23   thorpej 	a.a_dvp = dvp;
   1532       1.23   thorpej 	a.a_cnp = cnp;
   1533      1.105   hannken 	error = vop_pre(dvp, &mp, &mpsafe, FST_YES);
   1534      1.105   hannken 	if (error)
   1535      1.105   hannken 		return error;
   1536       1.72        ad 	error = (VCALL(dvp, VOFFSET(vop_abortop), &a));
   1537      1.105   hannken 	vop_post(dvp, mp, mpsafe, FST_YES);
   1538       1.72        ad 	return error;
   1539       1.23   thorpej }
   1540        1.1       cgd 
   1541       1.31  jdolecek const int vop_inactive_vp_offsets[] = {
   1542       1.98  riastrad 	VOPARG_OFFSETOF(struct vop_inactive_v2_args,a_vp),
   1543        1.1       cgd 	VDESC_NO_OFFSET
   1544        1.1       cgd };
   1545       1.33  jdolecek const struct vnodeop_desc vop_inactive_desc = {
   1546       1.67     pooka 	VOP_INACTIVE_DESCOFFSET,
   1547        1.1       cgd 	"vop_inactive",
   1548       1.98  riastrad 	0,
   1549        1.1       cgd 	vop_inactive_vp_offsets,
   1550        1.1       cgd 	VDESC_NO_OFFSET,
   1551        1.1       cgd 	VDESC_NO_OFFSET,
   1552        1.1       cgd 	VDESC_NO_OFFSET,
   1553        1.1       cgd };
   1554       1.23   thorpej int
   1555       1.75        ad VOP_INACTIVE(struct vnode *vp,
   1556       1.75        ad     bool *recycle)
   1557       1.23   thorpej {
   1558       1.72        ad 	int error;
   1559       1.72        ad 	bool mpsafe;
   1560       1.98  riastrad 	struct vop_inactive_v2_args a;
   1561      1.105   hannken 	struct mount *mp;
   1562       1.23   thorpej 	a.a_desc = VDESC(vop_inactive);
   1563       1.23   thorpej 	a.a_vp = vp;
   1564       1.75        ad 	a.a_recycle = recycle;
   1565      1.116   hannken 	assert_vop_elocked(vp, "vop_inactive: vp");
   1566      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1567      1.105   hannken 	if (error)
   1568      1.105   hannken 		return error;
   1569       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_inactive), &a));
   1570      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1571       1.72        ad 	return error;
   1572       1.23   thorpej }
   1573        1.1       cgd 
   1574       1.31  jdolecek const int vop_reclaim_vp_offsets[] = {
   1575      1.104  riastrad 	VOPARG_OFFSETOF(struct vop_reclaim_v2_args,a_vp),
   1576        1.1       cgd 	VDESC_NO_OFFSET
   1577        1.1       cgd };
   1578       1.33  jdolecek const struct vnodeop_desc vop_reclaim_desc = {
   1579       1.67     pooka 	VOP_RECLAIM_DESCOFFSET,
   1580        1.1       cgd 	"vop_reclaim",
   1581        1.1       cgd 	0,
   1582        1.1       cgd 	vop_reclaim_vp_offsets,
   1583        1.1       cgd 	VDESC_NO_OFFSET,
   1584        1.1       cgd 	VDESC_NO_OFFSET,
   1585        1.1       cgd 	VDESC_NO_OFFSET,
   1586        1.1       cgd };
   1587       1.23   thorpej int
   1588       1.73     pooka VOP_RECLAIM(struct vnode *vp)
   1589       1.23   thorpej {
   1590       1.72        ad 	int error;
   1591       1.72        ad 	bool mpsafe;
   1592      1.104  riastrad 	struct vop_reclaim_v2_args a;
   1593      1.105   hannken 	struct mount *mp;
   1594       1.23   thorpej 	a.a_desc = VDESC(vop_reclaim);
   1595       1.23   thorpej 	a.a_vp = vp;
   1596      1.116   hannken 	assert_vop_elocked(vp, "vop_reclaim: vp");
   1597      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1598      1.105   hannken 	if (error)
   1599      1.105   hannken 		return error;
   1600       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_reclaim), &a));
   1601      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1602       1.72        ad 	return error;
   1603       1.23   thorpej }
   1604        1.1       cgd 
   1605       1.31  jdolecek const int vop_lock_vp_offsets[] = {
   1606        1.1       cgd 	VOPARG_OFFSETOF(struct vop_lock_args,a_vp),
   1607        1.1       cgd 	VDESC_NO_OFFSET
   1608        1.1       cgd };
   1609       1.33  jdolecek const struct vnodeop_desc vop_lock_desc = {
   1610       1.67     pooka 	VOP_LOCK_DESCOFFSET,
   1611        1.1       cgd 	"vop_lock",
   1612        1.1       cgd 	0,
   1613        1.1       cgd 	vop_lock_vp_offsets,
   1614        1.1       cgd 	VDESC_NO_OFFSET,
   1615        1.1       cgd 	VDESC_NO_OFFSET,
   1616        1.1       cgd 	VDESC_NO_OFFSET,
   1617        1.1       cgd };
   1618       1.23   thorpej int
   1619       1.60   thorpej VOP_LOCK(struct vnode *vp,
   1620       1.60   thorpej     int flags)
   1621       1.23   thorpej {
   1622       1.72        ad 	int error;
   1623       1.72        ad 	bool mpsafe;
   1624       1.23   thorpej 	struct vop_lock_args a;
   1625      1.105   hannken 	struct mount *mp;
   1626       1.23   thorpej 	a.a_desc = VDESC(vop_lock);
   1627       1.23   thorpej 	a.a_vp = vp;
   1628       1.23   thorpej 	a.a_flags = flags;
   1629      1.110        ad 	error = vop_pre(vp, &mp, &mpsafe, (!(flags & (LK_SHARED|LK_EXCLUSIVE)) ? FST_NO : (flags & LK_NOWAIT ? FST_TRY : FST_YES)));
   1630      1.105   hannken 	if (error)
   1631      1.105   hannken 		return error;
   1632       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_lock), &a));
   1633      1.109        ad 	vop_post(vp, mp, mpsafe, (flags & (LK_UPGRADE|LK_DOWNGRADE) ? FST_NO : (error ? FST_YES : FST_NO)));
   1634       1.72        ad 	return error;
   1635       1.23   thorpej }
   1636        1.1       cgd 
   1637       1.31  jdolecek const int vop_unlock_vp_offsets[] = {
   1638        1.1       cgd 	VOPARG_OFFSETOF(struct vop_unlock_args,a_vp),
   1639        1.1       cgd 	VDESC_NO_OFFSET
   1640        1.1       cgd };
   1641       1.33  jdolecek const struct vnodeop_desc vop_unlock_desc = {
   1642       1.67     pooka 	VOP_UNLOCK_DESCOFFSET,
   1643        1.1       cgd 	"vop_unlock",
   1644        1.1       cgd 	0,
   1645        1.1       cgd 	vop_unlock_vp_offsets,
   1646        1.1       cgd 	VDESC_NO_OFFSET,
   1647        1.1       cgd 	VDESC_NO_OFFSET,
   1648        1.1       cgd 	VDESC_NO_OFFSET,
   1649        1.1       cgd };
   1650       1.23   thorpej int
   1651       1.85   hannken VOP_UNLOCK(struct vnode *vp)
   1652       1.23   thorpej {
   1653       1.72        ad 	int error;
   1654       1.72        ad 	bool mpsafe;
   1655       1.23   thorpej 	struct vop_unlock_args a;
   1656      1.105   hannken 	struct mount *mp;
   1657       1.23   thorpej 	a.a_desc = VDESC(vop_unlock);
   1658       1.23   thorpej 	a.a_vp = vp;
   1659      1.116   hannken 	assert_vop_locked(vp, "vop_unlock: vp");
   1660      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1661      1.105   hannken 	if (error)
   1662      1.105   hannken 		return error;
   1663       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_unlock), &a));
   1664      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_YES);
   1665       1.72        ad 	return error;
   1666       1.23   thorpej }
   1667        1.1       cgd 
   1668       1.31  jdolecek const int vop_bmap_vp_offsets[] = {
   1669        1.1       cgd 	VOPARG_OFFSETOF(struct vop_bmap_args,a_vp),
   1670        1.1       cgd 	VDESC_NO_OFFSET
   1671        1.1       cgd };
   1672       1.33  jdolecek const struct vnodeop_desc vop_bmap_desc = {
   1673       1.67     pooka 	VOP_BMAP_DESCOFFSET,
   1674        1.1       cgd 	"vop_bmap",
   1675        1.1       cgd 	0,
   1676        1.1       cgd 	vop_bmap_vp_offsets,
   1677        1.1       cgd 	VOPARG_OFFSETOF(struct vop_bmap_args, a_vpp),
   1678        1.1       cgd 	VDESC_NO_OFFSET,
   1679        1.1       cgd 	VDESC_NO_OFFSET,
   1680        1.1       cgd };
   1681       1.23   thorpej int
   1682       1.60   thorpej VOP_BMAP(struct vnode *vp,
   1683       1.60   thorpej     daddr_t bn,
   1684       1.60   thorpej     struct vnode **vpp,
   1685       1.60   thorpej     daddr_t *bnp,
   1686       1.60   thorpej     int *runp)
   1687       1.23   thorpej {
   1688       1.72        ad 	int error;
   1689       1.72        ad 	bool mpsafe;
   1690       1.23   thorpej 	struct vop_bmap_args a;
   1691      1.105   hannken 	struct mount *mp;
   1692       1.23   thorpej 	a.a_desc = VDESC(vop_bmap);
   1693       1.23   thorpej 	a.a_vp = vp;
   1694       1.23   thorpej 	a.a_bn = bn;
   1695       1.23   thorpej 	a.a_vpp = vpp;
   1696       1.23   thorpej 	a.a_bnp = bnp;
   1697       1.23   thorpej 	a.a_runp = runp;
   1698      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_YES);
   1699      1.105   hannken 	if (error)
   1700      1.105   hannken 		return error;
   1701       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_bmap), &a));
   1702      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_YES);
   1703       1.72        ad 	return error;
   1704       1.23   thorpej }
   1705        1.1       cgd 
   1706       1.46   hannken const int vop_strategy_vp_offsets[] = {
   1707       1.46   hannken 	VOPARG_OFFSETOF(struct vop_strategy_args,a_vp),
   1708       1.46   hannken 	VDESC_NO_OFFSET
   1709       1.46   hannken };
   1710       1.46   hannken const struct vnodeop_desc vop_strategy_desc = {
   1711       1.67     pooka 	VOP_STRATEGY_DESCOFFSET,
   1712       1.46   hannken 	"vop_strategy",
   1713       1.46   hannken 	0,
   1714       1.46   hannken 	vop_strategy_vp_offsets,
   1715       1.46   hannken 	VDESC_NO_OFFSET,
   1716       1.46   hannken 	VDESC_NO_OFFSET,
   1717       1.46   hannken 	VDESC_NO_OFFSET,
   1718       1.46   hannken };
   1719       1.46   hannken int
   1720       1.60   thorpej VOP_STRATEGY(struct vnode *vp,
   1721       1.60   thorpej     struct buf *bp)
   1722       1.46   hannken {
   1723       1.72        ad 	int error;
   1724       1.72        ad 	bool mpsafe;
   1725       1.46   hannken 	struct vop_strategy_args a;
   1726      1.105   hannken 	struct mount *mp;
   1727       1.46   hannken 	a.a_desc = VDESC(vop_strategy);
   1728       1.46   hannken 	a.a_vp = vp;
   1729       1.46   hannken 	a.a_bp = bp;
   1730      1.112   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1731      1.105   hannken 	if (error)
   1732      1.105   hannken 		return error;
   1733       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_strategy), &a));
   1734      1.112   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1735       1.72        ad 	return error;
   1736       1.46   hannken }
   1737       1.46   hannken 
   1738       1.31  jdolecek const int vop_print_vp_offsets[] = {
   1739        1.1       cgd 	VOPARG_OFFSETOF(struct vop_print_args,a_vp),
   1740        1.1       cgd 	VDESC_NO_OFFSET
   1741        1.1       cgd };
   1742       1.33  jdolecek const struct vnodeop_desc vop_print_desc = {
   1743       1.67     pooka 	VOP_PRINT_DESCOFFSET,
   1744        1.1       cgd 	"vop_print",
   1745        1.1       cgd 	0,
   1746        1.1       cgd 	vop_print_vp_offsets,
   1747        1.1       cgd 	VDESC_NO_OFFSET,
   1748        1.1       cgd 	VDESC_NO_OFFSET,
   1749        1.1       cgd 	VDESC_NO_OFFSET,
   1750        1.1       cgd };
   1751       1.23   thorpej int
   1752       1.60   thorpej VOP_PRINT(struct vnode *vp)
   1753       1.23   thorpej {
   1754       1.72        ad 	int error;
   1755       1.72        ad 	bool mpsafe;
   1756       1.23   thorpej 	struct vop_print_args a;
   1757      1.105   hannken 	struct mount *mp;
   1758       1.23   thorpej 	a.a_desc = VDESC(vop_print);
   1759       1.23   thorpej 	a.a_vp = vp;
   1760      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_YES);
   1761      1.105   hannken 	if (error)
   1762      1.105   hannken 		return error;
   1763       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_print), &a));
   1764      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_YES);
   1765       1.72        ad 	return error;
   1766       1.23   thorpej }
   1767        1.1       cgd 
   1768       1.31  jdolecek const int vop_islocked_vp_offsets[] = {
   1769        1.1       cgd 	VOPARG_OFFSETOF(struct vop_islocked_args,a_vp),
   1770        1.1       cgd 	VDESC_NO_OFFSET
   1771        1.1       cgd };
   1772       1.33  jdolecek const struct vnodeop_desc vop_islocked_desc = {
   1773       1.67     pooka 	VOP_ISLOCKED_DESCOFFSET,
   1774        1.1       cgd 	"vop_islocked",
   1775        1.1       cgd 	0,
   1776        1.1       cgd 	vop_islocked_vp_offsets,
   1777        1.1       cgd 	VDESC_NO_OFFSET,
   1778        1.1       cgd 	VDESC_NO_OFFSET,
   1779        1.1       cgd 	VDESC_NO_OFFSET,
   1780        1.1       cgd };
   1781       1.23   thorpej int
   1782       1.60   thorpej VOP_ISLOCKED(struct vnode *vp)
   1783       1.23   thorpej {
   1784       1.72        ad 	int error;
   1785       1.72        ad 	bool mpsafe;
   1786       1.23   thorpej 	struct vop_islocked_args a;
   1787      1.105   hannken 	struct mount *mp;
   1788       1.23   thorpej 	a.a_desc = VDESC(vop_islocked);
   1789       1.23   thorpej 	a.a_vp = vp;
   1790      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1791      1.105   hannken 	if (error)
   1792      1.105   hannken 		return error;
   1793       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_islocked), &a));
   1794      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1795       1.72        ad 	return error;
   1796       1.23   thorpej }
   1797        1.1       cgd 
   1798       1.31  jdolecek const int vop_pathconf_vp_offsets[] = {
   1799        1.1       cgd 	VOPARG_OFFSETOF(struct vop_pathconf_args,a_vp),
   1800        1.1       cgd 	VDESC_NO_OFFSET
   1801        1.1       cgd };
   1802       1.33  jdolecek const struct vnodeop_desc vop_pathconf_desc = {
   1803       1.67     pooka 	VOP_PATHCONF_DESCOFFSET,
   1804        1.1       cgd 	"vop_pathconf",
   1805        1.1       cgd 	0,
   1806        1.1       cgd 	vop_pathconf_vp_offsets,
   1807        1.1       cgd 	VDESC_NO_OFFSET,
   1808        1.1       cgd 	VDESC_NO_OFFSET,
   1809        1.1       cgd 	VDESC_NO_OFFSET,
   1810        1.1       cgd };
   1811       1.23   thorpej int
   1812       1.60   thorpej VOP_PATHCONF(struct vnode *vp,
   1813       1.60   thorpej     int name,
   1814       1.60   thorpej     register_t *retval)
   1815       1.23   thorpej {
   1816       1.72        ad 	int error;
   1817       1.72        ad 	bool mpsafe;
   1818       1.23   thorpej 	struct vop_pathconf_args a;
   1819      1.105   hannken 	struct mount *mp;
   1820       1.23   thorpej 	a.a_desc = VDESC(vop_pathconf);
   1821       1.23   thorpej 	a.a_vp = vp;
   1822       1.23   thorpej 	a.a_name = name;
   1823       1.23   thorpej 	a.a_retval = retval;
   1824      1.116   hannken 	assert_vop_locked(vp, "vop_pathconf: vp");
   1825      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1826      1.105   hannken 	if (error)
   1827      1.105   hannken 		return error;
   1828       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_pathconf), &a));
   1829      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1830       1.72        ad 	return error;
   1831       1.23   thorpej }
   1832        1.1       cgd 
   1833       1.31  jdolecek const int vop_advlock_vp_offsets[] = {
   1834        1.1       cgd 	VOPARG_OFFSETOF(struct vop_advlock_args,a_vp),
   1835        1.1       cgd 	VDESC_NO_OFFSET
   1836        1.1       cgd };
   1837       1.33  jdolecek const struct vnodeop_desc vop_advlock_desc = {
   1838       1.67     pooka 	VOP_ADVLOCK_DESCOFFSET,
   1839        1.1       cgd 	"vop_advlock",
   1840        1.1       cgd 	0,
   1841        1.1       cgd 	vop_advlock_vp_offsets,
   1842        1.1       cgd 	VDESC_NO_OFFSET,
   1843        1.1       cgd 	VDESC_NO_OFFSET,
   1844        1.1       cgd 	VDESC_NO_OFFSET,
   1845        1.1       cgd };
   1846       1.23   thorpej int
   1847       1.60   thorpej VOP_ADVLOCK(struct vnode *vp,
   1848       1.60   thorpej     void *id,
   1849       1.60   thorpej     int op,
   1850       1.60   thorpej     struct flock *fl,
   1851       1.60   thorpej     int flags)
   1852       1.23   thorpej {
   1853       1.72        ad 	int error;
   1854       1.72        ad 	bool mpsafe;
   1855       1.23   thorpej 	struct vop_advlock_args a;
   1856      1.105   hannken 	struct mount *mp;
   1857       1.23   thorpej 	a.a_desc = VDESC(vop_advlock);
   1858       1.23   thorpej 	a.a_vp = vp;
   1859       1.23   thorpej 	a.a_id = id;
   1860       1.23   thorpej 	a.a_op = op;
   1861       1.23   thorpej 	a.a_fl = fl;
   1862       1.23   thorpej 	a.a_flags = flags;
   1863      1.116   hannken 	assert_vop_unlocked(vp, "vop_advlock: vp");
   1864      1.107   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1865      1.105   hannken 	if (error)
   1866      1.105   hannken 		return error;
   1867       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_advlock), &a));
   1868      1.107   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1869       1.72        ad 	return error;
   1870       1.23   thorpej }
   1871        1.1       cgd 
   1872       1.31  jdolecek const int vop_whiteout_vp_offsets[] = {
   1873        1.1       cgd 	VOPARG_OFFSETOF(struct vop_whiteout_args,a_dvp),
   1874        1.1       cgd 	VDESC_NO_OFFSET
   1875        1.1       cgd };
   1876       1.33  jdolecek const struct vnodeop_desc vop_whiteout_desc = {
   1877       1.67     pooka 	VOP_WHITEOUT_DESCOFFSET,
   1878        1.1       cgd 	"vop_whiteout",
   1879        1.1       cgd 	0,
   1880        1.1       cgd 	vop_whiteout_vp_offsets,
   1881        1.1       cgd 	VDESC_NO_OFFSET,
   1882        1.1       cgd 	VDESC_NO_OFFSET,
   1883        1.1       cgd 	VOPARG_OFFSETOF(struct vop_whiteout_args, a_cnp),
   1884        1.1       cgd };
   1885       1.23   thorpej int
   1886       1.60   thorpej VOP_WHITEOUT(struct vnode *dvp,
   1887       1.60   thorpej     struct componentname *cnp,
   1888       1.60   thorpej     int flags)
   1889       1.23   thorpej {
   1890       1.72        ad 	int error;
   1891       1.72        ad 	bool mpsafe;
   1892       1.23   thorpej 	struct vop_whiteout_args a;
   1893      1.105   hannken 	struct mount *mp;
   1894       1.23   thorpej 	a.a_desc = VDESC(vop_whiteout);
   1895       1.23   thorpej 	a.a_dvp = dvp;
   1896       1.23   thorpej 	a.a_cnp = cnp;
   1897       1.23   thorpej 	a.a_flags = flags;
   1898      1.116   hannken 	assert_vop_elocked(dvp, "vop_whiteout: dvp");
   1899      1.105   hannken 	error = vop_pre(dvp, &mp, &mpsafe, FST_NO);
   1900      1.105   hannken 	if (error)
   1901      1.105   hannken 		return error;
   1902       1.72        ad 	error = (VCALL(dvp, VOFFSET(vop_whiteout), &a));
   1903      1.105   hannken 	vop_post(dvp, mp, mpsafe, FST_NO);
   1904       1.72        ad 	return error;
   1905       1.23   thorpej }
   1906        1.1       cgd 
   1907       1.31  jdolecek const int vop_getpages_vp_offsets[] = {
   1908       1.26       chs 	VOPARG_OFFSETOF(struct vop_getpages_args,a_vp),
   1909       1.26       chs 	VDESC_NO_OFFSET
   1910       1.26       chs };
   1911       1.33  jdolecek const struct vnodeop_desc vop_getpages_desc = {
   1912       1.67     pooka 	VOP_GETPAGES_DESCOFFSET,
   1913       1.26       chs 	"vop_getpages",
   1914       1.26       chs 	0,
   1915       1.26       chs 	vop_getpages_vp_offsets,
   1916       1.26       chs 	VDESC_NO_OFFSET,
   1917       1.26       chs 	VDESC_NO_OFFSET,
   1918       1.26       chs 	VDESC_NO_OFFSET,
   1919       1.26       chs };
   1920       1.26       chs int
   1921       1.60   thorpej VOP_GETPAGES(struct vnode *vp,
   1922       1.60   thorpej     voff_t offset,
   1923       1.60   thorpej     struct vm_page **m,
   1924       1.60   thorpej     int *count,
   1925       1.60   thorpej     int centeridx,
   1926       1.60   thorpej     vm_prot_t access_type,
   1927       1.60   thorpej     int advice,
   1928       1.60   thorpej     int flags)
   1929       1.26       chs {
   1930       1.72        ad 	int error;
   1931       1.72        ad 	bool mpsafe;
   1932       1.26       chs 	struct vop_getpages_args a;
   1933      1.105   hannken 	struct mount *mp;
   1934       1.26       chs 	a.a_desc = VDESC(vop_getpages);
   1935       1.26       chs 	a.a_vp = vp;
   1936       1.26       chs 	a.a_offset = offset;
   1937       1.26       chs 	a.a_m = m;
   1938       1.26       chs 	a.a_count = count;
   1939       1.26       chs 	a.a_centeridx = centeridx;
   1940       1.26       chs 	a.a_access_type = access_type;
   1941       1.26       chs 	a.a_advice = advice;
   1942       1.26       chs 	a.a_flags = flags;
   1943      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1944      1.105   hannken 	if (error)
   1945      1.105   hannken 		return error;
   1946       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_getpages), &a));
   1947      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1948       1.72        ad 	return error;
   1949       1.26       chs }
   1950       1.26       chs 
   1951       1.31  jdolecek const int vop_putpages_vp_offsets[] = {
   1952       1.26       chs 	VOPARG_OFFSETOF(struct vop_putpages_args,a_vp),
   1953       1.26       chs 	VDESC_NO_OFFSET
   1954       1.26       chs };
   1955       1.33  jdolecek const struct vnodeop_desc vop_putpages_desc = {
   1956       1.67     pooka 	VOP_PUTPAGES_DESCOFFSET,
   1957       1.26       chs 	"vop_putpages",
   1958       1.26       chs 	0,
   1959       1.26       chs 	vop_putpages_vp_offsets,
   1960       1.26       chs 	VDESC_NO_OFFSET,
   1961       1.26       chs 	VDESC_NO_OFFSET,
   1962       1.26       chs 	VDESC_NO_OFFSET,
   1963       1.26       chs };
   1964       1.26       chs int
   1965       1.60   thorpej VOP_PUTPAGES(struct vnode *vp,
   1966       1.60   thorpej     voff_t offlo,
   1967       1.60   thorpej     voff_t offhi,
   1968       1.60   thorpej     int flags)
   1969       1.26       chs {
   1970       1.72        ad 	int error;
   1971       1.72        ad 	bool mpsafe;
   1972       1.26       chs 	struct vop_putpages_args a;
   1973      1.105   hannken 	struct mount *mp;
   1974       1.26       chs 	a.a_desc = VDESC(vop_putpages);
   1975       1.26       chs 	a.a_vp = vp;
   1976       1.38       chs 	a.a_offlo = offlo;
   1977       1.38       chs 	a.a_offhi = offhi;
   1978       1.26       chs 	a.a_flags = flags;
   1979      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   1980      1.105   hannken 	if (error)
   1981      1.105   hannken 		return error;
   1982       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_putpages), &a));
   1983      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   1984       1.72        ad 	return error;
   1985       1.26       chs }
   1986       1.26       chs 
   1987      1.111  christos const int vop_getacl_vp_offsets[] = {
   1988      1.111  christos 	VOPARG_OFFSETOF(struct vop_getacl_args,a_vp),
   1989      1.111  christos 	VDESC_NO_OFFSET
   1990      1.111  christos };
   1991      1.111  christos const struct vnodeop_desc vop_getacl_desc = {
   1992      1.111  christos 	VOP_GETACL_DESCOFFSET,
   1993      1.111  christos 	"vop_getacl",
   1994      1.111  christos 	0,
   1995      1.111  christos 	vop_getacl_vp_offsets,
   1996      1.111  christos 	VDESC_NO_OFFSET,
   1997      1.111  christos 	VOPARG_OFFSETOF(struct vop_getacl_args, a_cred),
   1998      1.111  christos 	VDESC_NO_OFFSET,
   1999      1.111  christos };
   2000      1.111  christos int
   2001      1.111  christos VOP_GETACL(struct vnode *vp,
   2002      1.111  christos     acl_type_t type,
   2003      1.111  christos     struct acl *aclp,
   2004      1.111  christos     kauth_cred_t cred)
   2005      1.111  christos {
   2006      1.111  christos 	int error;
   2007      1.111  christos 	bool mpsafe;
   2008      1.111  christos 	struct vop_getacl_args a;
   2009      1.111  christos 	struct mount *mp;
   2010      1.111  christos 	a.a_desc = VDESC(vop_getacl);
   2011      1.111  christos 	a.a_vp = vp;
   2012      1.111  christos 	a.a_type = type;
   2013      1.111  christos 	a.a_aclp = aclp;
   2014      1.111  christos 	a.a_cred = cred;
   2015      1.111  christos 	error = vop_pre(vp, &mp, &mpsafe, FST_YES);
   2016      1.111  christos 	if (error)
   2017      1.111  christos 		return error;
   2018      1.111  christos 	error = (VCALL(vp, VOFFSET(vop_getacl), &a));
   2019      1.111  christos 	vop_post(vp, mp, mpsafe, FST_YES);
   2020      1.111  christos 	return error;
   2021      1.111  christos }
   2022      1.111  christos 
   2023      1.111  christos const int vop_setacl_vp_offsets[] = {
   2024      1.111  christos 	VOPARG_OFFSETOF(struct vop_setacl_args,a_vp),
   2025      1.111  christos 	VDESC_NO_OFFSET
   2026      1.111  christos };
   2027      1.111  christos const struct vnodeop_desc vop_setacl_desc = {
   2028      1.111  christos 	VOP_SETACL_DESCOFFSET,
   2029      1.111  christos 	"vop_setacl",
   2030      1.111  christos 	0,
   2031      1.111  christos 	vop_setacl_vp_offsets,
   2032      1.111  christos 	VDESC_NO_OFFSET,
   2033      1.111  christos 	VOPARG_OFFSETOF(struct vop_setacl_args, a_cred),
   2034      1.111  christos 	VDESC_NO_OFFSET,
   2035      1.111  christos };
   2036      1.111  christos int
   2037      1.111  christos VOP_SETACL(struct vnode *vp,
   2038      1.111  christos     acl_type_t type,
   2039      1.111  christos     struct acl *aclp,
   2040      1.111  christos     kauth_cred_t cred)
   2041      1.111  christos {
   2042      1.111  christos 	int error;
   2043      1.111  christos 	bool mpsafe;
   2044      1.111  christos 	struct vop_setacl_args a;
   2045      1.111  christos 	struct mount *mp;
   2046      1.111  christos 	a.a_desc = VDESC(vop_setacl);
   2047      1.111  christos 	a.a_vp = vp;
   2048      1.111  christos 	a.a_type = type;
   2049      1.111  christos 	a.a_aclp = aclp;
   2050      1.111  christos 	a.a_cred = cred;
   2051      1.116   hannken 	assert_vop_elocked(vp, "vop_setacl: vp");
   2052      1.116   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   2053      1.111  christos 	if (error)
   2054      1.111  christos 		return error;
   2055      1.111  christos 	error = (VCALL(vp, VOFFSET(vop_setacl), &a));
   2056      1.116   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   2057      1.115   thorpej 	vop_setacl_post(&a, error);
   2058      1.111  christos 	return error;
   2059      1.111  christos }
   2060      1.111  christos 
   2061      1.111  christos const int vop_aclcheck_vp_offsets[] = {
   2062      1.111  christos 	VOPARG_OFFSETOF(struct vop_aclcheck_args,a_vp),
   2063      1.111  christos 	VDESC_NO_OFFSET
   2064      1.111  christos };
   2065      1.111  christos const struct vnodeop_desc vop_aclcheck_desc = {
   2066      1.111  christos 	VOP_ACLCHECK_DESCOFFSET,
   2067      1.111  christos 	"vop_aclcheck",
   2068      1.111  christos 	0,
   2069      1.111  christos 	vop_aclcheck_vp_offsets,
   2070      1.111  christos 	VDESC_NO_OFFSET,
   2071      1.111  christos 	VOPARG_OFFSETOF(struct vop_aclcheck_args, a_cred),
   2072      1.111  christos 	VDESC_NO_OFFSET,
   2073      1.111  christos };
   2074      1.111  christos int
   2075      1.111  christos VOP_ACLCHECK(struct vnode *vp,
   2076      1.111  christos     acl_type_t type,
   2077      1.111  christos     struct acl *aclp,
   2078      1.111  christos     kauth_cred_t cred)
   2079      1.111  christos {
   2080      1.111  christos 	int error;
   2081      1.111  christos 	bool mpsafe;
   2082      1.111  christos 	struct vop_aclcheck_args a;
   2083      1.111  christos 	struct mount *mp;
   2084      1.111  christos 	a.a_desc = VDESC(vop_aclcheck);
   2085      1.111  christos 	a.a_vp = vp;
   2086      1.111  christos 	a.a_type = type;
   2087      1.111  christos 	a.a_aclp = aclp;
   2088      1.111  christos 	a.a_cred = cred;
   2089      1.111  christos 	error = vop_pre(vp, &mp, &mpsafe, FST_YES);
   2090      1.111  christos 	if (error)
   2091      1.111  christos 		return error;
   2092      1.111  christos 	error = (VCALL(vp, VOFFSET(vop_aclcheck), &a));
   2093      1.111  christos 	vop_post(vp, mp, mpsafe, FST_YES);
   2094      1.111  christos 	return error;
   2095      1.111  christos }
   2096      1.111  christos 
   2097       1.51   thorpej const int vop_closeextattr_vp_offsets[] = {
   2098       1.51   thorpej 	VOPARG_OFFSETOF(struct vop_closeextattr_args,a_vp),
   2099       1.51   thorpej 	VDESC_NO_OFFSET
   2100       1.51   thorpej };
   2101       1.51   thorpej const struct vnodeop_desc vop_closeextattr_desc = {
   2102       1.67     pooka 	VOP_CLOSEEXTATTR_DESCOFFSET,
   2103       1.51   thorpej 	"vop_closeextattr",
   2104       1.51   thorpej 	0,
   2105       1.51   thorpej 	vop_closeextattr_vp_offsets,
   2106       1.51   thorpej 	VDESC_NO_OFFSET,
   2107       1.51   thorpej 	VOPARG_OFFSETOF(struct vop_closeextattr_args, a_cred),
   2108       1.51   thorpej 	VDESC_NO_OFFSET,
   2109       1.51   thorpej };
   2110       1.51   thorpej int
   2111       1.60   thorpej VOP_CLOSEEXTATTR(struct vnode *vp,
   2112       1.60   thorpej     int commit,
   2113       1.73     pooka     kauth_cred_t cred)
   2114       1.51   thorpej {
   2115       1.72        ad 	int error;
   2116       1.72        ad 	bool mpsafe;
   2117       1.51   thorpej 	struct vop_closeextattr_args a;
   2118      1.105   hannken 	struct mount *mp;
   2119       1.51   thorpej 	a.a_desc = VDESC(vop_closeextattr);
   2120       1.51   thorpej 	a.a_vp = vp;
   2121       1.51   thorpej 	a.a_commit = commit;
   2122       1.51   thorpej 	a.a_cred = cred;
   2123      1.116   hannken 	assert_vop_locked(vp, "vop_closeextattr: vp");
   2124      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   2125      1.105   hannken 	if (error)
   2126      1.105   hannken 		return error;
   2127       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_closeextattr), &a));
   2128      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   2129       1.72        ad 	return error;
   2130       1.51   thorpej }
   2131       1.51   thorpej 
   2132       1.51   thorpej const int vop_getextattr_vp_offsets[] = {
   2133       1.51   thorpej 	VOPARG_OFFSETOF(struct vop_getextattr_args,a_vp),
   2134       1.51   thorpej 	VDESC_NO_OFFSET
   2135       1.51   thorpej };
   2136       1.51   thorpej const struct vnodeop_desc vop_getextattr_desc = {
   2137       1.67     pooka 	VOP_GETEXTATTR_DESCOFFSET,
   2138       1.51   thorpej 	"vop_getextattr",
   2139       1.51   thorpej 	0,
   2140       1.51   thorpej 	vop_getextattr_vp_offsets,
   2141       1.51   thorpej 	VDESC_NO_OFFSET,
   2142       1.51   thorpej 	VOPARG_OFFSETOF(struct vop_getextattr_args, a_cred),
   2143       1.51   thorpej 	VDESC_NO_OFFSET,
   2144       1.51   thorpej };
   2145       1.51   thorpej int
   2146       1.60   thorpej VOP_GETEXTATTR(struct vnode *vp,
   2147       1.60   thorpej     int attrnamespace,
   2148       1.60   thorpej     const char *name,
   2149       1.60   thorpej     struct uio *uio,
   2150       1.60   thorpej     size_t *size,
   2151       1.73     pooka     kauth_cred_t cred)
   2152       1.51   thorpej {
   2153       1.72        ad 	int error;
   2154       1.72        ad 	bool mpsafe;
   2155       1.51   thorpej 	struct vop_getextattr_args a;
   2156      1.105   hannken 	struct mount *mp;
   2157       1.51   thorpej 	a.a_desc = VDESC(vop_getextattr);
   2158       1.51   thorpej 	a.a_vp = vp;
   2159       1.51   thorpej 	a.a_attrnamespace = attrnamespace;
   2160       1.51   thorpej 	a.a_name = name;
   2161       1.51   thorpej 	a.a_uio = uio;
   2162       1.51   thorpej 	a.a_size = size;
   2163       1.51   thorpej 	a.a_cred = cred;
   2164      1.116   hannken 	assert_vop_locked(vp, "vop_getextattr: vp");
   2165      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   2166      1.105   hannken 	if (error)
   2167      1.105   hannken 		return error;
   2168       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_getextattr), &a));
   2169      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   2170       1.72        ad 	return error;
   2171       1.51   thorpej }
   2172       1.51   thorpej 
   2173       1.51   thorpej const int vop_listextattr_vp_offsets[] = {
   2174       1.51   thorpej 	VOPARG_OFFSETOF(struct vop_listextattr_args,a_vp),
   2175       1.51   thorpej 	VDESC_NO_OFFSET
   2176       1.51   thorpej };
   2177       1.51   thorpej const struct vnodeop_desc vop_listextattr_desc = {
   2178       1.67     pooka 	VOP_LISTEXTATTR_DESCOFFSET,
   2179       1.51   thorpej 	"vop_listextattr",
   2180       1.51   thorpej 	0,
   2181       1.51   thorpej 	vop_listextattr_vp_offsets,
   2182       1.51   thorpej 	VDESC_NO_OFFSET,
   2183       1.51   thorpej 	VOPARG_OFFSETOF(struct vop_listextattr_args, a_cred),
   2184       1.51   thorpej 	VDESC_NO_OFFSET,
   2185       1.51   thorpej };
   2186       1.51   thorpej int
   2187       1.60   thorpej VOP_LISTEXTATTR(struct vnode *vp,
   2188       1.60   thorpej     int attrnamespace,
   2189       1.60   thorpej     struct uio *uio,
   2190       1.60   thorpej     size_t *size,
   2191       1.87      manu     int flag,
   2192       1.73     pooka     kauth_cred_t cred)
   2193       1.51   thorpej {
   2194       1.72        ad 	int error;
   2195       1.72        ad 	bool mpsafe;
   2196       1.51   thorpej 	struct vop_listextattr_args a;
   2197      1.105   hannken 	struct mount *mp;
   2198       1.51   thorpej 	a.a_desc = VDESC(vop_listextattr);
   2199       1.51   thorpej 	a.a_vp = vp;
   2200       1.51   thorpej 	a.a_attrnamespace = attrnamespace;
   2201       1.51   thorpej 	a.a_uio = uio;
   2202       1.51   thorpej 	a.a_size = size;
   2203       1.87      manu 	a.a_flag = flag;
   2204       1.51   thorpej 	a.a_cred = cred;
   2205      1.116   hannken 	assert_vop_locked(vp, "vop_listextattr: vp");
   2206      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   2207      1.105   hannken 	if (error)
   2208      1.105   hannken 		return error;
   2209       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_listextattr), &a));
   2210      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   2211       1.72        ad 	return error;
   2212       1.51   thorpej }
   2213       1.51   thorpej 
   2214       1.51   thorpej const int vop_openextattr_vp_offsets[] = {
   2215       1.51   thorpej 	VOPARG_OFFSETOF(struct vop_openextattr_args,a_vp),
   2216       1.51   thorpej 	VDESC_NO_OFFSET
   2217       1.51   thorpej };
   2218       1.51   thorpej const struct vnodeop_desc vop_openextattr_desc = {
   2219       1.67     pooka 	VOP_OPENEXTATTR_DESCOFFSET,
   2220       1.51   thorpej 	"vop_openextattr",
   2221       1.51   thorpej 	0,
   2222       1.51   thorpej 	vop_openextattr_vp_offsets,
   2223       1.51   thorpej 	VDESC_NO_OFFSET,
   2224       1.51   thorpej 	VOPARG_OFFSETOF(struct vop_openextattr_args, a_cred),
   2225       1.51   thorpej 	VDESC_NO_OFFSET,
   2226       1.51   thorpej };
   2227       1.51   thorpej int
   2228       1.60   thorpej VOP_OPENEXTATTR(struct vnode *vp,
   2229       1.73     pooka     kauth_cred_t cred)
   2230       1.51   thorpej {
   2231       1.72        ad 	int error;
   2232       1.72        ad 	bool mpsafe;
   2233       1.51   thorpej 	struct vop_openextattr_args a;
   2234      1.105   hannken 	struct mount *mp;
   2235       1.51   thorpej 	a.a_desc = VDESC(vop_openextattr);
   2236       1.51   thorpej 	a.a_vp = vp;
   2237       1.51   thorpej 	a.a_cred = cred;
   2238      1.116   hannken 	assert_vop_locked(vp, "vop_openextattr: vp");
   2239      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   2240      1.105   hannken 	if (error)
   2241      1.105   hannken 		return error;
   2242       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_openextattr), &a));
   2243      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   2244       1.72        ad 	return error;
   2245       1.51   thorpej }
   2246       1.51   thorpej 
   2247       1.51   thorpej const int vop_deleteextattr_vp_offsets[] = {
   2248       1.51   thorpej 	VOPARG_OFFSETOF(struct vop_deleteextattr_args,a_vp),
   2249       1.51   thorpej 	VDESC_NO_OFFSET
   2250       1.51   thorpej };
   2251       1.51   thorpej const struct vnodeop_desc vop_deleteextattr_desc = {
   2252       1.67     pooka 	VOP_DELETEEXTATTR_DESCOFFSET,
   2253       1.51   thorpej 	"vop_deleteextattr",
   2254       1.51   thorpej 	0,
   2255       1.51   thorpej 	vop_deleteextattr_vp_offsets,
   2256       1.51   thorpej 	VDESC_NO_OFFSET,
   2257       1.51   thorpej 	VOPARG_OFFSETOF(struct vop_deleteextattr_args, a_cred),
   2258       1.51   thorpej 	VDESC_NO_OFFSET,
   2259       1.51   thorpej };
   2260       1.51   thorpej int
   2261       1.60   thorpej VOP_DELETEEXTATTR(struct vnode *vp,
   2262       1.60   thorpej     int attrnamespace,
   2263       1.60   thorpej     const char *name,
   2264       1.73     pooka     kauth_cred_t cred)
   2265       1.51   thorpej {
   2266       1.72        ad 	int error;
   2267       1.72        ad 	bool mpsafe;
   2268       1.51   thorpej 	struct vop_deleteextattr_args a;
   2269      1.105   hannken 	struct mount *mp;
   2270       1.51   thorpej 	a.a_desc = VDESC(vop_deleteextattr);
   2271       1.51   thorpej 	a.a_vp = vp;
   2272       1.51   thorpej 	a.a_attrnamespace = attrnamespace;
   2273       1.51   thorpej 	a.a_name = name;
   2274       1.51   thorpej 	a.a_cred = cred;
   2275      1.116   hannken 	assert_vop_elocked(vp, "vop_deleteextattr: vp");
   2276      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   2277      1.105   hannken 	if (error)
   2278      1.105   hannken 		return error;
   2279       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_deleteextattr), &a));
   2280      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   2281       1.72        ad 	return error;
   2282       1.51   thorpej }
   2283       1.51   thorpej 
   2284       1.51   thorpej const int vop_setextattr_vp_offsets[] = {
   2285       1.51   thorpej 	VOPARG_OFFSETOF(struct vop_setextattr_args,a_vp),
   2286       1.51   thorpej 	VDESC_NO_OFFSET
   2287       1.51   thorpej };
   2288       1.51   thorpej const struct vnodeop_desc vop_setextattr_desc = {
   2289       1.67     pooka 	VOP_SETEXTATTR_DESCOFFSET,
   2290       1.51   thorpej 	"vop_setextattr",
   2291       1.51   thorpej 	0,
   2292       1.51   thorpej 	vop_setextattr_vp_offsets,
   2293       1.51   thorpej 	VDESC_NO_OFFSET,
   2294       1.51   thorpej 	VOPARG_OFFSETOF(struct vop_setextattr_args, a_cred),
   2295       1.51   thorpej 	VDESC_NO_OFFSET,
   2296       1.51   thorpej };
   2297       1.51   thorpej int
   2298       1.60   thorpej VOP_SETEXTATTR(struct vnode *vp,
   2299       1.60   thorpej     int attrnamespace,
   2300       1.60   thorpej     const char *name,
   2301       1.60   thorpej     struct uio *uio,
   2302       1.73     pooka     kauth_cred_t cred)
   2303       1.51   thorpej {
   2304       1.72        ad 	int error;
   2305       1.72        ad 	bool mpsafe;
   2306       1.51   thorpej 	struct vop_setextattr_args a;
   2307      1.105   hannken 	struct mount *mp;
   2308       1.51   thorpej 	a.a_desc = VDESC(vop_setextattr);
   2309       1.51   thorpej 	a.a_vp = vp;
   2310       1.51   thorpej 	a.a_attrnamespace = attrnamespace;
   2311       1.51   thorpej 	a.a_name = name;
   2312       1.51   thorpej 	a.a_uio = uio;
   2313       1.51   thorpej 	a.a_cred = cred;
   2314      1.116   hannken 	assert_vop_elocked(vp, "vop_setextattr: vp");
   2315      1.105   hannken 	error = vop_pre(vp, &mp, &mpsafe, FST_NO);
   2316      1.105   hannken 	if (error)
   2317      1.105   hannken 		return error;
   2318       1.72        ad 	error = (VCALL(vp, VOFFSET(vop_setextattr), &a));
   2319      1.105   hannken 	vop_post(vp, mp, mpsafe, FST_NO);
   2320       1.72        ad 	return error;
   2321       1.51   thorpej }
   2322       1.51   thorpej 
   2323       1.33  jdolecek const struct vnodeop_desc * const vfs_op_descs[] = {
   2324        1.1       cgd 	&vop_default_desc,	/* MUST BE FIRST */
   2325        1.1       cgd 
   2326       1.88   hannken 	&vop_bwrite_desc,
   2327      1.113  dholland 	&vop_parsepath_desc,
   2328        1.1       cgd 	&vop_lookup_desc,
   2329        1.1       cgd 	&vop_create_desc,
   2330        1.1       cgd 	&vop_mknod_desc,
   2331        1.1       cgd 	&vop_open_desc,
   2332        1.1       cgd 	&vop_close_desc,
   2333        1.1       cgd 	&vop_access_desc,
   2334      1.111  christos 	&vop_accessx_desc,
   2335        1.1       cgd 	&vop_getattr_desc,
   2336        1.1       cgd 	&vop_setattr_desc,
   2337        1.1       cgd 	&vop_read_desc,
   2338        1.1       cgd 	&vop_write_desc,
   2339       1.93  dholland 	&vop_fallocate_desc,
   2340       1.93  dholland 	&vop_fdiscard_desc,
   2341        1.1       cgd 	&vop_ioctl_desc,
   2342       1.18  wrstuden 	&vop_fcntl_desc,
   2343        1.3   mycroft 	&vop_poll_desc,
   2344       1.40  jdolecek 	&vop_kqfilter_desc,
   2345       1.10      fvdl 	&vop_revoke_desc,
   2346        1.1       cgd 	&vop_mmap_desc,
   2347        1.1       cgd 	&vop_fsync_desc,
   2348        1.1       cgd 	&vop_seek_desc,
   2349        1.1       cgd 	&vop_remove_desc,
   2350        1.1       cgd 	&vop_link_desc,
   2351        1.1       cgd 	&vop_rename_desc,
   2352        1.1       cgd 	&vop_mkdir_desc,
   2353        1.1       cgd 	&vop_rmdir_desc,
   2354        1.1       cgd 	&vop_symlink_desc,
   2355        1.1       cgd 	&vop_readdir_desc,
   2356        1.1       cgd 	&vop_readlink_desc,
   2357        1.1       cgd 	&vop_abortop_desc,
   2358        1.1       cgd 	&vop_inactive_desc,
   2359        1.1       cgd 	&vop_reclaim_desc,
   2360        1.1       cgd 	&vop_lock_desc,
   2361        1.1       cgd 	&vop_unlock_desc,
   2362        1.1       cgd 	&vop_bmap_desc,
   2363       1.46   hannken 	&vop_strategy_desc,
   2364        1.1       cgd 	&vop_print_desc,
   2365        1.1       cgd 	&vop_islocked_desc,
   2366        1.1       cgd 	&vop_pathconf_desc,
   2367        1.1       cgd 	&vop_advlock_desc,
   2368        1.1       cgd 	&vop_whiteout_desc,
   2369       1.26       chs 	&vop_getpages_desc,
   2370       1.26       chs 	&vop_putpages_desc,
   2371      1.111  christos 	&vop_getacl_desc,
   2372      1.111  christos 	&vop_setacl_desc,
   2373      1.111  christos 	&vop_aclcheck_desc,
   2374       1.51   thorpej 	&vop_closeextattr_desc,
   2375       1.51   thorpej 	&vop_getextattr_desc,
   2376       1.51   thorpej 	&vop_listextattr_desc,
   2377       1.51   thorpej 	&vop_openextattr_desc,
   2378       1.51   thorpej 	&vop_deleteextattr_desc,
   2379       1.51   thorpej 	&vop_setextattr_desc,
   2380        1.1       cgd 	NULL
   2381        1.1       cgd };
   2382