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