3 * Copyright (c) 2004 The DragonFly Project. All rights reserved.
5 * This code is derived from software contributed to The DragonFly Project
6 * by Matthew Dillon <dillon@backplane.com>
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
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
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.
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
35 * $DragonFly: src/sys/kern/vfs_vopops.c,v 1.17 2006/02/17 19:18:06 dillon Exp $
38 #include <sys/param.h>
39 #include <sys/systm.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>
50 #include <sys/mount.h>
52 #include <sys/namei.h>
53 #include <sys/reboot.h>
54 #include <sys/socket.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>
62 #include <machine/limits.h>
65 #include <vm/vm_object.h>
66 #include <vm/vm_extern.h>
67 #include <vm/vm_kern.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>
76 #include <sys/thread2.h>
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)
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 }
87 #define VNODEOP_DESC_INIT_SIMPLE(name) \
88 VNODEOP_DESC_INIT(name, 0, NULL, \
94 #define VNODEOP_DESC_INIT_VP(name) \
95 static int VOFFNAME(name)[] = { \
96 __offsetof(VARGSSTRUCT(name), a_vp), \
98 VNODEOP_DESC_INIT(name, 0, VOFFNAME(name), \
104 #define VNODEOP_DESC_INIT_VP_VPP(name) \
105 static int VOFFNAME(name)[] = { \
106 __offsetof(VARGSSTRUCT(name), a_vp), \
108 VNODEOP_DESC_INIT(name, 0, VOFFNAME(name), \
109 __offsetof(VARGSSTRUCT(name), a_vpp), \
114 #define VNODEOP_DESC_INIT_VP_CRED(name) \
115 static int VOFFNAME(name)[] = { \
116 __offsetof(VARGSSTRUCT(name), a_vp), \
118 VNODEOP_DESC_INIT(name, 0, VOFFNAME(name), \
120 __offsetof(VARGSSTRUCT(name), a_cred), \
124 #define VNODEOP_DESC_INIT_NCP(name) \
125 VNODEOP_DESC_INIT(name, 0, NULL, \
131 #define VNODEOP_DESC_INIT_NCP2_CRED(name) \
132 VNODEOP_DESC_INIT(name, 0, NULL, \
134 __offsetof(VARGSSTRUCT(name), a_cred), \
138 #define VNODEOP_DESC_INIT_NCP_CRED(name) \
139 VNODEOP_DESC_INIT(name, 0, NULL, \
141 __offsetof(VARGSSTRUCT(name), a_cred), \
145 #define VNODEOP_DESC_INIT_NCP_VP_CRED(name) \
146 static int VOFFNAME(name)[] = { \
147 __offsetof(VARGSSTRUCT(name), a_vp), \
149 VNODEOP_DESC_INIT(name, 0, VOFFNAME(name), \
151 __offsetof(VARGSSTRUCT(name), a_cred), \
155 #define VNODEOP_DESC_INIT_NCP_CRED_VPP(name) \
156 VNODEOP_DESC_INIT(name, 0, NULL, \
157 __offsetof(VARGSSTRUCT(name), a_vpp), \
158 __offsetof(VARGSSTRUCT(name), a_cred), \
162 #define VNODEOP_DESC_INIT_DVP_VPP_CNP(name) \
163 static int VOFFNAME(name)[] = { \
164 __offsetof(VARGSSTRUCT(name), a_dvp), \
166 VNODEOP_DESC_INIT(name, 0, VOFFNAME(name), \
167 __offsetof(VARGSSTRUCT(name), a_vpp), \
170 __offsetof(VARGSSTRUCT(name), a_cnp))
172 #define VNODEOP_DESC_INIT_DVP_VPP_CRED(name) \
173 static int VOFFNAME(name)[] = { \
174 __offsetof(VARGSSTRUCT(name), a_dvp), \
176 VNODEOP_DESC_INIT(name, 0, VOFFNAME(name), \
177 __offsetof(VARGSSTRUCT(name), a_vpp), \
178 __offsetof(VARGSSTRUCT(name), a_cred), \
182 #define VNODEOP_DESC_INIT_DVP_CNP(name) \
183 static int VOFFNAME(name)[] = { \
184 __offsetof(VARGSSTRUCT(name), a_dvp), \
186 VNODEOP_DESC_INIT(name, 0, VOFFNAME(name), \
190 __offsetof(VARGSSTRUCT(name), a_cnp))
192 #define VNODEOP_DESC_INIT_DVP_VP_CNP(name) \
193 static int VOFFNAME(name)[] = { \
194 __offsetof(VARGSSTRUCT(name), a_dvp), \
195 __offsetof(VARGSSTRUCT(name), a_vp), \
197 VNODEOP_DESC_INIT(name, 0, VOFFNAME(name), \
201 __offsetof(VARGSSTRUCT(name), a_cnp))
203 #define VNODEOP_DESC_INIT_TDVP_VP_CNP(name) \
204 static int VOFFNAME(name)[] = { \
205 __offsetof(VARGSSTRUCT(name), a_tdvp), \
206 __offsetof(VARGSSTRUCT(name), a_vp), \
208 VNODEOP_DESC_INIT(name, 0, VOFFNAME(name), \
212 __offsetof(VARGSSTRUCT(name), a_cnp))
214 VNODEOP_DESC_INIT_SIMPLE(default);
215 VNODEOP_DESC_INIT_VP(islocked
);
216 VNODEOP_DESC_INIT_DVP_VPP_CNP(old_lookup
);
217 VNODEOP_DESC_INIT_DVP_VPP_CNP(old_create
);
218 VNODEOP_DESC_INIT_DVP_CNP(old_whiteout
);
219 VNODEOP_DESC_INIT_DVP_VPP_CNP(old_mknod
);
220 VNODEOP_DESC_INIT_VP_CRED(open
);
221 VNODEOP_DESC_INIT_VP(close
);
222 VNODEOP_DESC_INIT_VP_CRED(access
);
223 VNODEOP_DESC_INIT_VP(getattr
);
224 VNODEOP_DESC_INIT_VP_CRED(setattr
);
225 VNODEOP_DESC_INIT_VP_CRED(read
);
226 VNODEOP_DESC_INIT_VP_CRED(write
);
227 VNODEOP_DESC_INIT_VP_CRED(lease
);
228 VNODEOP_DESC_INIT_VP_CRED(ioctl
);
229 VNODEOP_DESC_INIT_VP_CRED(poll
);
230 VNODEOP_DESC_INIT_VP(kqfilter
);
231 VNODEOP_DESC_INIT_VP(revoke
);
232 VNODEOP_DESC_INIT_VP_CRED(mmap
);
233 VNODEOP_DESC_INIT_VP(fsync
);
234 VNODEOP_DESC_INIT_DVP_VP_CNP(old_remove
);
235 VNODEOP_DESC_INIT_TDVP_VP_CNP(old_link
);
237 static int VOFFNAME(old_rename
)[] = {
238 __offsetof(VARGSSTRUCT(old_rename
), a_fdvp
),
239 __offsetof(VARGSSTRUCT(old_rename
), a_fvp
),
240 __offsetof(VARGSSTRUCT(old_rename
), a_tdvp
),
241 __offsetof(VARGSSTRUCT(old_rename
), a_tvp
),
244 VNODEOP_DESC_INIT(old_rename
,
245 VDESC_VP0_WILLRELE
|VDESC_VP1_WILLRELE
|
246 VDESC_VP2_WILLRELE
|VDESC_VP3_WILLRELE
|
247 VDESC_VP2_WILLUNLOCK
|VDESC_VP3_WILLUNLOCK
, /* tdvp and tvp */
248 VOFFNAME(old_rename
),
252 __offsetof(VARGSSTRUCT(old_rename
), a_fcnp
));
254 VNODEOP_DESC_INIT_DVP_VPP_CNP(old_mkdir
);
255 VNODEOP_DESC_INIT_DVP_VP_CNP(old_rmdir
);
256 VNODEOP_DESC_INIT_DVP_VPP_CNP(old_symlink
);
257 VNODEOP_DESC_INIT_VP_CRED(readdir
);
258 VNODEOP_DESC_INIT_VP_CRED(readlink
);
259 VNODEOP_DESC_INIT_VP(inactive
);
260 VNODEOP_DESC_INIT_VP(reclaim
);
261 VNODEOP_DESC_INIT_VP(lock
);
262 VNODEOP_DESC_INIT_VP(unlock
);
263 VNODEOP_DESC_INIT_VP_VPP(bmap
);
264 VNODEOP_DESC_INIT_VP(strategy
);
265 VNODEOP_DESC_INIT_VP(print
);
266 VNODEOP_DESC_INIT_VP(pathconf
);
267 VNODEOP_DESC_INIT_VP(advlock
);
268 VNODEOP_DESC_INIT_VP_CRED(balloc
);
269 VNODEOP_DESC_INIT_VP(reallocblks
);
270 VNODEOP_DESC_INIT_VP(getpages
);
271 VNODEOP_DESC_INIT_VP(putpages
);
272 VNODEOP_DESC_INIT_VP(freeblks
);
273 VNODEOP_DESC_INIT_VP(bwrite
);
274 VNODEOP_DESC_INIT_VP_CRED(getacl
);
275 VNODEOP_DESC_INIT_VP_CRED(setacl
);
276 VNODEOP_DESC_INIT_VP_CRED(aclcheck
);
277 VNODEOP_DESC_INIT_VP_CRED(getextattr
);
278 VNODEOP_DESC_INIT_VP_CRED(setextattr
);
279 VNODEOP_DESC_INIT_VP(createvobject
);
280 VNODEOP_DESC_INIT_VP(destroyvobject
);
281 VNODEOP_DESC_INIT_VP(getvobject
);
282 VNODEOP_DESC_INIT_SIMPLE(mountctl
);
284 VNODEOP_DESC_INIT_NCP_CRED(nresolve
);
285 VNODEOP_DESC_INIT_DVP_VPP_CRED(nlookupdotdot
);
286 VNODEOP_DESC_INIT_NCP_CRED_VPP(ncreate
);
287 VNODEOP_DESC_INIT_NCP_CRED_VPP(nmkdir
);
288 VNODEOP_DESC_INIT_NCP_CRED_VPP(nmknod
);
289 VNODEOP_DESC_INIT_NCP_VP_CRED(nlink
);
290 VNODEOP_DESC_INIT_NCP_CRED_VPP(nsymlink
);
291 VNODEOP_DESC_INIT_NCP_CRED(nwhiteout
);
292 VNODEOP_DESC_INIT_NCP_CRED(nremove
);
293 VNODEOP_DESC_INIT_NCP_CRED(nrmdir
);
294 VNODEOP_DESC_INIT_NCP2_CRED(nrename
);
296 #define DO_OPS(ops, error, ap, vop_field) \
297 error = ops->vop_field(ap);
299 /************************************************************************
300 * PRIMARY HIGH LEVEL VNODE OPERATIONS CALLS *
301 ************************************************************************
303 * These procedures are called directly from the kernel and/or fileops
304 * code to perform file/device operations on the system.
306 * NOTE: The old namespace api functions such as vop_rename() are no longer
307 * available for general use and have been renamed to vop_old_*(). Only
308 * the code in vfs_default.c is allowed to call those ops.
312 vop_islocked(struct vop_ops
*ops
, struct vnode
*vp
, struct thread
*td
)
314 struct vop_islocked_args ap
;
317 ap
.a_head
.a_desc
= &vop_islocked_desc
;
318 ap
.a_head
.a_ops
= ops
;
322 DO_OPS(ops
, error
, &ap
, vop_islocked
);
327 vop_old_lookup(struct vop_ops
*ops
, struct vnode
*dvp
,
328 struct vnode
**vpp
, struct componentname
*cnp
)
330 struct vop_old_lookup_args ap
;
333 ap
.a_head
.a_desc
= &vop_old_lookup_desc
;
334 ap
.a_head
.a_ops
= ops
;
339 DO_OPS(ops
, error
, &ap
, vop_old_lookup
);
344 vop_old_create(struct vop_ops
*ops
, struct vnode
*dvp
,
345 struct vnode
**vpp
, struct componentname
*cnp
, struct vattr
*vap
)
347 struct vop_old_create_args ap
;
350 ap
.a_head
.a_desc
= &vop_old_create_desc
;
351 ap
.a_head
.a_ops
= ops
;
357 DO_OPS(ops
, error
, &ap
, vop_old_create
);
362 vop_old_whiteout(struct vop_ops
*ops
, struct vnode
*dvp
,
363 struct componentname
*cnp
, int flags
)
365 struct vop_old_whiteout_args ap
;
368 ap
.a_head
.a_desc
= &vop_old_whiteout_desc
;
369 ap
.a_head
.a_ops
= ops
;
374 DO_OPS(ops
, error
, &ap
, vop_old_whiteout
);
379 vop_old_mknod(struct vop_ops
*ops
, struct vnode
*dvp
,
380 struct vnode
**vpp
, struct componentname
*cnp
, struct vattr
*vap
)
382 struct vop_old_mknod_args ap
;
385 ap
.a_head
.a_desc
= &vop_old_mknod_desc
;
386 ap
.a_head
.a_ops
= ops
;
392 DO_OPS(ops
, error
, &ap
, vop_old_mknod
);
397 vop_open(struct vop_ops
*ops
, struct vnode
*vp
, int mode
, struct ucred
*cred
,
398 struct file
*fp
, struct thread
*td
)
400 struct vop_open_args ap
;
403 ap
.a_head
.a_desc
= &vop_open_desc
;
404 ap
.a_head
.a_ops
= ops
;
411 DO_OPS(ops
, error
, &ap
, vop_open
);
416 vop_close(struct vop_ops
*ops
, struct vnode
*vp
, int fflag
, struct thread
*td
)
418 struct vop_close_args ap
;
421 ap
.a_head
.a_desc
= &vop_close_desc
;
422 ap
.a_head
.a_ops
= ops
;
427 DO_OPS(ops
, error
, &ap
, vop_close
);
432 vop_access(struct vop_ops
*ops
, struct vnode
*vp
, int mode
, struct ucred
*cred
,
435 struct vop_access_args ap
;
438 ap
.a_head
.a_desc
= &vop_access_desc
;
439 ap
.a_head
.a_ops
= ops
;
445 DO_OPS(ops
, error
, &ap
, vop_access
);
450 vop_getattr(struct vop_ops
*ops
, struct vnode
*vp
, struct vattr
*vap
,
453 struct vop_getattr_args ap
;
454 struct namecache
*ncp
;
457 ap
.a_head
.a_desc
= &vop_getattr_desc
;
458 ap
.a_head
.a_ops
= ops
;
463 DO_OPS(ops
, error
, &ap
, vop_getattr
);
464 if ((ops
->vv_flags
& VVF_SUPPORTS_FSMID
) == 0) {
465 if ((ncp
= TAILQ_FIRST(&vp
->v_namecache
)) != NULL
) {
466 if (ncp
->nc_flag
& NCF_FSMID
) {
467 ncp
->nc_flag
&= ~NCF_FSMID
;
470 vap
->va_fsmid
= ncp
->nc_fsmid
;
477 vop_setattr(struct vop_ops
*ops
, struct vnode
*vp
, struct vattr
*vap
,
478 struct ucred
*cred
, struct thread
*td
)
480 struct vop_setattr_args ap
;
483 ap
.a_head
.a_desc
= &vop_setattr_desc
;
484 ap
.a_head
.a_ops
= ops
;
490 DO_OPS(ops
, error
, &ap
, vop_setattr
);
492 cache_update_fsmid_vp(vp
);
497 vop_read(struct vop_ops
*ops
, struct vnode
*vp
, struct uio
*uio
, int ioflag
,
500 struct vop_read_args ap
;
503 ap
.a_head
.a_desc
= &vop_read_desc
;
504 ap
.a_head
.a_ops
= ops
;
507 ap
.a_ioflag
= ioflag
;
510 DO_OPS(ops
, error
, &ap
, vop_read
);
515 vop_write(struct vop_ops
*ops
, struct vnode
*vp
, struct uio
*uio
, int ioflag
,
518 struct vop_write_args ap
;
521 ap
.a_head
.a_desc
= &vop_write_desc
;
522 ap
.a_head
.a_ops
= ops
;
525 ap
.a_ioflag
= ioflag
;
528 DO_OPS(ops
, error
, &ap
, vop_write
);
530 cache_update_fsmid_vp(vp
);
535 vop_lease(struct vop_ops
*ops
, struct vnode
*vp
, struct thread
*td
,
536 struct ucred
*cred
, int flag
)
538 struct vop_lease_args ap
;
541 ap
.a_head
.a_desc
= &vop_lease_desc
;
542 ap
.a_head
.a_ops
= ops
;
548 DO_OPS(ops
, error
, &ap
, vop_lease
);
553 vop_ioctl(struct vop_ops
*ops
, struct vnode
*vp
, u_long command
, caddr_t data
,
554 int fflag
, struct ucred
*cred
,
557 struct vop_ioctl_args ap
;
560 ap
.a_head
.a_desc
= &vop_ioctl_desc
;
561 ap
.a_head
.a_ops
= ops
;
563 ap
.a_command
= command
;
569 DO_OPS(ops
, error
, &ap
, vop_ioctl
);
574 vop_poll(struct vop_ops
*ops
, struct vnode
*vp
, int events
, struct ucred
*cred
,
577 struct vop_poll_args ap
;
580 ap
.a_head
.a_desc
= &vop_poll_desc
;
581 ap
.a_head
.a_ops
= ops
;
583 ap
.a_events
= events
;
587 DO_OPS(ops
, error
, &ap
, vop_poll
);
592 vop_kqfilter(struct vop_ops
*ops
, struct vnode
*vp
, struct knote
*kn
)
594 struct vop_kqfilter_args ap
;
597 ap
.a_head
.a_desc
= &vop_kqfilter_desc
;
598 ap
.a_head
.a_ops
= ops
;
602 DO_OPS(ops
, error
, &ap
, vop_kqfilter
);
607 vop_revoke(struct vop_ops
*ops
, struct vnode
*vp
, int flags
)
609 struct vop_revoke_args ap
;
612 ap
.a_head
.a_desc
= &vop_revoke_desc
;
613 ap
.a_head
.a_ops
= ops
;
617 DO_OPS(ops
, error
, &ap
, vop_revoke
);
622 vop_mmap(struct vop_ops
*ops
, struct vnode
*vp
, int fflags
, struct ucred
*cred
,
625 struct vop_mmap_args ap
;
628 ap
.a_head
.a_desc
= &vop_mmap_desc
;
629 ap
.a_head
.a_ops
= ops
;
631 ap
.a_fflags
= fflags
;
635 DO_OPS(ops
, error
, &ap
, vop_mmap
);
640 vop_fsync(struct vop_ops
*ops
, struct vnode
*vp
, int waitfor
, struct thread
*td
)
642 struct vop_fsync_args ap
;
645 ap
.a_head
.a_desc
= &vop_fsync_desc
;
646 ap
.a_head
.a_ops
= ops
;
648 ap
.a_waitfor
= waitfor
;
651 DO_OPS(ops
, error
, &ap
, vop_fsync
);
656 vop_old_remove(struct vop_ops
*ops
, struct vnode
*dvp
,
657 struct vnode
*vp
, struct componentname
*cnp
)
659 struct vop_old_remove_args ap
;
662 ap
.a_head
.a_desc
= &vop_old_remove_desc
;
663 ap
.a_head
.a_ops
= ops
;
668 DO_OPS(ops
, error
, &ap
, vop_old_remove
);
673 vop_old_link(struct vop_ops
*ops
, struct vnode
*tdvp
,
674 struct vnode
*vp
, struct componentname
*cnp
)
676 struct vop_old_link_args ap
;
679 ap
.a_head
.a_desc
= &vop_old_link_desc
;
680 ap
.a_head
.a_ops
= ops
;
685 DO_OPS(ops
, error
, &ap
, vop_old_link
);
690 vop_old_rename(struct vop_ops
*ops
,
691 struct vnode
*fdvp
, struct vnode
*fvp
, struct componentname
*fcnp
,
692 struct vnode
*tdvp
, struct vnode
*tvp
, struct componentname
*tcnp
)
694 struct vop_old_rename_args ap
;
697 ap
.a_head
.a_desc
= &vop_old_rename_desc
;
698 ap
.a_head
.a_ops
= ops
;
706 DO_OPS(ops
, error
, &ap
, vop_old_rename
);
711 vop_old_mkdir(struct vop_ops
*ops
, struct vnode
*dvp
,
712 struct vnode
**vpp
, struct componentname
*cnp
, struct vattr
*vap
)
714 struct vop_old_mkdir_args ap
;
717 ap
.a_head
.a_desc
= &vop_old_mkdir_desc
;
718 ap
.a_head
.a_ops
= ops
;
724 DO_OPS(ops
, error
, &ap
, vop_old_mkdir
);
729 vop_old_rmdir(struct vop_ops
*ops
, struct vnode
*dvp
,
730 struct vnode
*vp
, struct componentname
*cnp
)
732 struct vop_old_rmdir_args ap
;
735 ap
.a_head
.a_desc
= &vop_old_rmdir_desc
;
736 ap
.a_head
.a_ops
= ops
;
741 DO_OPS(ops
, error
, &ap
, vop_old_rmdir
);
746 vop_old_symlink(struct vop_ops
*ops
, struct vnode
*dvp
,
747 struct vnode
**vpp
, struct componentname
*cnp
,
748 struct vattr
*vap
, char *target
)
750 struct vop_old_symlink_args ap
;
753 ap
.a_head
.a_desc
= &vop_old_symlink_desc
;
754 ap
.a_head
.a_ops
= ops
;
759 ap
.a_target
= target
;
761 DO_OPS(ops
, error
, &ap
, vop_old_symlink
);
766 vop_readdir(struct vop_ops
*ops
, struct vnode
*vp
, struct uio
*uio
,
767 struct ucred
*cred
, int *eofflag
, int *ncookies
, u_long
**cookies
)
769 struct vop_readdir_args ap
;
772 ap
.a_head
.a_desc
= &vop_readdir_desc
;
773 ap
.a_head
.a_ops
= ops
;
777 ap
.a_eofflag
= eofflag
;
778 ap
.a_ncookies
= ncookies
;
779 ap
.a_cookies
= cookies
;
781 DO_OPS(ops
, error
, &ap
, vop_readdir
);
786 vop_readlink(struct vop_ops
*ops
, struct vnode
*vp
, struct uio
*uio
,
789 struct vop_readlink_args ap
;
792 ap
.a_head
.a_desc
= &vop_readlink_desc
;
793 ap
.a_head
.a_ops
= ops
;
798 DO_OPS(ops
, error
, &ap
, vop_readlink
);
803 vop_inactive(struct vop_ops
*ops
, struct vnode
*vp
, struct thread
*td
)
805 struct vop_inactive_args ap
;
808 ap
.a_head
.a_desc
= &vop_inactive_desc
;
809 ap
.a_head
.a_ops
= ops
;
813 DO_OPS(ops
, error
, &ap
, vop_inactive
);
818 vop_reclaim(struct vop_ops
*ops
, struct vnode
*vp
, int retflags
, struct thread
*td
)
820 struct vop_reclaim_args ap
;
823 ap
.a_head
.a_desc
= &vop_reclaim_desc
;
824 ap
.a_head
.a_ops
= ops
;
827 ap
.a_retflags
= retflags
; /* return to filesystem inode */
829 DO_OPS(ops
, error
, &ap
, vop_reclaim
);
834 vop_lock(struct vop_ops
*ops
, struct vnode
*vp
, int flags
, struct thread
*td
)
836 struct vop_lock_args ap
;
839 ap
.a_head
.a_desc
= &vop_lock_desc
;
840 ap
.a_head
.a_ops
= ops
;
845 DO_OPS(ops
, error
, &ap
, vop_lock
);
850 vop_unlock(struct vop_ops
*ops
, struct vnode
*vp
, int flags
, struct thread
*td
)
852 struct vop_unlock_args ap
;
855 ap
.a_head
.a_desc
= &vop_unlock_desc
;
856 ap
.a_head
.a_ops
= ops
;
861 DO_OPS(ops
, error
, &ap
, vop_unlock
);
866 vop_bmap(struct vop_ops
*ops
, struct vnode
*vp
, daddr_t bn
, struct vnode
**vpp
,
867 daddr_t
*bnp
, int *runp
, int *runb
)
869 struct vop_bmap_args ap
;
872 ap
.a_head
.a_desc
= &vop_bmap_desc
;
873 ap
.a_head
.a_ops
= ops
;
881 DO_OPS(ops
, error
, &ap
, vop_bmap
);
886 vop_strategy(struct vop_ops
*ops
, struct vnode
*vp
, struct bio
*bio
)
888 struct vop_strategy_args ap
;
891 ap
.a_head
.a_desc
= &vop_strategy_desc
;
892 ap
.a_head
.a_ops
= ops
;
896 DO_OPS(ops
, error
, &ap
, vop_strategy
);
897 if (error
== 0 && (bio
->bio_buf
->b_flags
& B_READ
) == 0)
898 cache_update_fsmid_vp(vp
);
903 vop_print(struct vop_ops
*ops
, struct vnode
*vp
)
905 struct vop_print_args ap
;
908 ap
.a_head
.a_desc
= &vop_print_desc
;
909 ap
.a_head
.a_ops
= ops
;
912 DO_OPS(ops
, error
, &ap
, vop_print
);
917 vop_pathconf(struct vop_ops
*ops
, struct vnode
*vp
, int name
,
920 struct vop_pathconf_args ap
;
923 ap
.a_head
.a_desc
= &vop_pathconf_desc
;
924 ap
.a_head
.a_ops
= ops
;
927 ap
.a_retval
= retval
;
929 DO_OPS(ops
, error
, &ap
, vop_pathconf
);
934 vop_advlock(struct vop_ops
*ops
, struct vnode
*vp
, caddr_t id
, int op
,
935 struct flock
*fl
, int flags
)
937 struct vop_advlock_args ap
;
940 ap
.a_head
.a_desc
= &vop_advlock_desc
;
941 ap
.a_head
.a_ops
= ops
;
948 DO_OPS(ops
, error
, &ap
, vop_advlock
);
953 vop_balloc(struct vop_ops
*ops
, struct vnode
*vp
, off_t startoffset
,
954 int size
, struct ucred
*cred
, int flags
,
957 struct vop_balloc_args ap
;
960 ap
.a_head
.a_desc
= &vop_balloc_desc
;
961 ap
.a_head
.a_ops
= ops
;
963 ap
.a_startoffset
= startoffset
;
969 DO_OPS(ops
, error
, &ap
, vop_balloc
);
974 vop_reallocblks(struct vop_ops
*ops
, struct vnode
*vp
,
975 struct cluster_save
*buflist
)
977 struct vop_reallocblks_args ap
;
980 ap
.a_head
.a_desc
= &vop_reallocblks_desc
;
981 ap
.a_head
.a_ops
= ops
;
983 ap
.a_buflist
= buflist
;
985 DO_OPS(ops
, error
, &ap
, vop_reallocblks
);
990 vop_getpages(struct vop_ops
*ops
, struct vnode
*vp
, vm_page_t
*m
, int count
,
991 int reqpage
, vm_ooffset_t offset
)
993 struct vop_getpages_args ap
;
996 ap
.a_head
.a_desc
= &vop_getpages_desc
;
997 ap
.a_head
.a_ops
= ops
;
1001 ap
.a_reqpage
= reqpage
;
1002 ap
.a_offset
= offset
;
1004 DO_OPS(ops
, error
, &ap
, vop_getpages
);
1009 vop_putpages(struct vop_ops
*ops
, struct vnode
*vp
, vm_page_t
*m
, int count
,
1010 int sync
, int *rtvals
, vm_ooffset_t offset
)
1012 struct vop_putpages_args ap
;
1015 ap
.a_head
.a_desc
= &vop_putpages_desc
;
1016 ap
.a_head
.a_ops
= ops
;
1021 ap
.a_rtvals
= rtvals
;
1022 ap
.a_offset
= offset
;
1024 DO_OPS(ops
, error
, &ap
, vop_putpages
);
1026 cache_update_fsmid_vp(vp
);
1031 vop_freeblks(struct vop_ops
*ops
, struct vnode
*vp
,
1032 daddr_t addr
, daddr_t length
)
1034 struct vop_freeblks_args ap
;
1037 ap
.a_head
.a_desc
= &vop_freeblks_desc
;
1038 ap
.a_head
.a_ops
= ops
;
1041 ap
.a_length
= length
;
1043 DO_OPS(ops
, error
, &ap
, vop_freeblks
);
1048 vop_bwrite(struct vop_ops
*ops
, struct vnode
*vp
, struct buf
*bp
)
1050 struct vop_bwrite_args ap
;
1053 ap
.a_head
.a_desc
= &vop_bwrite_desc
;
1054 ap
.a_head
.a_ops
= ops
;
1058 DO_OPS(ops
, error
, &ap
, vop_bwrite
);
1060 cache_update_fsmid_vp(vp
);
1065 vop_getacl(struct vop_ops
*ops
, struct vnode
*vp
, acl_type_t type
,
1066 struct acl
*aclp
, struct ucred
*cred
, struct thread
*td
)
1068 struct vop_getacl_args ap
;
1071 ap
.a_head
.a_desc
= &vop_getacl_desc
;
1072 ap
.a_head
.a_ops
= ops
;
1079 DO_OPS(ops
, error
, &ap
, vop_getacl
);
1084 vop_setacl(struct vop_ops
*ops
, struct vnode
*vp
, acl_type_t type
,
1085 struct acl
*aclp
, struct ucred
*cred
, struct thread
*td
)
1087 struct vop_setacl_args ap
;
1090 ap
.a_head
.a_desc
= &vop_setacl_desc
;
1091 ap
.a_head
.a_ops
= ops
;
1098 DO_OPS(ops
, error
, &ap
, vop_setacl
);
1100 cache_update_fsmid_vp(vp
);
1105 vop_aclcheck(struct vop_ops
*ops
, struct vnode
*vp
, acl_type_t type
,
1106 struct acl
*aclp
, struct ucred
*cred
, struct thread
*td
)
1108 struct vop_aclcheck_args ap
;
1111 ap
.a_head
.a_desc
= &vop_aclcheck_desc
;
1112 ap
.a_head
.a_ops
= ops
;
1119 DO_OPS(ops
, error
, &ap
, vop_aclcheck
);
1124 vop_getextattr(struct vop_ops
*ops
, struct vnode
*vp
, char *name
,
1125 struct uio
*uio
, struct ucred
*cred
, struct thread
*td
)
1127 struct vop_getextattr_args ap
;
1130 ap
.a_head
.a_desc
= &vop_getextattr_desc
;
1131 ap
.a_head
.a_ops
= ops
;
1138 DO_OPS(ops
, error
, &ap
, vop_getextattr
);
1143 vop_setextattr(struct vop_ops
*ops
, struct vnode
*vp
, char *name
,
1144 struct uio
*uio
, struct ucred
*cred
, struct thread
*td
)
1146 struct vop_setextattr_args ap
;
1149 ap
.a_head
.a_desc
= &vop_setextattr_desc
;
1150 ap
.a_head
.a_ops
= ops
;
1157 DO_OPS(ops
, error
, &ap
, vop_setextattr
);
1159 cache_update_fsmid_vp(vp
);
1164 vop_createvobject(struct vop_ops
*ops
, struct vnode
*vp
, struct thread
*td
)
1166 struct vop_createvobject_args ap
;
1169 ap
.a_head
.a_desc
= &vop_createvobject_desc
;
1170 ap
.a_head
.a_ops
= ops
;
1174 DO_OPS(ops
, error
, &ap
, vop_createvobject
);
1179 vop_destroyvobject(struct vop_ops
*ops
, struct vnode
*vp
)
1181 struct vop_destroyvobject_args ap
;
1184 ap
.a_head
.a_desc
= &vop_destroyvobject_desc
;
1185 ap
.a_head
.a_ops
= ops
;
1188 DO_OPS(ops
, error
, &ap
, vop_destroyvobject
);
1193 vop_getvobject(struct vop_ops
*ops
, struct vnode
*vp
, struct vm_object
**objpp
)
1195 struct vop_getvobject_args ap
;
1198 ap
.a_head
.a_desc
= &vop_getvobject_desc
;
1199 ap
.a_head
.a_ops
= ops
;
1203 DO_OPS(ops
, error
, &ap
, vop_getvobject
);
1208 vop_mountctl(struct vop_ops
*ops
, int op
, struct file
*fp
,
1209 const void *ctl
, int ctllen
, void *buf
, int buflen
, int *res
)
1211 struct vop_mountctl_args ap
;
1214 ap
.a_head
.a_desc
= &vop_mountctl_desc
;
1215 ap
.a_head
.a_ops
= ops
;
1219 ap
.a_ctllen
= ctllen
;
1221 ap
.a_buflen
= buflen
;
1224 DO_OPS(ops
, error
, &ap
, vop_mountctl
);
1231 * nresolve takes a locked ncp and a cred and resolves the ncp into a
1232 * positive or negative hit.
1234 * The namecache is automatically adjusted by this function. The ncp
1235 * is left locked on return.
1238 vop_nresolve(struct vop_ops
*ops
, struct namecache
*ncp
, struct ucred
*cred
)
1240 struct vop_nresolve_args ap
;
1243 ap
.a_head
.a_desc
= &vop_nresolve_desc
;
1244 ap
.a_head
.a_ops
= ops
;
1248 DO_OPS(ops
, error
, &ap
, vop_nresolve
);
1253 * nlookupdotdot takes an unlocked directory, dvp, and looks up "..", returning
1254 * a locked parent directory in *vpp. If an error occurs *vpp will be NULL.
1257 vop_nlookupdotdot(struct vop_ops
*ops
, struct vnode
*dvp
,
1258 struct vnode
**vpp
, struct ucred
*cred
)
1260 struct vop_nlookupdotdot_args ap
;
1263 ap
.a_head
.a_desc
= &vop_nlookupdotdot_desc
;
1264 ap
.a_head
.a_ops
= ops
;
1269 DO_OPS(ops
, error
, &ap
, vop_nlookupdotdot
);
1274 * ncreate takes a locked, resolved ncp that typically represents a negative
1275 * cache hit and creates the file or node specified by the ncp, cred, and
1276 * vattr. If no error occurs a locked vnode is returned in *vpp.
1278 * The namecache is automatically adjusted by this function. The ncp
1279 * is left locked on return.
1282 vop_ncreate(struct vop_ops
*ops
, struct namecache
*ncp
,
1283 struct vnode
**vpp
, struct ucred
*cred
, struct vattr
*vap
)
1285 struct vop_ncreate_args ap
;
1288 ap
.a_head
.a_desc
= &vop_ncreate_desc
;
1289 ap
.a_head
.a_ops
= ops
;
1295 DO_OPS(ops
, error
, &ap
, vop_ncreate
);
1296 if (error
== 0 && *vpp
)
1297 cache_update_fsmid_vp(*vpp
);
1302 * nmkdir takes a locked, resolved ncp that typically represents a negative
1303 * cache hit and creates the directory specified by the ncp, cred, and
1304 * vattr. If no error occurs a locked vnode is returned in *vpp.
1306 * The namecache is automatically adjusted by this function. The ncp
1307 * is left locked on return.
1310 vop_nmkdir(struct vop_ops
*ops
, struct namecache
*ncp
,
1311 struct vnode
**vpp
, struct ucred
*cred
, struct vattr
*vap
)
1313 struct vop_nmkdir_args ap
;
1316 ap
.a_head
.a_desc
= &vop_nmkdir_desc
;
1317 ap
.a_head
.a_ops
= ops
;
1323 DO_OPS(ops
, error
, &ap
, vop_nmkdir
);
1324 if (error
== 0 && *vpp
)
1325 cache_update_fsmid_vp(*vpp
);
1330 * nmknod takes a locked, resolved ncp that typically represents a negative
1331 * cache hit and creates the node specified by the ncp, cred, and
1332 * vattr. If no error occurs a locked vnode is returned in *vpp.
1334 * The namecache is automatically adjusted by this function. The ncp
1335 * is left locked on return.
1338 vop_nmknod(struct vop_ops
*ops
, struct namecache
*ncp
,
1339 struct vnode
**vpp
, struct ucred
*cred
, struct vattr
*vap
)
1341 struct vop_nmknod_args ap
;
1344 ap
.a_head
.a_desc
= &vop_nmknod_desc
;
1345 ap
.a_head
.a_ops
= ops
;
1351 DO_OPS(ops
, error
, &ap
, vop_nmknod
);
1352 if (error
== 0 && *vpp
)
1353 cache_update_fsmid_vp(*vpp
);
1358 * nlink takes a locked, resolved ncp that typically represents a negative
1359 * cache hit and creates the node specified by the ncp, cred, and
1360 * existing vnode. The passed vp must be locked and will remain locked
1361 * on return, as does the ncp, whether an error occurs or not.
1363 * The namecache is automatically adjusted by this function. The ncp
1364 * is left locked on return.
1367 vop_nlink(struct vop_ops
*ops
, struct namecache
*ncp
,
1368 struct vnode
*vp
, struct ucred
*cred
)
1370 struct vop_nlink_args ap
;
1373 ap
.a_head
.a_desc
= &vop_nlink_desc
;
1374 ap
.a_head
.a_ops
= ops
;
1379 DO_OPS(ops
, error
, &ap
, vop_nlink
);
1381 cache_update_fsmid(ncp
);
1386 * nsymlink takes a locked, resolved ncp that typically represents a negative
1387 * cache hit and creates a symbolic link based on cred, vap, and target (the
1388 * contents of the link). If no error occurs a locked vnode is returned in
1391 * The namecache is automatically adjusted by this function. The ncp
1392 * is left locked on return.
1395 vop_nsymlink(struct vop_ops
*ops
, struct namecache
*ncp
,
1396 struct vnode
**vpp
, struct ucred
*cred
,
1397 struct vattr
*vap
, char *target
)
1399 struct vop_nsymlink_args ap
;
1402 ap
.a_head
.a_desc
= &vop_nsymlink_desc
;
1403 ap
.a_head
.a_ops
= ops
;
1408 ap
.a_target
= target
;
1410 DO_OPS(ops
, error
, &ap
, vop_nsymlink
);
1412 cache_update_fsmid(ncp
);
1417 * nwhiteout takes a locked, resolved ncp that can represent a positive or
1418 * negative hit and executes the whiteout function specified in flags.
1420 * The namecache is automatically adjusted by this function. The ncp
1421 * is left locked on return.
1424 vop_nwhiteout(struct vop_ops
*ops
, struct namecache
*ncp
,
1425 struct ucred
*cred
, int flags
)
1427 struct vop_nwhiteout_args ap
;
1430 ap
.a_head
.a_desc
= &vop_nwhiteout_desc
;
1431 ap
.a_head
.a_ops
= ops
;
1436 DO_OPS(ops
, error
, &ap
, vop_nwhiteout
);
1438 cache_update_fsmid(ncp
);
1443 * nremove takes a locked, resolved ncp that generally represents a
1444 * positive hit and removes the file.
1446 * The namecache is automatically adjusted by this function. The ncp
1447 * is left locked on return.
1450 vop_nremove(struct vop_ops
*ops
, struct namecache
*ncp
, struct ucred
*cred
)
1452 struct vop_nremove_args ap
;
1455 ap
.a_head
.a_desc
= &vop_nremove_desc
;
1456 ap
.a_head
.a_ops
= ops
;
1460 DO_OPS(ops
, error
, &ap
, vop_nremove
);
1462 cache_update_fsmid(ncp
);
1467 * nrmdir takes a locked, resolved ncp that generally represents a
1468 * directory and removes the directory.
1470 * The namecache is automatically adjusted by this function. The ncp
1471 * is left locked on return.
1474 vop_nrmdir(struct vop_ops
*ops
, struct namecache
*ncp
, struct ucred
*cred
)
1476 struct vop_nrmdir_args ap
;
1479 ap
.a_head
.a_desc
= &vop_nrmdir_desc
;
1480 ap
.a_head
.a_ops
= ops
;
1484 DO_OPS(ops
, error
, &ap
, vop_nrmdir
);
1486 cache_update_fsmid(ncp
);
1491 * nrename takes TWO locked, resolved ncp's and the cred of the caller
1492 * and renames the source ncp to the target ncp. The target ncp may
1493 * represent a positive or negative hit.
1495 * The namecache is automatically adjusted by this function. The ncp
1496 * is left locked on return. The source ncp is typically changed to
1497 * a negative cache hit and the target ncp typically takes on the
1498 * source ncp's underlying file.
1501 vop_nrename(struct vop_ops
*ops
, struct namecache
*fncp
,
1502 struct namecache
*tncp
, struct ucred
*cred
)
1504 struct vop_nrename_args ap
;
1507 ap
.a_head
.a_desc
= &vop_nrename_desc
;
1508 ap
.a_head
.a_ops
= ops
;
1513 DO_OPS(ops
, error
, &ap
, vop_nrename
);
1515 cache_update_fsmid(fncp
);
1516 cache_update_fsmid(tncp
);
1521 /************************************************************************
1522 * PRIMARY VNODE OPERATIONS FORWARDING CALLS *
1523 ************************************************************************
1525 * These procedures are called from VFSs such as unionfs and nullfs
1526 * when they wish to forward an operation on one VFS to another. The
1527 * argument structure/message is modified and then directly passed to the
1528 * appropriate routine. This routines may also be called by initiators
1529 * who have an argument structure in hand rather then discreet arguments.
1532 vop_vnoperate_ap(struct vop_generic_args
*ap
)
1534 struct vop_ops
*ops
;
1538 error
= VOCALL(ops
, ap
);
1544 * This routine is called by the cache coherency layer to execute the actual
1545 * VFS operation. If a journaling layer is present we call though it, else
1546 * we call the native VOP functions.
1549 vop_cache_operate_ap(struct vop_generic_args
*ap
)
1551 struct vop_ops
*ops
;
1555 if (ops
->vv_mount
->mnt_vn_journal_ops
)
1556 error
= VOCALL(ops
->vv_mount
->mnt_vn_journal_ops
, ap
);
1558 error
= VOCALL(ops
->vv_mount
->mnt_vn_norm_ops
, ap
);
1564 * This routine is called by the journaling layer to execute the actual
1568 vop_journal_operate_ap(struct vop_generic_args
*ap
)
1570 struct vop_ops
*ops
;
1574 error
= VOCALL(ops
->vv_mount
->mnt_vn_norm_ops
, ap
);
1580 vop_islocked_ap(struct vop_islocked_args
*ap
)
1584 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_islocked
);
1589 vop_open_ap(struct vop_open_args
*ap
)
1593 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_open
);
1598 vop_close_ap(struct vop_close_args
*ap
)
1602 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_close
);
1607 vop_access_ap(struct vop_access_args
*ap
)
1611 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_access
);
1616 vop_getattr_ap(struct vop_getattr_args
*ap
)
1620 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_getattr
);
1625 vop_setattr_ap(struct vop_setattr_args
*ap
)
1629 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_setattr
);
1634 vop_read_ap(struct vop_read_args
*ap
)
1638 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_read
);
1643 vop_write_ap(struct vop_write_args
*ap
)
1647 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_write
);
1652 vop_lease_ap(struct vop_lease_args
*ap
)
1656 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_lease
);
1661 vop_ioctl_ap(struct vop_ioctl_args
*ap
)
1665 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_ioctl
);
1670 vop_poll_ap(struct vop_poll_args
*ap
)
1674 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_poll
);
1679 vop_kqfilter_ap(struct vop_kqfilter_args
*ap
)
1683 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_kqfilter
);
1688 vop_revoke_ap(struct vop_revoke_args
*ap
)
1692 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_revoke
);
1697 vop_mmap_ap(struct vop_mmap_args
*ap
)
1701 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_mmap
);
1706 vop_fsync_ap(struct vop_fsync_args
*ap
)
1710 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_fsync
);
1715 vop_readdir_ap(struct vop_readdir_args
*ap
)
1719 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_readdir
);
1724 vop_readlink_ap(struct vop_readlink_args
*ap
)
1728 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_readlink
);
1733 vop_inactive_ap(struct vop_inactive_args
*ap
)
1737 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_inactive
);
1742 vop_reclaim_ap(struct vop_reclaim_args
*ap
)
1746 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_reclaim
);
1751 vop_lock_ap(struct vop_lock_args
*ap
)
1755 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_lock
);
1760 vop_unlock_ap(struct vop_unlock_args
*ap
)
1764 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_unlock
);
1769 vop_bmap_ap(struct vop_bmap_args
*ap
)
1773 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_bmap
);
1778 vop_strategy_ap(struct vop_strategy_args
*ap
)
1782 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_strategy
);
1787 vop_print_ap(struct vop_print_args
*ap
)
1791 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_print
);
1796 vop_pathconf_ap(struct vop_pathconf_args
*ap
)
1800 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_pathconf
);
1805 vop_advlock_ap(struct vop_advlock_args
*ap
)
1809 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_advlock
);
1814 vop_balloc_ap(struct vop_balloc_args
*ap
)
1818 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_balloc
);
1823 vop_reallocblks_ap(struct vop_reallocblks_args
*ap
)
1827 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_reallocblks
);
1832 vop_getpages_ap(struct vop_getpages_args
*ap
)
1836 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_getpages
);
1841 vop_putpages_ap(struct vop_putpages_args
*ap
)
1845 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_putpages
);
1850 vop_freeblks_ap(struct vop_freeblks_args
*ap
)
1854 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_freeblks
);
1859 vop_bwrite_ap(struct vop_bwrite_args
*ap
)
1863 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_bwrite
);
1868 vop_getacl_ap(struct vop_getacl_args
*ap
)
1872 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_getacl
);
1877 vop_setacl_ap(struct vop_setacl_args
*ap
)
1881 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_setacl
);
1886 vop_aclcheck_ap(struct vop_aclcheck_args
*ap
)
1890 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_aclcheck
);
1895 vop_getextattr_ap(struct vop_getextattr_args
*ap
)
1899 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_getextattr
);
1904 vop_setextattr_ap(struct vop_setextattr_args
*ap
)
1908 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_setextattr
);
1913 vop_createvobject_ap(struct vop_createvobject_args
*ap
)
1917 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_createvobject
);
1922 vop_destroyvobject_ap(struct vop_destroyvobject_args
*ap
)
1926 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_destroyvobject
);
1931 vop_getvobject_ap(struct vop_getvobject_args
*ap
)
1935 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_getvobject
);
1940 vop_mountctl_ap(struct vop_mountctl_args
*ap
)
1944 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_mountctl
);
1949 vop_nresolve_ap(struct vop_nresolve_args
*ap
)
1953 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_nresolve
);
1958 vop_nlookupdotdot_ap(struct vop_nlookupdotdot_args
*ap
)
1962 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_nlookupdotdot
);
1967 vop_ncreate_ap(struct vop_ncreate_args
*ap
)
1971 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_ncreate
);
1976 vop_nmkdir_ap(struct vop_nmkdir_args
*ap
)
1980 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_nmkdir
);
1985 vop_nmknod_ap(struct vop_nmknod_args
*ap
)
1989 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_nmknod
);
1994 vop_nlink_ap(struct vop_nlink_args
*ap
)
1998 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_nlink
);
2003 vop_nsymlink_ap(struct vop_nsymlink_args
*ap
)
2007 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_nsymlink
);
2012 vop_nwhiteout_ap(struct vop_nwhiteout_args
*ap
)
2016 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_nwhiteout
);
2021 vop_nremove_ap(struct vop_nremove_args
*ap
)
2025 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_nremove
);
2030 vop_nrmdir_ap(struct vop_nrmdir_args
*ap
)
2034 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_nrmdir
);
2039 vop_nrename_ap(struct vop_nrename_args
*ap
)
2043 DO_OPS(ap
->a_head
.a_ops
, error
, ap
, vop_nrename
);