VFS messaging/interfacing work stage 7/99. BEGIN DESTABILIZATION!
[dragonfly.git] / sys / kern / vfs_vopops.c
1 /*
2  * 
3  * Copyright (c) 2004 The DragonFly Project.  All rights reserved.
4  * 
5  * This code is derived from software contributed to The DragonFly Project
6  * by Matthew Dillon <dillon@backplane.com>
7  * 
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice, this list of conditions and the following disclaimer.
14  * 2. Redistributions in binary form must reproduce the above copyright
15  *    notice, this list of conditions and the following disclaimer in
16  *    the documentation and/or other materials provided with the
17  *    distribution.
18  * 3. Neither the name of The DragonFly Project nor the names of its
19  *    contributors may be used to endorse or promote products derived
20  *    from this software without specific, prior written permission.
21  * 
22  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
23  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
24  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
25  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
26  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
27  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
28  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
30  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
31  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
32  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  * 
35  * $DragonFly: src/sys/kern/vfs_vopops.c,v 1.8 2004/09/30 18:59:48 dillon Exp $
36  */
37
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/buf.h>
41 #include <sys/conf.h>
42 #include <sys/dirent.h>
43 #include <sys/domain.h>
44 #include <sys/eventhandler.h>
45 #include <sys/fcntl.h>
46 #include <sys/kernel.h>
47 #include <sys/kthread.h>
48 #include <sys/malloc.h>
49 #include <sys/mbuf.h>
50 #include <sys/mount.h>
51 #include <sys/proc.h>
52 #include <sys/namei.h>
53 #include <sys/reboot.h>
54 #include <sys/socket.h>
55 #include <sys/stat.h>
56 #include <sys/sysctl.h>
57 #include <sys/syslog.h>
58 #include <sys/vmmeter.h>
59 #include <sys/vnode.h>
60 #include <sys/vfsops.h>
61
62 #include <machine/limits.h>
63
64 #include <vm/vm.h>
65 #include <vm/vm_object.h>
66 #include <vm/vm_extern.h>
67 #include <vm/vm_kern.h>
68 #include <vm/pmap.h>
69 #include <vm/vm_map.h>
70 #include <vm/vm_page.h>
71 #include <vm/vm_pager.h>
72 #include <vm/vnode_pager.h>
73 #include <vm/vm_zone.h>
74
75 #include <sys/buf2.h>
76 #include <sys/thread2.h>
77
78 #define VOFFNAME(name)  __CONCAT(__CONCAT(vop_,name),_vp_offsets)
79 #define VDESCNAME(name) __CONCAT(__CONCAT(vop_,name),_desc)
80 #define VARGSSTRUCT(name) struct __CONCAT(__CONCAT(vop_,name),_args)
81
82 #define VNODEOP_DESC_INIT(name, flags, vpoffs, vpp, cred, proc, comp)   \
83         struct vnodeop_desc VDESCNAME(name) = {                         \
84                 __offsetof(struct vop_ops, __CONCAT(vop_, name)),       \
85                 #name, flags, vpoffs, vpp, cred, proc, comp }
86
87 #define VNODEOP_DESC_INIT_SIMPLE(name)                                  \
88         VNODEOP_DESC_INIT(name, 0, NULL,                                \
89                 VDESC_NO_OFFSET,                                        \
90                 VDESC_NO_OFFSET,                                        \
91                 VDESC_NO_OFFSET,                                        \
92                 VDESC_NO_OFFSET)
93
94 #define VNODEOP_DESC_INIT_VP(name)                                      \
95         static int VOFFNAME(name)[] = {                                 \
96                 __offsetof(VARGSSTRUCT(name), a_vp),                    \
97                 VDESC_NO_OFFSET };                                      \
98         VNODEOP_DESC_INIT(name, 0, VOFFNAME(name),                      \
99                 VDESC_NO_OFFSET,                                        \
100                 VDESC_NO_OFFSET,                                        \
101                 VDESC_NO_OFFSET,                                        \
102                 VDESC_NO_OFFSET)
103
104 #define VNODEOP_DESC_INIT_VP_VPP(name)                                  \
105         static int VOFFNAME(name)[] = {                                 \
106                 __offsetof(VARGSSTRUCT(name), a_vp),                    \
107                 VDESC_NO_OFFSET };                                      \
108         VNODEOP_DESC_INIT(name, 0, VOFFNAME(name),                      \
109                 __offsetof(VARGSSTRUCT(name), a_vpp),                   \
110                 VDESC_NO_OFFSET,                                        \
111                 VDESC_NO_OFFSET,                                        \
112                 VDESC_NO_OFFSET)
113
114 #define VNODEOP_DESC_INIT_VP_CRED(name)                                 \
115         static int VOFFNAME(name)[] = {                                 \
116                 __offsetof(VARGSSTRUCT(name), a_vp),                    \
117                 VDESC_NO_OFFSET };                                      \
118         VNODEOP_DESC_INIT(name, 0, VOFFNAME(name),                      \
119                 VDESC_NO_OFFSET,                                        \
120                 __offsetof(VARGSSTRUCT(name), a_cred),                  \
121                 VDESC_NO_OFFSET,                                        \
122                 VDESC_NO_OFFSET)
123
124 #define VNODEOP_DESC_INIT_NCP(name)                                     \
125         VNODEOP_DESC_INIT(name, 0, NULL,                                \
126                 VDESC_NO_OFFSET,                                        \
127                 VDESC_NO_OFFSET,                                        \
128                 VDESC_NO_OFFSET,                                        \
129                 VDESC_NO_OFFSET)
130
131 #define VNODEOP_DESC_INIT_NCP_CRED(name)                                \
132         VNODEOP_DESC_INIT(name, 0, NULL,                                \
133                 VDESC_NO_OFFSET,                                        \
134                 __offsetof(VARGSSTRUCT(name), a_cred),                  \
135                 VDESC_NO_OFFSET,                                        \
136                 VDESC_NO_OFFSET)
137
138 #define VNODEOP_DESC_INIT_DVP_VPP_CNP(name)                             \
139         static int VOFFNAME(name)[] = {                                 \
140                 __offsetof(VARGSSTRUCT(name), a_dvp),                   \
141                 VDESC_NO_OFFSET };                                      \
142         VNODEOP_DESC_INIT(name, 0, VOFFNAME(name),                      \
143                 __offsetof(VARGSSTRUCT(name), a_vpp),                   \
144                 VDESC_NO_OFFSET,                                        \
145                 VDESC_NO_OFFSET,                                        \
146                 __offsetof(VARGSSTRUCT(name), a_cnp))
147
148 #define VNODEOP_DESC_INIT_DVP_CNP(name)                                 \
149         static int VOFFNAME(name)[] = {                                 \
150                 __offsetof(VARGSSTRUCT(name), a_dvp),                   \
151                 VDESC_NO_OFFSET };                                      \
152         VNODEOP_DESC_INIT(name, 0, VOFFNAME(name),                      \
153                 VDESC_NO_OFFSET,                                        \
154                 VDESC_NO_OFFSET,                                        \
155                 VDESC_NO_OFFSET,                                        \
156                 __offsetof(VARGSSTRUCT(name), a_cnp))
157
158 #define VNODEOP_DESC_INIT_DVP_VP_CNP(name)                              \
159         static int VOFFNAME(name)[] = {                                 \
160                 __offsetof(VARGSSTRUCT(name), a_dvp),                   \
161                 __offsetof(VARGSSTRUCT(name), a_vp),                    \
162                 VDESC_NO_OFFSET };                                      \
163         VNODEOP_DESC_INIT(name, 0, VOFFNAME(name),                      \
164                 VDESC_NO_OFFSET,                                        \
165                 VDESC_NO_OFFSET,                                        \
166                 VDESC_NO_OFFSET,                                        \
167                 __offsetof(VARGSSTRUCT(name), a_cnp))
168
169 #define VNODEOP_DESC_INIT_TDVP_VP_CNP(name)                             \
170         static int VOFFNAME(name)[] = {                                 \
171                 __offsetof(VARGSSTRUCT(name), a_tdvp),                  \
172                 __offsetof(VARGSSTRUCT(name), a_vp),                    \
173                 VDESC_NO_OFFSET };                                      \
174         VNODEOP_DESC_INIT(name, 0, VOFFNAME(name),                      \
175                 VDESC_NO_OFFSET,                                        \
176                 VDESC_NO_OFFSET,                                        \
177                 VDESC_NO_OFFSET,                                        \
178                 __offsetof(VARGSSTRUCT(name), a_cnp))
179
180 VNODEOP_DESC_INIT_SIMPLE(default);
181 VNODEOP_DESC_INIT_VP(islocked);
182 VNODEOP_DESC_INIT_NCP_CRED(resolve);
183 VNODEOP_DESC_INIT_DVP_VPP_CNP(lookup);
184 VNODEOP_DESC_INIT_DVP_VPP_CNP(cachedlookup);
185 VNODEOP_DESC_INIT_DVP_VPP_CNP(create);
186 VNODEOP_DESC_INIT_DVP_CNP(whiteout);
187 VNODEOP_DESC_INIT_DVP_VPP_CNP(mknod);
188 VNODEOP_DESC_INIT_VP_CRED(open);
189 VNODEOP_DESC_INIT_VP(close);
190 VNODEOP_DESC_INIT_VP_CRED(access);
191 VNODEOP_DESC_INIT_VP(getattr);
192 VNODEOP_DESC_INIT_VP_CRED(setattr);
193 VNODEOP_DESC_INIT_VP_CRED(read);
194 VNODEOP_DESC_INIT_VP_CRED(write);
195 VNODEOP_DESC_INIT_VP_CRED(lease);
196 VNODEOP_DESC_INIT_VP_CRED(ioctl);
197 VNODEOP_DESC_INIT_VP_CRED(poll);
198 VNODEOP_DESC_INIT_VP(kqfilter);
199 VNODEOP_DESC_INIT_VP(revoke);
200 VNODEOP_DESC_INIT_VP_CRED(mmap);
201 VNODEOP_DESC_INIT_VP(fsync);
202 VNODEOP_DESC_INIT_DVP_VP_CNP(remove);
203 VNODEOP_DESC_INIT_NCP_CRED(nremove);
204 VNODEOP_DESC_INIT_TDVP_VP_CNP(link);
205
206 static int VOFFNAME(rename)[] = { 
207         __offsetof(VARGSSTRUCT(rename), a_fdvp),
208         __offsetof(VARGSSTRUCT(rename), a_fvp),
209         __offsetof(VARGSSTRUCT(rename), a_tdvp),
210         __offsetof(VARGSSTRUCT(rename), a_tvp),
211         VDESC_NO_OFFSET
212 };
213 VNODEOP_DESC_INIT(rename, 
214         VDESC_VP0_WILLRELE|VDESC_VP1_WILLRELE|
215          VDESC_VP2_WILLRELE|VDESC_VP3_WILLRELE|
216          VDESC_VP2_WILLUNLOCK|VDESC_VP3_WILLUNLOCK, /* tdvp and tvp */
217         VOFFNAME(rename),
218         VDESC_NO_OFFSET,
219         VDESC_NO_OFFSET,
220         VDESC_NO_OFFSET,
221         __offsetof(VARGSSTRUCT(rename), a_fcnp));
222 VNODEOP_DESC_INIT_DVP_VPP_CNP(mkdir);
223 VNODEOP_DESC_INIT_DVP_VP_CNP(rmdir);
224 VNODEOP_DESC_INIT_DVP_VPP_CNP(symlink);
225 VNODEOP_DESC_INIT_VP_CRED(readdir);
226 VNODEOP_DESC_INIT_VP_CRED(readlink);
227 VNODEOP_DESC_INIT_VP(inactive);
228 VNODEOP_DESC_INIT_VP(reclaim);
229 VNODEOP_DESC_INIT_VP(lock);
230 VNODEOP_DESC_INIT_VP(unlock);
231 VNODEOP_DESC_INIT_VP_VPP(bmap);
232 VNODEOP_DESC_INIT_VP(strategy);
233 VNODEOP_DESC_INIT_VP(print);
234 VNODEOP_DESC_INIT_VP(pathconf);
235 VNODEOP_DESC_INIT_VP(advlock);
236 VNODEOP_DESC_INIT_VP_CRED(balloc);
237 VNODEOP_DESC_INIT_VP(reallocblks);
238 VNODEOP_DESC_INIT_VP(getpages);
239 VNODEOP_DESC_INIT_VP(putpages);
240 VNODEOP_DESC_INIT_VP(freeblks);
241 VNODEOP_DESC_INIT_VP(bwrite);
242 VNODEOP_DESC_INIT_VP_CRED(getacl);
243 VNODEOP_DESC_INIT_VP_CRED(setacl);
244 VNODEOP_DESC_INIT_VP_CRED(aclcheck);
245 VNODEOP_DESC_INIT_VP_CRED(getextattr);
246 VNODEOP_DESC_INIT_VP_CRED(setextattr);
247 VNODEOP_DESC_INIT_VP(createvobject);
248 VNODEOP_DESC_INIT_VP(destroyvobject);
249 VNODEOP_DESC_INIT_VP(getvobject);
250 VNODEOP_DESC_INIT_SIMPLE(vfsset);
251
252 /*
253  * The DO_OPS macro basicallys calls ops->blah(&ap) but is also responsible
254  * for checking vv_flags and executing additional hook functions.
255  *
256  * NOTE: vop_vnoperate_ap() rolls its own DO_OPS equivalent.
257  */
258 #define DO_OPS(ops, error, ap, vop_field)                               \
259         if (ops->vv_flags & VVF_HOOK_MASK) {                            \
260                 if (ops->vv_flags & VVF_JOURNAL_HOOK)                   \
261                         error = ops->vv_jops->vop_field(ap);            \
262                 else                                                    \
263                         error = 0;                                      \
264                 if (error == 0)                                         \
265                         error = ops->vop_field(ap);                     \
266         } else {                                                        \
267                 error = ops->vop_field(ap);                             \
268         }                                                               \
269
270
271 /************************************************************************
272  *              PRIMARY HIGH LEVEL VNODE OPERATIONS CALLS               *
273  ************************************************************************
274  *
275  * These procedures are called directly from the kernel and/or fileops 
276  * code to perform file/device operations on the system.
277  */
278
279 int
280 vop_islocked(struct vop_ops *ops, struct vnode *vp, struct thread *td)
281 {
282         struct vop_islocked_args ap;
283         int error;
284
285         ap.a_head.a_desc = &vop_islocked_desc;
286         ap.a_head.a_ops = ops;
287         ap.a_vp = vp;
288         ap.a_td = td;
289
290         DO_OPS(ops, error, &ap, vop_islocked);
291         return(error);
292 }
293
294 int
295 vop_resolve(struct vop_ops *ops, struct namecache *ncp, struct ucred *cred)
296 {
297         struct vop_resolve_args ap;
298         int error;
299
300         ap.a_head.a_desc = &vop_resolve_desc;
301         ap.a_head.a_ops = ops;
302         ap.a_ncp = ncp;
303         ap.a_cred = cred;
304
305         DO_OPS(ops, error, &ap, vop_resolve);
306         return(error);
307 }
308
309 int
310 vop_lookup(struct vop_ops *ops, struct vnode *dvp,
311         struct vnode **vpp, struct componentname *cnp)
312 {
313         struct vop_lookup_args ap;
314         int error;
315
316         ap.a_head.a_desc = &vop_lookup_desc;
317         ap.a_head.a_ops = ops;
318         ap.a_dvp = dvp;
319         ap.a_vpp = vpp;
320         ap.a_cnp = cnp;
321
322         DO_OPS(ops, error, &ap, vop_lookup);
323         return(error);
324 }
325
326 int
327 vop_cachedlookup(struct vop_ops *ops, struct vnode *dvp,
328         struct vnode **vpp, struct componentname *cnp)
329 {
330         struct vop_cachedlookup_args ap;
331         int error;
332
333         ap.a_head.a_desc = &vop_cachedlookup_desc;
334         ap.a_head.a_ops = ops;
335         ap.a_dvp = dvp;
336         ap.a_vpp = vpp;
337         ap.a_cnp = cnp;
338
339         DO_OPS(ops, error, &ap, vop_cachedlookup);
340         return(error);
341 }
342
343 int
344 vop_create(struct vop_ops *ops, struct vnode *dvp, struct namecache *par,
345         struct vnode **vpp, struct componentname *cnp, struct vattr *vap)
346 {
347         struct vop_create_args ap;
348         int error;
349
350         ap.a_head.a_desc = &vop_create_desc;
351         ap.a_head.a_ops = ops;
352         ap.a_dvp = dvp;
353         ap.a_par = par;
354         ap.a_vpp = vpp;
355         ap.a_cnp = cnp;
356         ap.a_vap = vap;
357
358         DO_OPS(ops, error, &ap, vop_create);
359         return(error);
360 }
361
362 int
363 vop_whiteout(struct vop_ops *ops, struct vnode *dvp, struct namecache *par,
364         struct componentname *cnp, int flags)
365 {
366         struct vop_whiteout_args ap;
367         int error;
368
369         ap.a_head.a_desc = &vop_whiteout_desc;
370         ap.a_head.a_ops = ops;
371         ap.a_dvp = dvp;
372         ap.a_par = par;
373         ap.a_cnp = cnp;
374         ap.a_flags = flags;
375
376         DO_OPS(ops, error, &ap, vop_whiteout);
377         return(error);
378 }
379
380 int
381 vop_mknod(struct vop_ops *ops, struct vnode *dvp, struct namecache *par,
382         struct vnode **vpp, struct componentname *cnp, struct vattr *vap)
383 {
384         struct vop_mknod_args ap;
385         int error;
386
387         ap.a_head.a_desc = &vop_mknod_desc;
388         ap.a_head.a_ops = ops;
389         ap.a_dvp = dvp;
390         ap.a_par = par;
391         ap.a_vpp = vpp;
392         ap.a_cnp = cnp;
393         ap.a_vap = vap;
394
395         DO_OPS(ops, error, &ap, vop_mknod);
396         return(error);
397 }
398
399 int
400 vop_open(struct vop_ops *ops, struct vnode *vp, int mode, struct ucred *cred,
401         struct thread *td)
402 {
403         struct vop_open_args ap;
404         int error;
405
406         ap.a_head.a_desc = &vop_open_desc;
407         ap.a_head.a_ops = ops;
408         ap.a_vp = vp;
409         ap.a_mode = mode;
410         ap.a_cred = cred;
411         ap.a_td = td;
412
413         DO_OPS(ops, error, &ap, vop_open);
414         return(error);
415 }
416
417 int
418 vop_close(struct vop_ops *ops, struct vnode *vp, int fflag, struct thread *td)
419 {
420         struct vop_close_args ap;
421         int error;
422
423         ap.a_head.a_desc = &vop_close_desc;
424         ap.a_head.a_ops = ops;
425         ap.a_vp = vp;
426         ap.a_fflag = fflag;
427         ap.a_td = td;
428
429         DO_OPS(ops, error, &ap, vop_close);
430         return(error);
431 }
432
433 int
434 vop_access(struct vop_ops *ops, struct vnode *vp, int mode, struct ucred *cred,
435         struct thread *td)
436 {
437         struct vop_access_args ap;
438         int error;
439
440         ap.a_head.a_desc = &vop_access_desc;
441         ap.a_head.a_ops = ops;
442         ap.a_vp = vp;
443         ap.a_mode = mode;
444         ap.a_cred = cred;
445         ap.a_td = td;
446
447         DO_OPS(ops, error, &ap, vop_access);
448         return(error);
449 }
450
451 int
452 vop_getattr(struct vop_ops *ops, struct vnode *vp, struct vattr *vap,
453         struct thread *td)
454 {
455         struct vop_getattr_args ap;
456         int error;
457
458         ap.a_head.a_desc = &vop_getattr_desc;
459         ap.a_head.a_ops = ops;
460         ap.a_vp = vp;
461         ap.a_vap = vap;
462         ap.a_td = td;
463
464         DO_OPS(ops, error, &ap, vop_getattr);
465         return(error);
466 }
467
468 int
469 vop_setattr(struct vop_ops *ops, struct vnode *vp, struct vattr *vap,
470         struct ucred *cred, struct thread *td)
471 {
472         struct vop_setattr_args ap;
473         int error;
474
475         ap.a_head.a_desc = &vop_setattr_desc;
476         ap.a_head.a_ops = ops;
477         ap.a_vp = vp;
478         ap.a_vap = vap;
479         ap.a_cred = cred;
480         ap.a_td = td;
481
482         DO_OPS(ops, error, &ap, vop_setattr);
483         return(error);
484 }
485
486 int
487 vop_read(struct vop_ops *ops, struct vnode *vp, struct uio *uio, int ioflag,
488         struct ucred *cred)
489 {
490         struct vop_read_args ap;
491         int error;
492
493         ap.a_head.a_desc = &vop_read_desc;
494         ap.a_head.a_ops = ops;
495         ap.a_vp = vp;
496         ap.a_uio = uio;
497         ap.a_ioflag = ioflag;
498         ap.a_cred = cred;
499
500         DO_OPS(ops, error, &ap, vop_read);
501         return(error);
502 }
503
504 int
505 vop_write(struct vop_ops *ops, struct vnode *vp, struct uio *uio, int ioflag,
506         struct ucred *cred)
507 {
508         struct vop_write_args ap;
509         int error;
510
511         ap.a_head.a_desc = &vop_write_desc;
512         ap.a_head.a_ops = ops;
513         ap.a_vp = vp;
514         ap.a_uio = uio;
515         ap.a_ioflag = ioflag;
516         ap.a_cred = cred;
517
518         DO_OPS(ops, error, &ap, vop_write);
519         return(error);
520 }
521
522 int
523 vop_lease(struct vop_ops *ops, struct vnode *vp, struct thread *td,
524         struct ucred *cred, int flag)
525 {
526         struct vop_lease_args ap;
527         int error;
528
529         ap.a_head.a_desc = &vop_lease_desc;
530         ap.a_head.a_ops = ops;
531         ap.a_vp = vp;
532         ap.a_td = td;
533         ap.a_cred = cred;
534         ap.a_flag = flag;
535
536         DO_OPS(ops, error, &ap, vop_lease);
537         return(error);
538 }
539
540 int
541 vop_ioctl(struct vop_ops *ops, struct vnode *vp, u_long command, caddr_t data,
542         int fflag, struct ucred *cred,
543         struct thread *td)
544 {
545         struct vop_ioctl_args ap;
546         int error;
547
548         ap.a_head.a_desc = &vop_ioctl_desc;
549         ap.a_head.a_ops = ops;
550         ap.a_vp = vp;
551         ap.a_command = command;
552         ap.a_data = data;
553         ap.a_fflag = fflag;
554         ap.a_cred = cred;
555         ap.a_td = td;
556
557         DO_OPS(ops, error, &ap, vop_ioctl);
558         return(error);
559 }
560
561 int
562 vop_poll(struct vop_ops *ops, struct vnode *vp, int events, struct ucred *cred,
563         struct thread *td)
564 {
565         struct vop_poll_args ap;
566         int error;
567
568         ap.a_head.a_desc = &vop_poll_desc;
569         ap.a_head.a_ops = ops;
570         ap.a_vp = vp;
571         ap.a_events = events;
572         ap.a_cred = cred;
573         ap.a_td = td;
574
575         DO_OPS(ops, error, &ap, vop_poll);
576         return(error);
577 }
578
579 int
580 vop_kqfilter(struct vop_ops *ops, struct vnode *vp, struct knote *kn)
581 {
582         struct vop_kqfilter_args ap;
583         int error;
584
585         ap.a_head.a_desc = &vop_kqfilter_desc;
586         ap.a_head.a_ops = ops;
587         ap.a_vp = vp;
588         ap.a_kn = kn;
589
590         DO_OPS(ops, error, &ap, vop_kqfilter);
591         return(error);
592 }
593
594 int
595 vop_revoke(struct vop_ops *ops, struct vnode *vp, int flags)
596 {
597         struct vop_revoke_args ap;
598         int error;
599
600         ap.a_head.a_desc = &vop_revoke_desc;
601         ap.a_head.a_ops = ops;
602         ap.a_vp = vp;
603         ap.a_flags = flags;
604
605         DO_OPS(ops, error, &ap, vop_revoke);
606         return(error);
607 }
608
609 int
610 vop_mmap(struct vop_ops *ops, struct vnode *vp, int fflags, struct ucred *cred,
611         struct thread *td)
612 {
613         struct vop_mmap_args ap;
614         int error;
615
616         ap.a_head.a_desc = &vop_mmap_desc;
617         ap.a_head.a_ops = ops;
618         ap.a_vp = vp;
619         ap.a_fflags = fflags;
620         ap.a_cred = cred;
621         ap.a_td = td;
622
623         DO_OPS(ops, error, &ap, vop_mmap);
624         return(error);
625 }
626
627 int
628 vop_fsync(struct vop_ops *ops, struct vnode *vp, int waitfor, struct thread *td)
629 {
630         struct vop_fsync_args ap;
631         int error;
632
633         ap.a_head.a_desc = &vop_fsync_desc;
634         ap.a_head.a_ops = ops;
635         ap.a_vp = vp;
636         ap.a_waitfor = waitfor;
637         ap.a_td = td;
638
639         DO_OPS(ops, error, &ap, vop_fsync);
640         return(error);
641 }
642
643 int
644 vop_remove(struct vop_ops *ops, struct vnode *dvp, struct namecache *par,
645         struct vnode *vp, struct componentname *cnp)
646 {
647         struct vop_remove_args ap;
648         int error;
649
650         ap.a_head.a_desc = &vop_remove_desc;
651         ap.a_head.a_ops = ops;
652         ap.a_dvp = dvp;
653         ap.a_par = par;
654         ap.a_vp = vp;
655         ap.a_cnp = cnp;
656
657         DO_OPS(ops, error, &ap, vop_remove);
658         return(error);
659 }
660
661 int
662 vop_nremove(struct vop_ops *ops, struct namecache *ncp, struct ucred *cred)
663 {
664         struct vop_nremove_args ap;
665         int error;
666
667         ap.a_head.a_desc = &vop_nremove_desc;
668         ap.a_head.a_ops = ops;
669         ap.a_ncp = ncp;
670         ap.a_cred = cred;
671
672         DO_OPS(ops, error, &ap, vop_nremove);
673         return(error);
674 }
675
676 int
677 vop_link(struct vop_ops *ops, struct vnode *tdvp, struct namecache *par,
678         struct vnode *vp, struct componentname *cnp)
679 {
680         struct vop_link_args ap;
681         int error;
682
683         ap.a_head.a_desc = &vop_link_desc;
684         ap.a_head.a_ops = ops;
685         ap.a_tdvp = tdvp;
686         ap.a_par = par;
687         ap.a_vp = vp;
688         ap.a_cnp = cnp;
689
690         DO_OPS(ops, error, &ap, vop_link);
691         return(error);
692 }
693
694 int
695 vop_rename(struct vop_ops *ops, struct vnode *fdvp, struct namecache *fpar,
696         struct vnode *fvp, struct componentname *fcnp,
697         struct vnode *tdvp, struct namecache *tpar,
698         struct vnode *tvp, struct componentname *tcnp)
699 {
700         struct vop_rename_args ap;
701         int error;
702
703         ap.a_head.a_desc = &vop_rename_desc;
704         ap.a_head.a_ops = ops;
705         ap.a_fdvp = fdvp;
706         ap.a_fpar = fpar;
707         ap.a_fvp = fvp;
708         ap.a_fcnp = fcnp;
709         ap.a_tdvp = tdvp;
710         ap.a_tpar = tpar;
711         ap.a_tvp = tvp;
712         ap.a_tcnp = tcnp;
713
714         DO_OPS(ops, error, &ap, vop_rename);
715         return(error);
716 }
717
718 int
719 vop_mkdir(struct vop_ops *ops, struct vnode *dvp, struct namecache *par,
720         struct vnode **vpp, struct componentname *cnp, struct vattr *vap)
721 {
722         struct vop_mkdir_args ap;
723         int error;
724
725         ap.a_head.a_desc = &vop_mkdir_desc;
726         ap.a_head.a_ops = ops;
727         ap.a_dvp = dvp;
728         ap.a_par = par;
729         ap.a_vpp = vpp;
730         ap.a_cnp = cnp;
731         ap.a_vap = vap;
732
733         DO_OPS(ops, error, &ap, vop_mkdir);
734         return(error);
735 }
736
737 int
738 vop_rmdir(struct vop_ops *ops, struct vnode *dvp, struct namecache *par,
739         struct vnode *vp, struct componentname *cnp)
740 {
741         struct vop_rmdir_args ap;
742         int error;
743
744         ap.a_head.a_desc = &vop_rmdir_desc;
745         ap.a_head.a_ops = ops;
746         ap.a_dvp = dvp;
747         ap.a_par = par;
748         ap.a_vp = vp;
749         ap.a_cnp = cnp;
750
751         DO_OPS(ops, error, &ap, vop_rmdir);
752         return(error);
753 }
754
755 int
756 vop_symlink(struct vop_ops *ops, struct vnode *dvp, struct namecache *par,
757         struct vnode **vpp, struct componentname *cnp,
758         struct vattr *vap, char *target)
759 {
760         struct vop_symlink_args ap;
761         int error;
762
763         ap.a_head.a_desc = &vop_symlink_desc;
764         ap.a_head.a_ops = ops;
765         ap.a_dvp = dvp;
766         ap.a_par = par;
767         ap.a_vpp = vpp;
768         ap.a_cnp = cnp;
769         ap.a_vap = vap;
770         ap.a_target = target;
771
772         DO_OPS(ops, error, &ap, vop_symlink);
773         return(error);
774 }
775
776 int
777 vop_readdir(struct vop_ops *ops, struct vnode *vp, struct uio *uio,
778         struct ucred *cred, int *eofflag, int *ncookies, u_long **cookies)
779 {
780         struct vop_readdir_args ap;
781         int error;
782
783         ap.a_head.a_desc = &vop_readdir_desc;
784         ap.a_head.a_ops = ops;
785         ap.a_vp = vp;
786         ap.a_uio = uio;
787         ap.a_cred = cred;
788         ap.a_eofflag = eofflag;
789         ap.a_ncookies = ncookies;
790         ap.a_cookies = cookies;
791
792         DO_OPS(ops, error, &ap, vop_readdir);
793         return(error);
794 }
795
796 int
797 vop_readlink(struct vop_ops *ops, struct vnode *vp, struct uio *uio,
798         struct ucred *cred)
799 {
800         struct vop_readlink_args ap;
801         int error;
802
803         ap.a_head.a_desc = &vop_readlink_desc;
804         ap.a_head.a_ops = ops;
805         ap.a_vp = vp;
806         ap.a_uio = uio;
807         ap.a_cred = cred;
808
809         DO_OPS(ops, error, &ap, vop_readlink);
810         return(error);
811 }
812
813 int
814 vop_inactive(struct vop_ops *ops, struct vnode *vp, struct thread *td)
815 {
816         struct vop_inactive_args ap;
817         int error;
818
819         ap.a_head.a_desc = &vop_inactive_desc;
820         ap.a_head.a_ops = ops;
821         ap.a_vp = vp;
822         ap.a_td = td;
823
824         DO_OPS(ops, error, &ap, vop_inactive);
825         return(error);
826 }
827
828 int
829 vop_reclaim(struct vop_ops *ops, struct vnode *vp, struct thread *td)
830 {
831         struct vop_reclaim_args ap;
832         int error;
833
834         ap.a_head.a_desc = &vop_reclaim_desc;
835         ap.a_head.a_ops = ops;
836         ap.a_vp = vp;
837         ap.a_td = td;
838
839         DO_OPS(ops, error, &ap, vop_reclaim);
840         return(error);
841 }
842
843 int
844 vop_lock(struct vop_ops *ops, struct vnode *vp, struct lwkt_tokref *vlock,
845         int flags, struct thread *td)
846 {
847         struct vop_lock_args ap;
848         int error;
849
850         ap.a_head.a_desc = &vop_lock_desc;
851         ap.a_head.a_ops = ops;
852         ap.a_vp = vp;
853         ap.a_vlock = vlock;
854         ap.a_flags = flags;
855         ap.a_td = td;
856
857         DO_OPS(ops, error, &ap, vop_lock);
858         return(error);
859 }
860
861 int
862 vop_unlock(struct vop_ops *ops, struct vnode *vp, struct lwkt_tokref *vlock,
863         int flags, struct thread *td)
864 {
865         struct vop_unlock_args ap;
866         int error;
867
868         ap.a_head.a_desc = &vop_unlock_desc;
869         ap.a_head.a_ops = ops;
870         ap.a_vp = vp;
871         ap.a_vlock = vlock;
872         ap.a_flags = flags;
873         ap.a_td = td;
874
875         DO_OPS(ops, error, &ap, vop_unlock);
876         return(error);
877 }
878
879 int
880 vop_bmap(struct vop_ops *ops, struct vnode *vp, daddr_t bn, struct vnode **vpp,
881         daddr_t *bnp, int *runp, int *runb)
882 {
883         struct vop_bmap_args ap;
884         int error;
885
886         ap.a_head.a_desc = &vop_bmap_desc;
887         ap.a_head.a_ops = ops;
888         ap.a_vp = vp;
889         ap.a_bn = bn;
890         ap.a_vpp = vpp;
891         ap.a_bnp = bnp;
892         ap.a_runp = runp;
893         ap.a_runb = runb;
894
895         DO_OPS(ops, error, &ap, vop_bmap);
896         return(error);
897 }
898
899 int
900 vop_strategy(struct vop_ops *ops, struct vnode *vp, struct buf *bp)
901 {
902         struct vop_strategy_args ap;
903         int error;
904
905         ap.a_head.a_desc = &vop_strategy_desc;
906         ap.a_head.a_ops = ops;
907         ap.a_vp = vp;
908         ap.a_bp = bp;
909
910         DO_OPS(ops, error, &ap, vop_strategy);
911         return(error);
912 }
913
914 int
915 vop_print(struct vop_ops *ops, struct vnode *vp)
916 {
917         struct vop_print_args ap;
918         int error;
919
920         ap.a_head.a_desc = &vop_print_desc;
921         ap.a_head.a_ops = ops;
922         ap.a_vp = vp;
923
924         DO_OPS(ops, error, &ap, vop_print);
925         return(error);
926 }
927
928 int
929 vop_pathconf(struct vop_ops *ops, struct vnode *vp, int name,
930         register_t *retval)
931 {
932         struct vop_pathconf_args ap;
933         int error;
934
935         ap.a_head.a_desc = &vop_pathconf_desc;
936         ap.a_head.a_ops = ops;
937         ap.a_vp = vp;
938         ap.a_name = name;
939         ap.a_retval = retval;
940
941         DO_OPS(ops, error, &ap, vop_pathconf);
942         return(error);
943 }
944
945 int
946 vop_advlock(struct vop_ops *ops, struct vnode *vp, caddr_t id, int op,
947         struct flock *fl, int flags)
948 {
949         struct vop_advlock_args ap;
950         int error;
951
952         ap.a_head.a_desc = &vop_advlock_desc;
953         ap.a_head.a_ops = ops;
954         ap.a_vp = vp;
955         ap.a_id = id;
956         ap.a_op = op;
957         ap.a_fl = fl;
958         ap.a_flags = flags;
959
960         DO_OPS(ops, error, &ap, vop_advlock);
961         return(error);
962 }
963
964 int
965 vop_balloc(struct vop_ops *ops, struct vnode *vp, off_t startoffset,
966         int size, struct ucred *cred, int flags,
967         struct buf **bpp)
968 {
969         struct vop_balloc_args ap;
970         int error;
971
972         ap.a_head.a_desc = &vop_balloc_desc;
973         ap.a_head.a_ops = ops;
974         ap.a_vp = vp;
975         ap.a_startoffset = startoffset;
976         ap.a_size = size;
977         ap.a_cred = cred;
978         ap.a_flags = flags;
979         ap.a_bpp = bpp;
980
981         DO_OPS(ops, error, &ap, vop_balloc);
982         return(error);
983 }
984
985 int
986 vop_reallocblks(struct vop_ops *ops, struct vnode *vp,
987         struct cluster_save *buflist)
988 {
989         struct vop_reallocblks_args ap;
990         int error;
991
992         ap.a_head.a_desc = &vop_reallocblks_desc;
993         ap.a_head.a_ops = ops;
994         ap.a_vp = vp;
995         ap.a_buflist = buflist;
996
997         DO_OPS(ops, error, &ap, vop_reallocblks);
998         return(error);
999 }
1000
1001 int
1002 vop_getpages(struct vop_ops *ops, struct vnode *vp, vm_page_t *m, int count,
1003         int reqpage, vm_ooffset_t offset)
1004 {
1005         struct vop_getpages_args ap;
1006         int error;
1007
1008         ap.a_head.a_desc = &vop_getpages_desc;
1009         ap.a_head.a_ops = ops;
1010         ap.a_vp = vp;
1011         ap.a_m = m;
1012         ap.a_count = count;
1013         ap.a_reqpage = reqpage;
1014         ap.a_offset = offset;
1015
1016         DO_OPS(ops, error, &ap, vop_getpages);
1017         return(error);
1018 }
1019
1020 int
1021 vop_putpages(struct vop_ops *ops, struct vnode *vp, vm_page_t *m, int count,
1022         int sync, int *rtvals, vm_ooffset_t offset)
1023 {
1024         struct vop_putpages_args ap;
1025         int error;
1026
1027         ap.a_head.a_desc = &vop_putpages_desc;
1028         ap.a_head.a_ops = ops;
1029         ap.a_vp = vp;
1030         ap.a_m = m;
1031         ap.a_count = count;
1032         ap.a_sync = sync;
1033         ap.a_rtvals = rtvals;
1034         ap.a_offset = offset;
1035
1036         DO_OPS(ops, error, &ap, vop_putpages);
1037         return(error);
1038 }
1039
1040 int
1041 vop_freeblks(struct vop_ops *ops, struct vnode *vp,
1042         daddr_t addr, daddr_t length)
1043 {
1044         struct vop_freeblks_args ap;
1045         int error;
1046
1047         ap.a_head.a_desc = &vop_freeblks_desc;
1048         ap.a_head.a_ops = ops;
1049         ap.a_vp = vp;
1050         ap.a_addr = addr;
1051         ap.a_length = length;
1052
1053         DO_OPS(ops, error, &ap, vop_freeblks);
1054         return(error);
1055 }
1056
1057 int
1058 vop_bwrite(struct vop_ops *ops, struct vnode *vp, struct buf *bp)
1059 {
1060         struct vop_bwrite_args ap;
1061         int error;
1062
1063         ap.a_head.a_desc = &vop_bwrite_desc;
1064         ap.a_head.a_ops = ops;
1065         ap.a_vp = vp;
1066         ap.a_bp = bp;
1067
1068         DO_OPS(ops, error, &ap, vop_bwrite);
1069         return(error);
1070 }
1071
1072 int
1073 vop_getacl(struct vop_ops *ops, struct vnode *vp, acl_type_t type,
1074         struct acl *aclp, struct ucred *cred, struct thread *td)
1075 {
1076         struct vop_getacl_args ap;
1077         int error;
1078
1079         ap.a_head.a_desc = &vop_getacl_desc;
1080         ap.a_head.a_ops = ops;
1081         ap.a_vp = vp;
1082         ap.a_type = type;
1083         ap.a_aclp = aclp;
1084         ap.a_cred = cred;
1085         ap.a_td = td;
1086
1087         DO_OPS(ops, error, &ap, vop_getacl);
1088         return(error);
1089 }
1090
1091 int
1092 vop_setacl(struct vop_ops *ops, struct vnode *vp, acl_type_t type,
1093         struct acl *aclp, struct ucred *cred, struct thread *td)
1094 {
1095         struct vop_setacl_args ap;
1096         int error;
1097
1098         ap.a_head.a_desc = &vop_setacl_desc;
1099         ap.a_head.a_ops = ops;
1100         ap.a_vp = vp;
1101         ap.a_type = type;
1102         ap.a_aclp = aclp;
1103         ap.a_cred = cred;
1104         ap.a_td = td;
1105
1106         DO_OPS(ops, error, &ap, vop_setacl);
1107         return(error);
1108 }
1109
1110 int
1111 vop_aclcheck(struct vop_ops *ops, struct vnode *vp, acl_type_t type,
1112         struct acl *aclp, struct ucred *cred, struct thread *td)
1113 {
1114         struct vop_aclcheck_args ap;
1115         int error;
1116
1117         ap.a_head.a_desc = &vop_aclcheck_desc;
1118         ap.a_head.a_ops = ops;
1119         ap.a_vp = vp;
1120         ap.a_type = type;
1121         ap.a_aclp = aclp;
1122         ap.a_cred = cred;
1123         ap.a_td = td;
1124
1125         DO_OPS(ops, error, &ap, vop_aclcheck);
1126         return(error);
1127 }
1128
1129 int
1130 vop_getextattr(struct vop_ops *ops, struct vnode *vp, char *name, 
1131         struct uio *uio, struct ucred *cred, struct thread *td)
1132 {
1133         struct vop_getextattr_args ap;
1134         int error;
1135
1136         ap.a_head.a_desc = &vop_getextattr_desc;
1137         ap.a_head.a_ops = ops;
1138         ap.a_vp = vp;
1139         ap.a_name = name;
1140         ap.a_uio = uio;
1141         ap.a_cred = cred;
1142         ap.a_td = td;
1143
1144         DO_OPS(ops, error, &ap, vop_getextattr);
1145         return(error);
1146 }
1147
1148 int
1149 vop_setextattr(struct vop_ops *ops, struct vnode *vp, char *name, 
1150         struct uio *uio, struct ucred *cred, struct thread *td)
1151 {
1152         struct vop_setextattr_args ap;
1153         int error;
1154
1155         ap.a_head.a_desc = &vop_setextattr_desc;
1156         ap.a_head.a_ops = ops;
1157         ap.a_vp = vp;
1158         ap.a_name = name;
1159         ap.a_uio = uio;
1160         ap.a_cred = cred;
1161         ap.a_td = td;
1162
1163         DO_OPS(ops, error, &ap, vop_setextattr);
1164         return(error);
1165 }
1166
1167 int
1168 vop_createvobject(struct vop_ops *ops, struct vnode *vp, struct thread *td)
1169 {
1170         struct vop_createvobject_args ap;
1171         int error;
1172
1173         ap.a_head.a_desc = &vop_createvobject_desc;
1174         ap.a_head.a_ops = ops;
1175         ap.a_vp = vp;
1176         ap.a_td = td;
1177
1178         DO_OPS(ops, error, &ap, vop_createvobject);
1179         return(error);
1180 }
1181
1182 int
1183 vop_destroyvobject(struct vop_ops *ops, struct vnode *vp)
1184 {
1185         struct vop_destroyvobject_args ap;
1186         int error;
1187
1188         ap.a_head.a_desc = &vop_destroyvobject_desc;
1189         ap.a_head.a_ops = ops;
1190         ap.a_vp = vp;
1191
1192         DO_OPS(ops, error, &ap, vop_destroyvobject);
1193         return(error);
1194 }
1195
1196 int
1197 vop_getvobject(struct vop_ops *ops, struct vnode *vp, struct vm_object **objpp)
1198 {
1199         struct vop_getvobject_args ap;
1200         int error;
1201
1202         ap.a_head.a_desc = &vop_getvobject_desc;
1203         ap.a_head.a_ops = ops;
1204         ap.a_vp = vp;
1205         ap.a_objpp = objpp;
1206
1207         DO_OPS(ops, error, &ap, vop_getvobject);
1208         return(error);
1209 }
1210
1211 int
1212 vop_vfsset(struct vop_ops *ops, int op, const char *opstr)
1213 {
1214         struct vop_vfsset_args ap;
1215         int error;
1216
1217         ap.a_head.a_desc = &vop_vfsset_desc;
1218         ap.a_head.a_ops = ops;
1219         ap.a_op = op;
1220         ap.a_opstr = opstr;
1221
1222         DO_OPS(ops, error, &ap, vop_vfsset);
1223         return(error);
1224 }
1225
1226 /************************************************************************
1227  *              PRIMARY VNODE OPERATIONS FORWARDING CALLS               *
1228  ************************************************************************
1229  *
1230  * These procedures are called from VFSs such as unionfs and nullfs
1231  * when they wish to forward an operation on one VFS to another.  The
1232  * argument structure/message is modified and then directly passed to the
1233  * appropriate routine.  This routines may also be called by initiators
1234  * who have an argument structure in hand rather then discreet arguments.
1235  */
1236 int
1237 vop_vnoperate_ap(struct vop_generic_args *ap)
1238 {
1239         struct vop_ops *ops;
1240         int error;
1241
1242         ops = ap->a_ops;
1243         if (ops->vv_flags & VVF_HOOK_MASK) {
1244                 if (ops->vv_flags & VVF_JOURNAL_HOOK)
1245                         error = VOCALL(ops->vv_jops, ap);
1246                 else
1247                         error = 0;
1248                 if (error == 0)
1249                         error = VOCALL(ops, ap);
1250         } else {
1251                 error = VOCALL(ops, ap);
1252         }
1253         return (error);
1254 }
1255
1256 int
1257 vop_islocked_ap(struct vop_islocked_args *ap)
1258 {
1259         int error;
1260
1261         DO_OPS(ap->a_head.a_ops, error, ap, vop_islocked);
1262         return(error);
1263 }
1264
1265 int
1266 vop_resolve_ap(struct vop_resolve_args *ap)
1267 {
1268         int error;
1269
1270         DO_OPS(ap->a_head.a_ops, error, ap, vop_resolve);
1271         return(error);
1272 }
1273
1274
1275 int
1276 vop_lookup_ap(struct vop_lookup_args *ap)
1277 {
1278         int error;
1279
1280         DO_OPS(ap->a_head.a_ops, error, ap, vop_lookup);
1281         return(error);
1282 }
1283
1284 int
1285 vop_cachedlookup_ap(struct vop_cachedlookup_args *ap)
1286 {
1287         int error;
1288
1289         DO_OPS(ap->a_head.a_ops, error, ap, vop_cachedlookup);
1290         return(error);
1291 }
1292
1293 int
1294 vop_create_ap(struct vop_create_args *ap)
1295 {
1296         int error;
1297
1298         DO_OPS(ap->a_head.a_ops, error, ap, vop_create);
1299         return(error);
1300 }
1301
1302 int
1303 vop_whiteout_ap(struct vop_whiteout_args *ap)
1304 {
1305         int error;
1306
1307         DO_OPS(ap->a_head.a_ops, error, ap, vop_whiteout);
1308         return(error);
1309 }
1310
1311 int
1312 vop_mknod_ap(struct vop_mknod_args *ap)
1313 {
1314         int error;
1315
1316         DO_OPS(ap->a_head.a_ops, error, ap, vop_mknod);
1317         return(error);
1318 }
1319
1320 int
1321 vop_open_ap(struct vop_open_args *ap)
1322 {
1323         int error;
1324
1325         DO_OPS(ap->a_head.a_ops, error, ap, vop_open);
1326         return(error);
1327 }
1328
1329 int
1330 vop_close_ap(struct vop_close_args *ap)
1331 {
1332         int error;
1333
1334         DO_OPS(ap->a_head.a_ops, error, ap, vop_close);
1335         return(error);
1336 }
1337
1338 int
1339 vop_access_ap(struct vop_access_args *ap)
1340 {
1341         int error;
1342
1343         DO_OPS(ap->a_head.a_ops, error, ap, vop_access);
1344         return(error);
1345 }
1346
1347 int
1348 vop_getattr_ap(struct vop_getattr_args *ap)
1349 {
1350         int error;
1351
1352         DO_OPS(ap->a_head.a_ops, error, ap, vop_getattr);
1353         return(error);
1354 }
1355
1356 int
1357 vop_setattr_ap(struct vop_setattr_args *ap)
1358 {
1359         int error;
1360
1361         DO_OPS(ap->a_head.a_ops, error, ap, vop_setattr);
1362         return(error);
1363 }
1364
1365 int
1366 vop_read_ap(struct vop_read_args *ap)
1367 {
1368         int error;
1369
1370         DO_OPS(ap->a_head.a_ops, error, ap, vop_read);
1371         return(error);
1372 }
1373
1374 int
1375 vop_write_ap(struct vop_write_args *ap)
1376 {
1377         int error;
1378
1379         DO_OPS(ap->a_head.a_ops, error, ap, vop_write);
1380         return(error);
1381 }
1382
1383 int
1384 vop_lease_ap(struct vop_lease_args *ap)
1385 {
1386         int error;
1387
1388         DO_OPS(ap->a_head.a_ops, error, ap, vop_lease);
1389         return(error);
1390 }
1391
1392 int
1393 vop_ioctl_ap(struct vop_ioctl_args *ap)
1394 {
1395         int error;
1396
1397         DO_OPS(ap->a_head.a_ops, error, ap, vop_ioctl);
1398         return(error);
1399 }
1400
1401 int
1402 vop_poll_ap(struct vop_poll_args *ap)
1403 {
1404         int error;
1405
1406         DO_OPS(ap->a_head.a_ops, error, ap, vop_poll);
1407         return(error);
1408 }
1409
1410 int
1411 vop_kqfilter_ap(struct vop_kqfilter_args *ap)
1412 {
1413         int error;
1414
1415         DO_OPS(ap->a_head.a_ops, error, ap, vop_kqfilter);
1416         return(error);
1417 }
1418
1419 int
1420 vop_revoke_ap(struct vop_revoke_args *ap)
1421 {
1422         int error;
1423
1424         DO_OPS(ap->a_head.a_ops, error, ap, vop_revoke);
1425         return(error);
1426 }
1427
1428 int
1429 vop_mmap_ap(struct vop_mmap_args *ap)
1430 {
1431         int error;
1432
1433         DO_OPS(ap->a_head.a_ops, error, ap, vop_mmap);
1434         return(error);
1435 }
1436
1437 int
1438 vop_fsync_ap(struct vop_fsync_args *ap)
1439 {
1440         int error;
1441
1442         DO_OPS(ap->a_head.a_ops, error, ap, vop_fsync);
1443         return(error);
1444 }
1445
1446 int
1447 vop_remove_ap(struct vop_remove_args *ap)
1448 {
1449         int error;
1450
1451         DO_OPS(ap->a_head.a_ops, error, ap, vop_remove);
1452         return(error);
1453 }
1454
1455 int
1456 vop_nremove_ap(struct vop_nremove_args *ap)
1457 {
1458         int error;
1459
1460         DO_OPS(ap->a_head.a_ops, error, ap, vop_nremove);
1461         return(error);
1462 }
1463
1464 int
1465 vop_link_ap(struct vop_link_args *ap)
1466 {
1467         int error;
1468
1469         DO_OPS(ap->a_head.a_ops, error, ap, vop_link);
1470         return(error);
1471 }
1472
1473 int
1474 vop_rename_ap(struct vop_rename_args *ap)
1475 {
1476         int error;
1477
1478         DO_OPS(ap->a_head.a_ops, error, ap, vop_rename);
1479         return(error);
1480 }
1481
1482 int
1483 vop_mkdir_ap(struct vop_mkdir_args *ap)
1484 {
1485         int error;
1486
1487         DO_OPS(ap->a_head.a_ops, error, ap, vop_mkdir);
1488         return(error);
1489 }
1490
1491 int
1492 vop_rmdir_ap(struct vop_rmdir_args *ap)
1493 {
1494         int error;
1495
1496         DO_OPS(ap->a_head.a_ops, error, ap, vop_rmdir);
1497         return(error);
1498 }
1499
1500 int
1501 vop_symlink_ap(struct vop_symlink_args *ap)
1502 {
1503         int error;
1504
1505         DO_OPS(ap->a_head.a_ops, error, ap, vop_symlink);
1506         return(error);
1507 }
1508
1509 int
1510 vop_readdir_ap(struct vop_readdir_args *ap)
1511 {
1512         int error;
1513
1514         DO_OPS(ap->a_head.a_ops, error, ap, vop_readdir);
1515         return(error);
1516 }
1517
1518 int
1519 vop_readlink_ap(struct vop_readlink_args *ap)
1520 {
1521         int error;
1522
1523         DO_OPS(ap->a_head.a_ops, error, ap, vop_readlink);
1524         return(error);
1525 }
1526
1527 int
1528 vop_inactive_ap(struct vop_inactive_args *ap)
1529 {
1530         int error;
1531
1532         DO_OPS(ap->a_head.a_ops, error, ap, vop_inactive);
1533         return(error);
1534 }
1535
1536 int
1537 vop_reclaim_ap(struct vop_reclaim_args *ap)
1538 {
1539         int error;
1540
1541         DO_OPS(ap->a_head.a_ops, error, ap, vop_reclaim);
1542         return(error);
1543 }
1544
1545 int
1546 vop_lock_ap(struct vop_lock_args *ap)
1547 {
1548         int error;
1549
1550         DO_OPS(ap->a_head.a_ops, error, ap, vop_lock);
1551         return(error);
1552 }
1553
1554 int
1555 vop_unlock_ap(struct vop_unlock_args *ap)
1556 {
1557         int error;
1558
1559         DO_OPS(ap->a_head.a_ops, error, ap, vop_unlock);
1560         return(error);
1561 }
1562
1563 int
1564 vop_bmap_ap(struct vop_bmap_args *ap)
1565 {
1566         int error;
1567
1568         DO_OPS(ap->a_head.a_ops, error, ap, vop_bmap);
1569         return(error);
1570 }
1571
1572 int
1573 vop_strategy_ap(struct vop_strategy_args *ap)
1574 {
1575         int error;
1576
1577         DO_OPS(ap->a_head.a_ops, error, ap, vop_strategy);
1578         return(error);
1579 }
1580
1581 int
1582 vop_print_ap(struct vop_print_args *ap)
1583 {
1584         int error;
1585
1586         DO_OPS(ap->a_head.a_ops, error, ap, vop_print);
1587         return(error);
1588 }
1589
1590 int
1591 vop_pathconf_ap(struct vop_pathconf_args *ap)
1592 {
1593         int error;
1594
1595         DO_OPS(ap->a_head.a_ops, error, ap, vop_pathconf);
1596         return(error);
1597 }
1598
1599 int
1600 vop_advlock_ap(struct vop_advlock_args *ap)
1601 {
1602         int error;
1603
1604         DO_OPS(ap->a_head.a_ops, error, ap, vop_advlock);
1605         return(error);
1606 }
1607
1608 int
1609 vop_balloc_ap(struct vop_balloc_args *ap)
1610 {
1611         int error;
1612
1613         DO_OPS(ap->a_head.a_ops, error, ap, vop_balloc);
1614         return(error);
1615 }
1616
1617 int
1618 vop_reallocblks_ap(struct vop_reallocblks_args *ap)
1619 {
1620         int error;
1621
1622         DO_OPS(ap->a_head.a_ops, error, ap, vop_reallocblks);
1623         return(error);
1624 }
1625
1626 int
1627 vop_getpages_ap(struct vop_getpages_args *ap)
1628 {
1629         int error;
1630
1631         DO_OPS(ap->a_head.a_ops, error, ap, vop_getpages);
1632         return(error);
1633 }
1634
1635 int
1636 vop_putpages_ap(struct vop_putpages_args *ap)
1637 {
1638         int error;
1639
1640         DO_OPS(ap->a_head.a_ops, error, ap, vop_putpages);
1641         return(error);
1642 }
1643
1644 int
1645 vop_freeblks_ap(struct vop_freeblks_args *ap)
1646 {
1647         int error;
1648
1649         DO_OPS(ap->a_head.a_ops, error, ap, vop_freeblks);
1650         return(error);
1651 }
1652
1653 int
1654 vop_bwrite_ap(struct vop_bwrite_args *ap)
1655 {
1656         int error;
1657
1658         DO_OPS(ap->a_head.a_ops, error, ap, vop_bwrite);
1659         return(error);
1660 }
1661
1662 int
1663 vop_getacl_ap(struct vop_getacl_args *ap)
1664 {
1665         int error;
1666
1667         DO_OPS(ap->a_head.a_ops, error, ap, vop_getacl);
1668         return(error);
1669 }
1670
1671 int
1672 vop_setacl_ap(struct vop_setacl_args *ap)
1673 {
1674         int error;
1675
1676         DO_OPS(ap->a_head.a_ops, error, ap, vop_setacl);
1677         return(error);
1678 }
1679
1680 int
1681 vop_aclcheck_ap(struct vop_aclcheck_args *ap)
1682 {
1683         int error;
1684
1685         DO_OPS(ap->a_head.a_ops, error, ap, vop_aclcheck);
1686         return(error);
1687 }
1688
1689 int
1690 vop_getextattr_ap(struct vop_getextattr_args *ap)
1691 {
1692         int error;
1693
1694         DO_OPS(ap->a_head.a_ops, error, ap, vop_getextattr);
1695         return(error);
1696 }
1697
1698 int
1699 vop_setextattr_ap(struct vop_setextattr_args *ap)
1700 {
1701         int error;
1702
1703         DO_OPS(ap->a_head.a_ops, error, ap, vop_setextattr);
1704         return(error);
1705 }
1706
1707 int
1708 vop_createvobject_ap(struct vop_createvobject_args *ap)
1709 {
1710         int error;
1711
1712         DO_OPS(ap->a_head.a_ops, error, ap, vop_createvobject);
1713         return(error);
1714 }
1715
1716 int
1717 vop_destroyvobject_ap(struct vop_destroyvobject_args *ap)
1718 {
1719         int error;
1720
1721         DO_OPS(ap->a_head.a_ops, error, ap, vop_destroyvobject);
1722         return(error);
1723 }
1724
1725 int
1726 vop_getvobject_ap(struct vop_getvobject_args *ap)
1727 {
1728         int error;
1729
1730         DO_OPS(ap->a_head.a_ops, error, ap, vop_getvobject);
1731         return(error);
1732 }
1733
1734 int
1735 vop_vfsset_ap(struct vop_vfsset_args *ap)
1736 {
1737         int error;
1738
1739         DO_OPS(ap->a_head.a_ops, error, ap, vop_vfsset);
1740         return(error);
1741 }
1742