xref: /netbsd-src/sys/kern/vnode_if.c (revision 7fa608457b817eca6e0977b37f758ae064f3c99c)
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