Home | History | Annotate | Line # | Download | only in kern
      1  1.113  dholland /*	$NetBSD: vnode_if.c,v 1.119 2023/06/15 09:15:13 hannken Exp $	*/
      2    1.9   thorpej 
      3    1.1       cgd /*
      4   1.52     perry  * Warning: DO NOT EDIT! This file is automatically generated!
      5    1.1       cgd  * (Modifications made here may easily be lost!)
      6    1.1       cgd  *
      7    1.1       cgd  * Created from the file:
      8  1.119   hannken  *	NetBSD: vnode_if.src,v 1.85 2023/06/15 09:13:36 hannken Exp
      9    1.1       cgd  * by the script:
     10  1.119   hannken  *	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.119 2023/06/15 09:15:13 hannken Exp $");
     44   1.39     lukem 
     45  1.116   hannken #ifdef _KERNEL_OPT
     46  1.116   hannken #include "opt_vnode_lockdebug.h"
     47  1.116   hannken #endif /* _KERNEL_OPT */
     48  1.116   hannken 
     49    1.1       cgd #include <sys/param.h>
     50    1.1       cgd #include <sys/mount.h>
     51   1.23   thorpej #include <sys/buf.h>
     52  1.115   thorpej #include <sys/fcntl.h>
     53    1.1       cgd #include <sys/vnode.h>
     54   1.72        ad #include <sys/lock.h>
     55   1.97   hannken #include <sys/fstrans.h>
     56    1.1       cgd 
     57  1.119   hannken #include <miscfs/deadfs/deadfs.h>
     58  1.119   hannken 
     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