VFS messaging/interfacing work stage 1/99. This stage replaces the old
[dragonfly.git] / sys / sys / vopops.h
1 /*
2  * Copyright (c) 2004 The DragonFly Project.  All rights reserved.
3  * 
4  * This code is derived from software contributed to The DragonFly Project
5  * by Matthew Dillon <dillon@backplane.com>
6  * 
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in
15  *    the documentation and/or other materials provided with the
16  *    distribution.
17  * 3. Neither the name of The DragonFly Project nor the names of its
18  *    contributors may be used to endorse or promote products derived
19  *    from this software without specific, prior written permission.
20  * 
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
25  * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
31  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  *
34  * $DragonFly: src/sys/sys/Attic/vopops.h,v 1.1 2004/08/13 17:51:10 dillon Exp $
35  */
36
37 /*
38  * The vopops structure vectors all access to a filesystem.  It contains a
39  * fixed set of vectors which are 'compiled' by the vnodeopv_entry_desc
40  * array that is typically declared in "vfs/blah/blah_vnops.c".
41  *
42  * In DragonFly the ultimate goal is to thread the VFS, which means that
43  * the dispatch functions will eventually be called from the context of 
44  * a management thread rather then directly called by a process.  This
45  * requires us to divorce direct process dependancies (in particular ioctl
46  * and UIO's).  In addition, it is our intention to implement kernel
47  * level cache management and coherency in the vop_*() interfacing
48  * layer.
49  *
50  * The number of management threads will depend on the VFS.  The idea is
51  * to give a high performance VFS such as UFS at least one thread per cpu,
52  * and a low performance VFS such as CD9660 perhaps just one thread period.
53  * Blocking issues within the management thread are up to the VFS itself,
54  * but DragonFly will introduce a layer above the VFS to handle cacheable
55  * requests without having to enter the VFS (e.g. by making attribute
56  * and VM object information a permanent fixture of the vnode structure
57  * and accessing them directly).
58  *
59  * THE VOPOPS VECTORS SHOULD NEVER BE CALLED DIRECTLY!  Instead always use
60  * the kernel helper procedures vop_*() to call a vopop.  The kernel
61  * helper procedure will be responsible for handling the DragonFly messaging
62  * conversion when it occurs.
63  */
64
65 #ifndef _SYS_VOPOPS_H_
66 #define _SYS_VOPOPS_H_
67
68 struct vnode;
69 struct thread;
70 struct namecache;
71 struct componentname;
72 struct vattr;
73 struct ucred;
74 struct uio;
75 struct knote;
76 struct vm_object;
77 struct vm_page;
78
79 struct vop_generic_args {
80         struct vnodeop_desc *a_desc;
81 };
82
83 struct vop_islocked_args {
84         struct vop_generic_args a_head;
85         struct vnode *a_vp;
86         struct thread *a_td;
87 };
88
89 struct vop_lookup_args {
90         struct vop_generic_args a_head;
91         struct vnode *a_dvp;
92         struct namecache *a_par;
93         struct vnode **a_vpp;
94         struct namecache **a_ncpp;
95         struct componentname *a_cnp;
96 };
97
98 struct vop_cachedlookup_args {
99         struct vop_generic_args a_head;
100         struct vnode *a_dvp;
101         struct namecache *a_par;
102         struct vnode **a_vpp;
103         struct namecache **a_ncpp;
104         struct componentname *a_cnp;
105 };
106
107 struct vop_create_args {
108         struct vop_generic_args a_head;
109         struct vnode *a_dvp;
110         struct namecache *a_par;
111         struct vnode **a_vpp;
112         struct componentname *a_cnp;
113         struct vattr *a_vap;
114 };
115
116 struct vop_whiteout_args {
117         struct vop_generic_args a_head;
118         struct vnode *a_dvp;
119         struct namecache *a_par;
120         struct componentname *a_cnp;
121         int a_flags;
122 };
123
124 struct vop_mknod_args {
125         struct vop_generic_args a_head;
126         struct vnode *a_dvp;
127         struct namecache *a_par;
128         struct vnode **a_vpp;
129         struct componentname *a_cnp;
130         struct vattr *a_vap;
131 };
132
133 struct vop_open_args {
134         struct vop_generic_args a_head;
135         struct vnode *a_vp;
136         int a_mode;
137         struct ucred *a_cred;
138         struct thread *a_td;
139 };
140
141 struct vop_close_args {
142         struct vop_generic_args a_head;
143         struct vnode *a_vp;
144         int a_fflag;
145         struct thread *a_td;
146 };
147
148 struct vop_access_args {
149         struct vop_generic_args a_head;
150         struct vnode *a_vp;
151         int a_mode;
152         struct ucred *a_cred;
153         struct thread *a_td;
154 };
155
156 struct vop_getattr_args {
157         struct vop_generic_args a_head;
158         struct vnode *a_vp;
159         struct vattr *a_vap;
160         struct thread *a_td;
161 };
162
163 struct vop_setattr_args {
164         struct vop_generic_args a_head;
165         struct vnode *a_vp;
166         struct vattr *a_vap;
167         struct ucred *a_cred;
168         struct thread *a_td;
169 };
170
171 struct vop_read_args {
172         struct vop_generic_args a_head;
173         struct vnode *a_vp;
174         struct uio *a_uio;
175         int a_ioflag;
176         struct ucred *a_cred;
177 };
178
179 struct vop_write_args {
180         struct vop_generic_args a_head;
181         struct vnode *a_vp;
182         struct uio *a_uio;
183         int a_ioflag;
184         struct ucred *a_cred;
185 };
186
187 struct vop_lease_args {
188         struct vop_generic_args a_head;
189         struct vnode *a_vp;
190         struct thread *a_td;
191         struct ucred *a_cred;
192         int a_flag;
193 };
194
195 struct vop_ioctl_args {
196         struct vop_generic_args a_head;
197         struct vnode *a_vp;
198         u_long a_command;
199         caddr_t a_data;
200         int a_fflag;
201         struct ucred *a_cred;
202         struct thread *a_td;
203 };
204
205 struct vop_poll_args {
206         struct vop_generic_args a_head;
207         struct vnode *a_vp;
208         int a_events;
209         struct ucred *a_cred;
210         struct thread *a_td;
211 };
212
213 struct vop_kqfilter_args {
214         struct vop_generic_args a_head;
215         struct vnode *a_vp;
216         struct knote *a_kn;
217 };
218
219 struct vop_revoke_args {
220         struct vop_generic_args a_head;
221         struct vnode *a_vp;
222         int a_flags;
223 };
224
225 struct vop_mmap_args {
226         struct vop_generic_args a_head;
227         struct vnode *a_vp;
228         int a_fflags;
229         struct ucred *a_cred;
230         struct thread *a_td;
231 };
232
233 struct vop_fsync_args {
234         struct vop_generic_args a_head;
235         struct vnode *a_vp;
236         int a_waitfor;
237         struct thread *a_td;
238 };
239
240 struct vop_remove_args {
241         struct vop_generic_args a_head;
242         struct vnode *a_dvp;
243         struct namecache *a_par;
244         struct vnode *a_vp;
245         struct componentname *a_cnp;
246 };
247
248 struct vop_link_args {
249         struct vop_generic_args a_head;
250         struct vnode *a_tdvp;
251         struct namecache *a_par;
252         struct vnode *a_vp;
253         struct componentname *a_cnp;
254 };
255
256 struct vop_rename_args {
257         struct vop_generic_args a_head;
258         struct vnode *a_fdvp;
259         struct namecache *a_fpar;
260         struct vnode *a_fvp;
261         struct componentname *a_fcnp;
262         struct vnode *a_tdvp;
263         struct namecache *a_tpar;
264         struct vnode *a_tvp;
265         struct componentname *a_tcnp;
266 };
267
268 struct vop_mkdir_args {
269         struct vop_generic_args a_head;
270         struct vnode *a_dvp;
271         struct namecache *a_par;
272         struct vnode **a_vpp;
273         struct componentname *a_cnp;
274         struct vattr *a_vap;
275 };
276
277 struct vop_rmdir_args {
278         struct vop_generic_args a_head;
279         struct vnode *a_dvp;
280         struct namecache *a_par;
281         struct vnode *a_vp;
282         struct componentname *a_cnp;
283 };
284
285 struct vop_symlink_args {
286         struct vop_generic_args a_head;
287         struct vnode *a_dvp;
288         struct namecache *a_par;
289         struct vnode **a_vpp;
290         struct componentname *a_cnp;
291         struct vattr *a_vap;
292         char *a_target;
293 };
294
295 struct vop_readdir_args {
296         struct vop_generic_args a_head;
297         struct vnode *a_vp;
298         struct uio *a_uio;
299         struct ucred *a_cred;
300         int *a_eofflag;
301         int *a_ncookies;
302         u_long **a_cookies;
303 };
304
305 struct vop_readlink_args {
306         struct vop_generic_args a_head;
307         struct vnode *a_vp;
308         struct uio *a_uio;
309         struct ucred *a_cred;
310 };
311
312 struct vop_inactive_args {
313         struct vop_generic_args a_head;
314         struct vnode *a_vp;
315         struct thread *a_td;
316 };
317
318 struct vop_reclaim_args {
319         struct vop_generic_args a_head;
320         struct vnode *a_vp;
321         struct thread *a_td;
322 };
323
324 struct vop_lock_args {
325         struct vop_generic_args a_head;
326         struct vnode *a_vp;
327         struct lwkt_tokref *a_vlock;
328         int a_flags;
329         struct thread *a_td;
330 };
331
332 struct vop_unlock_args {
333         struct vop_generic_args a_head;
334         struct vnode *a_vp;
335         struct lwkt_tokref *a_vlock;
336         int a_flags;
337         struct thread *a_td;
338 };
339
340 struct vop_bmap_args {
341         struct vop_generic_args a_head;
342         struct vnode *a_vp;
343         daddr_t a_bn;
344         struct vnode **a_vpp;
345         daddr_t *a_bnp;
346         int *a_runp;
347         int *a_runb;
348 };
349
350 struct vop_strategy_args {
351         struct vop_generic_args a_head;
352         struct vnode *a_vp;
353         struct buf *a_bp;
354 };
355
356 struct vop_print_args {
357         struct vop_generic_args a_head;
358         struct vnode *a_vp;
359 };
360
361 struct vop_pathconf_args {
362         struct vop_generic_args a_head;
363         struct vnode *a_vp;
364         int a_name;
365         register_t *a_retval;
366 };
367
368 struct vop_advlock_args {
369         struct vop_generic_args a_head;
370         struct vnode *a_vp;
371         caddr_t a_id;
372         int a_op;
373         struct flock *a_fl;
374         int a_flags;
375 };
376
377 struct vop_balloc_args {
378         struct vop_generic_args a_head;
379         struct vnode *a_vp;
380         off_t a_startoffset;
381         int a_size;
382         struct ucred *a_cred;
383         int a_flags;
384         struct buf **a_bpp;
385 };
386
387 struct vop_reallocblks_args {
388         struct vop_generic_args a_head;
389         struct vnode *a_vp;
390         struct cluster_save *a_buflist;
391 };
392
393 struct vop_getpages_args {
394         struct vop_generic_args a_head;
395         struct vnode *a_vp;
396         struct vm_page **a_m;
397         int a_count;
398         int a_reqpage;
399         vm_ooffset_t a_offset;
400 };
401
402 struct vop_putpages_args {
403         struct vop_generic_args a_head;
404         struct vnode *a_vp;
405         struct vm_page **a_m;
406         int a_count;
407         int a_sync;
408         int *a_rtvals;
409         vm_ooffset_t a_offset;
410 };
411
412 struct vop_freeblks_args {
413         struct vop_generic_args a_head;
414         struct vnode *a_vp;
415         daddr_t a_addr;
416         daddr_t a_length;
417 };
418
419 struct vop_bwrite_args {
420         struct vop_generic_args a_head;
421         struct vnode *a_vp;
422         struct buf *a_bp;
423 };
424
425 struct vop_getacl_args {
426         struct vop_generic_args a_head;
427         struct vnode *a_vp;
428         acl_type_t a_type;
429         struct acl *a_aclp;
430         struct ucred *a_cred;
431         struct thread *a_td;
432 };
433
434 struct vop_setacl_args {
435         struct vop_generic_args a_head;
436         struct vnode *a_vp;
437         acl_type_t a_type;
438         struct acl *a_aclp;
439         struct ucred *a_cred;
440         struct thread *a_td;
441 };
442
443 struct vop_aclcheck_args {
444         struct vop_generic_args a_head;
445         struct vnode *a_vp;
446         acl_type_t a_type;
447         struct acl *a_aclp;
448         struct ucred *a_cred;
449         struct thread *a_td;
450 };
451
452 struct vop_getextattr_args {
453         struct vop_generic_args a_head;
454         struct vnode *a_vp;
455         char *a_name;
456         struct uio *a_uio;
457         struct ucred *a_cred;
458         struct thread *a_td;
459 };
460
461 struct vop_setextattr_args {
462         struct vop_generic_args a_head;
463         struct vnode *a_vp;
464         char *a_name;
465         struct uio *a_uio;
466         struct ucred *a_cred;
467         struct thread *a_td;
468 };
469
470 struct vop_createvobject_args {
471         struct vop_generic_args a_head;
472         struct vnode *a_vp;
473         struct thread *a_td;
474 };
475
476 struct vop_destroyvobject_args {
477         struct vop_generic_args a_head;
478         struct vnode *a_vp;
479 };
480
481 struct vop_getvobject_args {
482         struct vop_generic_args a_head;
483         struct vnode *a_vp;
484         struct vm_object **a_objpp;
485 };
486
487 /*
488  * This structure is the post-compiled VOP operations vector and should only
489  * be used by kern/vfs_vopops.c.
490  */
491 struct vop_ops {
492         int     vv_refs;
493         struct vop_ops *vv_new;
494 #define vop_ops_first_field     vop_default
495         int     (*vop_default)(struct vop_generic_args *);
496         int     (*vop_islocked)(struct vop_islocked_args *);
497         int     (*vop_lookup)(struct vop_lookup_args *);
498         int     (*vop_cachedlookup)(struct vop_cachedlookup_args *);
499         int     (*vop_create)(struct vop_create_args *);
500         int     (*vop_whiteout)(struct vop_whiteout_args *);
501         int     (*vop_mknod)(struct vop_mknod_args *);
502         int     (*vop_open)(struct vop_open_args *);
503         int     (*vop_close)(struct vop_close_args *);
504         int     (*vop_access)(struct vop_access_args *);
505         int     (*vop_getattr)(struct vop_getattr_args *);
506         int     (*vop_setattr)(struct vop_setattr_args *);
507         int     (*vop_read)(struct vop_read_args *);
508         int     (*vop_write)(struct vop_write_args *);
509         int     (*vop_lease)(struct vop_lease_args *);
510         int     (*vop_ioctl)(struct vop_ioctl_args *);
511         int     (*vop_poll)(struct vop_poll_args *);
512         int     (*vop_kqfilter)(struct vop_kqfilter_args *);
513         int     (*vop_revoke)(struct vop_revoke_args *);
514         int     (*vop_mmap)(struct vop_mmap_args *);
515         int     (*vop_fsync)(struct vop_fsync_args *);
516         int     (*vop_remove)(struct vop_remove_args *);
517         int     (*vop_link)(struct vop_link_args *);
518         int     (*vop_rename)(struct vop_rename_args *);
519         int     (*vop_mkdir)(struct vop_mkdir_args *);
520         int     (*vop_rmdir)(struct vop_rmdir_args *);
521         int     (*vop_symlink)(struct vop_symlink_args *);
522         int     (*vop_readdir)(struct vop_readdir_args *);
523         int     (*vop_readlink)(struct vop_readlink_args *);
524         int     (*vop_inactive)(struct vop_inactive_args *);
525         int     (*vop_reclaim)(struct vop_reclaim_args *);
526         int     (*vop_lock)(struct vop_lock_args *);
527         int     (*vop_unlock)(struct vop_unlock_args *);
528         int     (*vop_bmap)(struct vop_bmap_args *);
529         int     (*vop_strategy)(struct vop_strategy_args *);
530         int     (*vop_print)(struct vop_print_args *);
531         int     (*vop_pathconf)(struct vop_pathconf_args *);
532         int     (*vop_advlock)(struct vop_advlock_args *);
533         int     (*vop_balloc)(struct vop_balloc_args *);
534         int     (*vop_reallocblks)(struct vop_reallocblks_args *);
535         int     (*vop_getpages)(struct vop_getpages_args *);
536         int     (*vop_putpages)(struct vop_putpages_args *);
537         int     (*vop_freeblks)(struct vop_freeblks_args *);
538         int     (*vop_bwrite)(struct vop_bwrite_args *);
539         int     (*vop_getacl)(struct vop_getacl_args *);
540         int     (*vop_setacl)(struct vop_setacl_args *);
541         int     (*vop_aclcheck)(struct vop_aclcheck_args *);
542         int     (*vop_getextattr)(struct vop_getextattr_args *);
543         int     (*vop_setextattr)(struct vop_setextattr_args *);
544         int     (*vop_createvobject)(struct vop_createvobject_args *);
545         int     (*vop_destroyvobject)(struct vop_destroyvobject_args *);
546         int     (*vop_getvobject)(struct vop_getvobject_args *);
547 #define vop_ops_last_field      vop_getvobject
548 };
549
550 /*
551  * Kernel VOP arguments union, suitable for malloc / embedding in other
552  * structures.  The vop_args_union can hold any VOP call argument structure.
553  * Note that vu_head is broken out.
554  */
555 union vop_args_union {
556         struct vop_generic_args vu_head;
557         struct vop_generic_args vu_default;
558         struct vop_islocked_args vu_islocked;
559         struct vop_lookup_args vu_lookup;
560         struct vop_cachedlookup_args vu_cachedlookup;
561         struct vop_create_args vu_create;
562         struct vop_whiteout_args vu_whiteout;
563         struct vop_mknod_args vu_mknod;
564         struct vop_open_args vu_open;
565         struct vop_close_args vu_close;
566         struct vop_access_args vu_access;
567         struct vop_getattr_args vu_getattr;
568         struct vop_setattr_args vu_setattr;
569         struct vop_read_args vu_read;
570         struct vop_write_args vu_write;
571         struct vop_lease_args vu_lease;
572         struct vop_ioctl_args vu_ioctl;
573         struct vop_poll_args vu_poll;
574         struct vop_kqfilter_args vu_kqfilter;
575         struct vop_revoke_args vu_revoke;
576         struct vop_mmap_args vu_mmap;
577         struct vop_fsync_args vu_fsync;
578         struct vop_remove_args vu_remove;
579         struct vop_link_args vu_link;
580         struct vop_rename_args vu_rename;
581         struct vop_mkdir_args vu_mkdir;
582         struct vop_rmdir_args vu_rmdir;
583         struct vop_symlink_args vu_symlink;
584         struct vop_readdir_args vu_readdir;
585         struct vop_readlink_args vu_readlink;
586         struct vop_inactive_args vu_inactive;
587         struct vop_reclaim_args vu_reclaim;
588         struct vop_lock_args vu_lock;
589         struct vop_unlock_args vu_unlock;
590         struct vop_bmap_args vu_bmap;
591         struct vop_strategy_args vu_strategy;
592         struct vop_print_args vu_print;
593         struct vop_pathconf_args vu_pathconf;
594         struct vop_advlock_args vu_advlock;
595         struct vop_balloc_args vu_balloc;
596         struct vop_reallocblks_args vu_reallocblks;
597         struct vop_getpages_args vu_getpages;
598         struct vop_putpages_args vu_putpages;
599         struct vop_freeblks_args vu_freeblks;
600         struct vop_bwrite_args vu_bwrite;
601         struct vop_getacl_args vu_getacl;
602         struct vop_setacl_args vu_setacl;
603         struct vop_aclcheck_args vu_aclcheck;
604         struct vop_getextattr_args vu_getextattr;
605         struct vop_setextattr_args vu_setextattr;
606         struct vop_createvobject_args vu_createvobject;
607         struct vop_destroyvobject_args vu_destroyvobject;
608         struct vop_getvobject_args vu_getvobject;
609 };
610
611 #ifdef _KERNEL
612
613 /*
614  * Kernel VOP call wrappers.  These wrappers are responsible for wrapping
615  * the arguments in the appropriate VOP arguments structure, sending the
616  * message, and waiting for a reply.  All kernel and VFS code should generally
617  * call these wrappers rather then attempt to call the operations vector
618  * routine directly in order to allow DragonFly to properly wrap the operation
619  * in a message and dispatch it to the correct thread.
620  */
621 int vop_islocked(struct vnode *vp, struct thread *td);
622 int vop_lookup(struct vnode *dvp, struct namecache *par,
623                 struct vnode **vpp, struct namecache **ncpp,
624                 struct componentname *cnp);
625 int vop_cachedlookup(struct vnode *dvp, struct namecache *par,
626                 struct vnode **vpp, struct namecache **ncpp,
627                 struct componentname *cnp);
628 int vop_create(struct vnode *dvp, struct namecache *par,
629                 struct vnode **vpp, struct componentname *cnp,
630                 struct vattr *vap);
631 int vop_whiteout(struct vnode *dvp, struct namecache *par,
632                 struct componentname *cnp, int flags);
633 int vop_mknod(struct vnode *dvp, struct namecache *par,
634                 struct vnode **vpp, struct componentname *cnp,
635                 struct vattr *vap);
636 int vop_open(struct vnode *vp, int mode, struct ucred *cred,
637                 struct thread *td);
638 int vop_close(struct vnode *vp, int fflag, struct thread *td);
639 int vop_access(struct vnode *vp, int mode, struct ucred *cred,
640                 struct thread *td);
641 int vop_getattr(struct vnode *vp, struct vattr *vap,
642                 struct thread *td);
643 int vop_setattr(struct vnode *vp, struct vattr *vap,
644                 struct ucred *cred, struct thread *td);
645 int vop_read(struct vnode *vp, struct uio *uio, int ioflag,
646                 struct ucred *cred);
647 int vop_write(struct vnode *vp, struct uio *uio, int ioflag,
648                 struct ucred *cred);
649 int vop_lease(struct vnode *vp, struct thread *td,
650                 struct ucred *cred, int flag);
651 int vop_ioctl(struct vnode *vp, u_long command, caddr_t data,
652                 int fflag, struct ucred *cred,
653                 struct thread *td);
654 int vop_poll(struct vnode *vp, int events, struct ucred *cred,
655                 struct thread *td);
656 int vop_kqfilter(struct vnode *vp, struct knote *kn);
657 int vop_revoke(struct vnode *vp, int flags);
658 int vop_mmap(struct vnode *vp, int fflags, struct ucred *cred,
659                 struct thread *td);
660 int vop_fsync(struct vnode *vp, int waitfor, struct thread *td);
661 int vop_remove(struct vnode *dvp, struct namecache *par,
662                 struct vnode *vp, struct componentname *cnp);
663 int vop_link(struct vnode *tdvp, struct namecache *par,
664                 struct vnode *vp, struct componentname *cnp);
665 int vop_rename(struct vnode *fdvp, struct namecache *fpar,
666                 struct vnode *fvp, struct componentname *fcnp,
667                 struct vnode *tdvp, struct namecache *tpar,
668                 struct vnode *tvp, struct componentname *tcnp);
669 int vop_mkdir(struct vnode *dvp, struct namecache *par,
670                 struct vnode **vpp, struct componentname *cnp,
671                 struct vattr *vap);
672 int vop_rmdir(struct vnode *dvp, struct namecache *par,
673                 struct vnode *vp, struct componentname *cnp);
674 int vop_symlink(struct vnode *dvp, struct namecache *par,
675                 struct vnode **vpp, struct componentname *cnp,
676                 struct vattr *vap, char *target);
677 int vop_readdir(struct vnode *vp, struct uio *uio,
678                 struct ucred *cred, int *eofflag, 
679                 int *ncookies, u_long **cookies);
680 int vop_readlink(struct vnode *vp, struct uio *uio,
681                 struct ucred *cred);
682 int vop_inactive(struct vnode *vp, struct thread *td);
683 int vop_reclaim(struct vnode *vp, struct thread *td);
684 int vop_lock(struct vnode *vp, struct lwkt_tokref *vlock,
685                 int flags, struct thread *td);
686 int vop_unlock(struct vnode *vp, struct lwkt_tokref *vlock,
687                 int flags, struct thread *td);
688 int vop_bmap(struct vnode *vp, daddr_t bn, struct vnode **vpp,
689                 daddr_t *bnp, int *runp, int *runb);
690 int vop_strategy(struct vnode *vp, struct buf *bp);
691 int vop_print(struct vnode *vp);
692 int vop_pathconf(struct vnode *vp, int name,
693                 register_t *retval);
694 int vop_advlock(struct vnode *vp, caddr_t id, int op,
695                 struct flock *fl, int flags);
696 int vop_balloc(struct vnode *vp, off_t startoffset,
697                 int size, struct ucred *cred, int flags,
698                 struct buf **bpp);
699 int vop_reallocblks(struct vnode *vp,
700                 struct cluster_save *buflist);
701 int vop_getpages(struct vnode *vp, struct vm_page **m, int count,
702                 int reqpage, vm_ooffset_t offset);
703 int vop_putpages(struct vnode *vp, struct vm_page **m, int count,
704                 int sync, int *rtvals,
705                 vm_ooffset_t offset);
706 int vop_freeblks(struct vnode *vp, daddr_t addr,
707                 daddr_t length);
708 int vop_bwrite(struct vnode *vp, struct buf *bp);
709 int vop_getacl(struct vnode *vp, acl_type_t type,
710                 struct acl *aclp, struct ucred *cred,
711                 struct thread *td);
712 int vop_setacl(struct vnode *vp, acl_type_t type,
713                 struct acl *aclp, struct ucred *cred,
714                 struct thread *td);
715 int vop_aclcheck(struct vnode *vp, acl_type_t type,
716                 struct acl *aclp, struct ucred *cred,
717                 struct thread *td);
718 int vop_getextattr(struct vnode *vp, char *name, 
719                 struct uio *uio, struct ucred *cred,
720                 struct thread *td);
721 int vop_setextattr(struct vnode *vp, char *name, 
722                 struct uio *uio, struct ucred *cred,
723                 struct thread *td);
724 int vop_createvobject(struct vnode *vp, struct thread *td);
725 int vop_destroyvobject(struct vnode *vp);
726 int vop_getvobject(struct vnode *vp, struct vm_object **objpp);
727
728 /*
729  * VOP operations descriptor.  This is used by the vopops compiler
730  * to convert VFS vector arrays (typically in vfs/blah/blah_vnops.c)
731  * into a vop_ops operations vector.
732  */
733 extern struct vnodeop_desc vop_default_desc;
734 extern struct vnodeop_desc vop_islocked_desc;
735 extern struct vnodeop_desc vop_lookup_desc;
736 extern struct vnodeop_desc vop_cachedlookup_desc;
737 extern struct vnodeop_desc vop_create_desc;
738 extern struct vnodeop_desc vop_whiteout_desc;
739 extern struct vnodeop_desc vop_mknod_desc;
740 extern struct vnodeop_desc vop_open_desc;
741 extern struct vnodeop_desc vop_close_desc;
742 extern struct vnodeop_desc vop_access_desc;
743 extern struct vnodeop_desc vop_getattr_desc;
744 extern struct vnodeop_desc vop_setattr_desc;
745 extern struct vnodeop_desc vop_read_desc;
746 extern struct vnodeop_desc vop_write_desc;
747 extern struct vnodeop_desc vop_lease_desc;
748 extern struct vnodeop_desc vop_ioctl_desc;
749 extern struct vnodeop_desc vop_poll_desc;
750 extern struct vnodeop_desc vop_kqfilter_desc;
751 extern struct vnodeop_desc vop_revoke_desc;
752 extern struct vnodeop_desc vop_mmap_desc;
753 extern struct vnodeop_desc vop_fsync_desc;
754 extern struct vnodeop_desc vop_remove_desc;
755 extern struct vnodeop_desc vop_link_desc;
756 extern struct vnodeop_desc vop_rename_desc;
757 extern struct vnodeop_desc vop_mkdir_desc;
758 extern struct vnodeop_desc vop_rmdir_desc;
759 extern struct vnodeop_desc vop_symlink_desc;
760 extern struct vnodeop_desc vop_readdir_desc;
761 extern struct vnodeop_desc vop_readlink_desc;
762 extern struct vnodeop_desc vop_inactive_desc;
763 extern struct vnodeop_desc vop_reclaim_desc;
764 extern struct vnodeop_desc vop_lock_desc;
765 extern struct vnodeop_desc vop_unlock_desc;
766 extern struct vnodeop_desc vop_bmap_desc;
767 extern struct vnodeop_desc vop_strategy_desc;
768 extern struct vnodeop_desc vop_print_desc;
769 extern struct vnodeop_desc vop_pathconf_desc;
770 extern struct vnodeop_desc vop_advlock_desc;
771 extern struct vnodeop_desc vop_balloc_desc;
772 extern struct vnodeop_desc vop_reallocblks_desc;
773 extern struct vnodeop_desc vop_getpages_desc;
774 extern struct vnodeop_desc vop_putpages_desc;
775 extern struct vnodeop_desc vop_freeblks_desc;
776 extern struct vnodeop_desc vop_bwrite_desc;
777 extern struct vnodeop_desc vop_getacl_desc;
778 extern struct vnodeop_desc vop_setacl_desc;
779 extern struct vnodeop_desc vop_aclcheck_desc;
780 extern struct vnodeop_desc vop_getextattr_desc;
781 extern struct vnodeop_desc vop_setextattr_desc;
782 extern struct vnodeop_desc vop_createvobject_desc;
783 extern struct vnodeop_desc vop_destroyvobject_desc;
784 extern struct vnodeop_desc vop_getvobject_desc;
785
786 #endif
787
788 /*
789  * VOP_ macro compatibility.  Remove these as we get rid of the VOP macros.
790  */
791 #define VOP_ISLOCKED(vp, td)                            \
792         vop_islocked(vp, td)
793 #define VOP_LOOKUP(dvp, par, vpp, ncpp, cnp)            \
794         vop_lookup(dvp, par, vpp, ncpp, cnp)
795 #define VOP_CACHEDLOOKUP(dvp, par, vpp, ncpp, cnp)      \
796         vop_cachedlookup(dvp, par, vpp, ncpp, cnp)
797 #define VOP_CREATE(dvp, par, vpp, cnp, vap)             \
798         vop_create(dvp, par, vpp, cnp, vap)
799 #define VOP_WHITEOUT(dvp, par, cnp, flags)              \
800         vop_whiteout(dvp, par, cnp, flags)
801 #define VOP_MKNOD(dvp, par, vpp, cnp, vap)              \
802         vop_mknod(dvp, par, vpp, cnp, vap)
803 #define VOP_OPEN(vp, mode, cred, td)                    \
804         vop_open(vp, mode, cred, td)
805 #define VOP_CLOSE(vp, fflag, td)                        \
806         vop_close(vp, fflag, td)
807 #define VOP_ACCESS(vp, mode, cred, td)                  \
808         vop_access(vp, mode, cred, td)
809 #define VOP_GETATTR(vp, vap, td)                        \
810         vop_getattr(vp, vap, td)
811 #define VOP_SETATTR(vp, vap, cred, td)                  \
812         vop_setattr(vp, vap, cred, td)
813 #define VOP_READ(vp, uio, ioflag, cred)                 \
814         vop_read(vp, uio, ioflag, cred)
815 #define VOP_WRITE(vp, uio, ioflag, cred)                \
816         vop_write(vp, uio, ioflag, cred)
817 #define VOP_LEASE(vp, td, cred, flag)                   \
818         vop_lease(vp, td, cred, flag)
819 #define VOP_IOCTL(vp, command, data, fflag, cred, td)   \
820         vop_ioctl(vp, command, data, fflag, cred, td)
821 #define VOP_POLL(vp, events, cred, td)                  \
822         vop_poll(vp, events, cred, td)
823 #define VOP_KQFILTER(vp, kn)                            \
824         vop_kqfilter(vp, kn)
825 #define VOP_REVOKE(vp, flags)                           \
826         vop_revoke(vp, flags)
827 #define VOP_MMAP(vp, fflags, cred, td)                  \
828         vop_mmap(vp, fflags, cred, td)
829 #define VOP_FSYNC(vp, waitfor, td)                      \
830         vop_fsync(vp, waitfor, td)
831 #define VOP_REMOVE(dvp, par, vp, cnp)                   \
832         vop_remove(dvp, par, vp, cnp)
833 #define VOP_LINK(tdvp, par, vp, cnp)                    \
834         vop_link(tdvp, par, vp, cnp)
835 #define VOP_RENAME(fdvp, fpar, fvp, fcnp, tdvp, tpar, tvp, tcnp)        \
836         vop_rename(fdvp, fpar, fvp, fcnp, tdvp, tpar, tvp, tcnp)
837 #define VOP_MKDIR(dvp, par, vpp, cnp, vap)              \
838         vop_mkdir(dvp, par, vpp, cnp, vap)
839 #define VOP_RMDIR(dvp, par, vp, cnp)                    \
840         vop_rmdir(dvp, par, vp, cnp)
841 #define VOP_SYMLINK(dvp, par, vpp, cnp, vap, target)    \
842         vop_symlink(dvp, par, vpp, cnp, vap, target)
843 #define VOP_READDIR(vp, uio, cred, eofflag, ncookies, cookies)          \
844         vop_readdir(vp, uio, cred, eofflag, ncookies, cookies)
845 #define VOP_READLINK(vp, uio, cred)                     \
846         vop_readlink(vp, uio, cred)
847 #define VOP_INACTIVE(vp, td)                            \
848         vop_inactive(vp, td)
849 #define VOP_RECLAIM(vp, td)                             \
850         vop_reclaim(vp, td)
851 #define VOP_LOCK(vp, vlock, flags, td)                  \
852         vop_lock(vp, vlock, flags, td)
853 #define VOP_UNLOCK(vp, vlock, flags, td)                \
854         vop_unlock(vp, vlock, flags, td)
855 #define VOP_BMAP(vp, bn, vpp, bnp, runp, runb)          \
856         vop_bmap(vp, bn, vpp, bnp, runp, runb)
857 #define VOP_STRATEGY(vp, bp)                            \
858         vop_strategy(vp, bp)
859 #define VOP_PRINT(vp)                                   \
860         vop_print(vp)
861 #define VOP_PATHCONF(vp, name, retval)                  \
862         vop_pathconf(vp, name, retval)
863 #define VOP_ADVLOCK(vp, id, op, fl, flags)              \
864         vop_advlock(vp, id, op, fl, flags)
865 #define VOP_BALLOC(vp, offset, size, cred, flags, bpp)  \
866         vop_balloc(vp, offset, size, cred, flags, bpp)
867 #define VOP_REALLOCBLKS(vp, buflist)                    \
868         vop_reallocblks(vp, buflist)
869 #define VOP_GETPAGES(vp, m, count, reqpage, off)        \
870         vop_getpages(vp, m, count, reqpage, off)
871 #define VOP_PUTPAGES(vp, m, count, sync, rtvals, off)   \
872         vop_putpages(vp, m, count, sync, rtvals, off)
873 #define VOP_FREEBLKS(vp, addr, length)                  \
874         vop_freeblks(vp, addr, length)
875 #define VOP_BWRITE(vp, bp)                              \
876         vop_bwrite(vp, bp)
877 #define VOP_GETACL(vp, type, aclp, cred, td)            \
878         vop_getacl(vp, type, aclp, cred, td)
879 #define VOP_SETACL(vp, type, aclp, cred, td)            \
880         vop_setacl(vp, type, aclp, cred, td)
881 #define VOP_ACLCHECK(vp, type, aclp, cred, td)          \
882         vop_aclcheck(vp, type, aclp, cred, td)
883 #define VOP_GETEXTATTR(vp, name, uio, cred, td)         \
884         vop_getextattr(vp, name, uio, cred, td)
885 #define VOP_SETEXTATTR(vp, name, uio, cred, td)         \
886         vop_setextattr(vp, name, uio, cred, td)
887 #define VOP_CREATEVOBJECT(vp, td)                       \
888         vop_createvobject(vp, td)
889 #define VOP_DESTROYVOBJECT(vp)                          \
890         vop_destroyvobject(vp)
891 #define VOP_GETVOBJECT(vp, objpp)                       \
892         vop_getvobject(vp, objpp)
893
894 #endif
895