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