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