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