vnode_if.src revision 259296
155714Skris#-
255714Skris# Copyright (c) 1992, 1993
355714Skris#	The Regents of the University of California.  All rights reserved.
455714Skris#
555714Skris# Redistribution and use in source and binary forms, with or without
655714Skris# modification, are permitted provided that the following conditions
755714Skris# are met:
8280304Sjkim# 1. Redistributions of source code must retain the above copyright
955714Skris#    notice, this list of conditions and the following disclaimer.
1055714Skris# 2. Redistributions in binary form must reproduce the above copyright
1155714Skris#    notice, this list of conditions and the following disclaimer in the
1255714Skris#    documentation and/or other materials provided with the distribution.
1355714Skris# 4. Neither the name of the University nor the names of its contributors
1455714Skris#    may be used to endorse or promote products derived from this software
15280304Sjkim#    without specific prior written permission.
1655714Skris#
1755714Skris# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
1855714Skris# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1955714Skris# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2055714Skris# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2155714Skris# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22280304Sjkim# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2355714Skris# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2455714Skris# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2555714Skris# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2655714Skris# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2755714Skris# SUCH DAMAGE.
2855714Skris#
2955714Skris#	@(#)vnode_if.src	8.12 (Berkeley) 5/14/95
3055714Skris# $FreeBSD: stable/10/sys/kern/vnode_if.src 259296 2013-12-13 06:12:21Z kib $
3155714Skris#
3255714Skris
3355714Skris#
3455714Skris# Above each of the vop descriptors in lines starting with %%
3555714Skris# is a specification of the locking protocol used by each vop call.
3655714Skris# The first column is the name of the variable, the remaining three
37280304Sjkim# columns are in, out and error respectively.  The "in" column defines
3855714Skris# the lock state on input, the "out" column defines the state on succesful
3955714Skris# return, and the "error" column defines the locking state on error exit.
40280304Sjkim#
4155714Skris# The locking value can take the following values:
4255714Skris# L: locked; not converted to type of lock.
4355714Skris# A: any lock type.
4455714Skris# S: locked with shared lock.
4555714Skris# E: locked with exclusive lock for this process.
4655714Skris# O: locked with exclusive lock for other process.
4755714Skris# U: unlocked.
4855714Skris# -: not applicable.  vnode does not yet (or no longer) exists.
4955714Skris# =: the same on input and output, may be either L or U.
5055714Skris# X: locked if not nil.
5155714Skris#
52280304Sjkim# The paramater named "vpp" is assumed to be always used with double
5355714Skris# indirection (**vpp) and that name is hard-coded in vnode_if.awk !
5455714Skris#
5555714Skris# Lines starting with %! specify a pre or post-condition function
5655714Skris# to call before/after the vop call.
5755714Skris#
58109998Smarkm# If other such parameters are introduced, they have to be added to
59109998Smarkm# the AWK script at the head of the definition of "add_debug_code()".
60109998Smarkm#
61109998Smarkm
62109998Smarkmvop_islocked {
63109998Smarkm	IN struct vnode *vp;
64109998Smarkm};
65109998Smarkm
66280304Sjkim%% lookup	dvp	L L L
67109998Smarkm%% lookup	vpp	- L -
68109998Smarkm
69109998Smarkm# XXX - the lookup locking protocol defies simple description and depends
70109998Smarkm#	on the flags and operation fields in the (cnp) structure.  Note
71109998Smarkm#	especially that *vpp may equal dvp and both may be locked.
72109998Smarkm
73109998Smarkmvop_lookup {
74109998Smarkm	IN struct vnode *dvp;
75109998Smarkm	INOUT struct vnode **vpp;
76109998Smarkm	IN struct componentname *cnp;
77109998Smarkm};
78109998Smarkm
79109998Smarkm%% cachedlookup	dvp	L L L
80109998Smarkm%% cachedlookup	vpp	- L -
81109998Smarkm
82109998Smarkm# This must be an exact copy of lookup.  See kern/vfs_cache.c for details.
83109998Smarkm
84109998Smarkmvop_cachedlookup {
85109998Smarkm	IN struct vnode *dvp;
86109998Smarkm	INOUT struct vnode **vpp;
87109998Smarkm	IN struct componentname *cnp;
88109998Smarkm};
89109998Smarkm
90109998Smarkm%% create	dvp	E E E
91109998Smarkm%% create	vpp	- L -
92109998Smarkm%! create	post	vop_create_post
93109998Smarkm
94109998Smarkmvop_create {
95109998Smarkm	IN struct vnode *dvp;
96109998Smarkm	OUT struct vnode **vpp;
97109998Smarkm	IN struct componentname *cnp;
98109998Smarkm	IN struct vattr *vap;
99109998Smarkm};
100109998Smarkm
101109998Smarkm
102109998Smarkm%% whiteout	dvp	E E E
103109998Smarkm
104109998Smarkmvop_whiteout {
105109998Smarkm	IN struct vnode *dvp;
106109998Smarkm	IN struct componentname *cnp;
107109998Smarkm	IN int flags;
108109998Smarkm};
109109998Smarkm
110109998Smarkm
11155714Skris%% mknod	dvp	E E E
11255714Skris%% mknod	vpp	- L -
11355714Skris%! mknod	post	vop_mknod_post
11455714Skris
11555714Skrisvop_mknod {
116111147Snectar	IN struct vnode *dvp;
117280304Sjkim	OUT struct vnode **vpp;
118111147Snectar	IN struct componentname *cnp;
11955714Skris	IN struct vattr *vap;
120238405Sjkim};
121280304Sjkim
122238405Sjkim
123238405Sjkim%% open		vp	L L L
124109998Smarkm
125280304Sjkimvop_open {
126280304Sjkim	IN struct vnode *vp;
127280304Sjkim	IN int mode;
12855714Skris	IN struct ucred *cred;
129109998Smarkm	IN struct thread *td;
130280304Sjkim	IN struct file *fp;
131280304Sjkim};
132109998Smarkm
133280304Sjkim
134280304Sjkim%% close	vp	L L L
135109998Smarkm
136280304Sjkimvop_close {
137280304Sjkim	IN struct vnode *vp;
138109998Smarkm	IN int fflag;
139109998Smarkm	IN struct ucred *cred;
140280304Sjkim	IN struct thread *td;
141280304Sjkim};
142280304Sjkim
143280304Sjkim
144109998Smarkm%% access	vp	L L L
145238405Sjkim
146280304Sjkimvop_access {
147280304Sjkim	IN struct vnode *vp;
148111147Snectar	IN accmode_t accmode;
149280304Sjkim	IN struct ucred *cred;
150280304Sjkim	IN struct thread *td;
151280304Sjkim};
152280304Sjkim
153280304Sjkim
154280304Sjkim%% accessx	vp	L L L
155280304Sjkim
156280304Sjkimvop_accessx {
157280304Sjkim	IN struct vnode *vp;
158280304Sjkim	IN accmode_t accmode;
159280304Sjkim	IN struct ucred *cred;
160280304Sjkim	IN struct thread *td;
161280304Sjkim};
162280304Sjkim
163280304Sjkim
164280304Sjkim%% getattr	vp	L L L
165280304Sjkim
166280304Sjkimvop_getattr {
167280304Sjkim	IN struct vnode *vp;
168280304Sjkim	OUT struct vattr *vap;
169280304Sjkim	IN struct ucred *cred;
170280304Sjkim};
171280304Sjkim
172280304Sjkim
173280304Sjkim%% setattr	vp	E E E
174280304Sjkim%! setattr	post	vop_setattr_post
175280304Sjkim
176280304Sjkimvop_setattr {
177280304Sjkim	IN struct vnode *vp;
178280304Sjkim	IN struct vattr *vap;
179280304Sjkim	IN struct ucred *cred;
180280304Sjkim};
181280304Sjkim
182280304Sjkim%% markatime	vp	L L L
183280304Sjkim
184280304Sjkimvop_markatime {
185280304Sjkim	IN struct vnode *vp;
186280304Sjkim};
187280304Sjkim
188280304Sjkim%% read		vp	L L L
189280304Sjkim
190280304Sjkimvop_read {
191280304Sjkim	IN struct vnode *vp;
192280304Sjkim	INOUT struct uio *uio;
193280304Sjkim	IN int ioflag;
194280304Sjkim	IN struct ucred *cred;
195280304Sjkim};
196280304Sjkim
197280304Sjkim
198280304Sjkim%% write	vp	L L L
199280304Sjkim%! write	pre	VOP_WRITE_PRE
200280304Sjkim%! write	post	VOP_WRITE_POST
201120631Snectar
202280304Sjkimvop_write {
203298999Sjkim	IN struct vnode *vp;
204280304Sjkim	INOUT struct uio *uio;
205298999Sjkim	IN int ioflag;
206298999Sjkim	IN struct ucred *cred;
207280304Sjkim};
208280304Sjkim
209280304Sjkim
210280304Sjkim%% ioctl	vp	U U U
211280304Sjkim
212280304Sjkimvop_ioctl {
213280304Sjkim	IN struct vnode *vp;
214280304Sjkim	IN u_long command;
215280304Sjkim	IN void *data;
216280304Sjkim	IN int fflag;
217111147Snectar	IN struct ucred *cred;
218280304Sjkim	IN struct thread *td;
219111147Snectar};
220280304Sjkim
221280304Sjkim
222280304Sjkim%% poll		vp	U U U
223280304Sjkim
224280304Sjkimvop_poll {
225280304Sjkim	IN struct vnode *vp;
226280304Sjkim	IN int events;
227280304Sjkim	IN struct ucred *cred;
228280304Sjkim	IN struct thread *td;
229238405Sjkim};
230280304Sjkim
231280304Sjkim
232280304Sjkim%% kqfilter	vp	U U U
233280304Sjkim
234280304Sjkimvop_kqfilter {
235280304Sjkim	IN struct vnode *vp;
236280304Sjkim	IN struct knote *kn;
237238405Sjkim};
238280304Sjkim
239280304Sjkim
240109998Smarkm%% revoke	vp	L L L
241238405Sjkim
242280304Sjkimvop_revoke {
243194206Ssimon	IN struct vnode *vp;
244306196Sjkim	IN int flags;
245306196Sjkim};
246306196Sjkim
247280304Sjkim
248280304Sjkim%% fsync	vp	L L L
24955714Skris
250109998Smarkmvop_fsync {
251109998Smarkm	IN struct vnode *vp;
252280304Sjkim	IN int waitfor;
253280304Sjkim	IN struct thread *td;
254280304Sjkim};
255280304Sjkim
256280304Sjkim
257280304Sjkim%% remove	dvp	E E E
258109998Smarkm%% remove	vp	E E E
259109998Smarkm%! remove	post	vop_remove_post
260109998Smarkm
261280304Sjkimvop_remove {
262306196Sjkim	IN struct vnode *dvp;
263238405Sjkim	IN struct vnode *vp;
264306196Sjkim	IN struct componentname *cnp;
265306196Sjkim};
266306196Sjkim
267246772Sjkim
268280304Sjkim%% link		tdvp	E E E
269280304Sjkim%% link		vp	E E E
270280304Sjkim%! link		post	vop_link_post
271280304Sjkim
272280304Sjkimvop_link {
273280304Sjkim	IN struct vnode *tdvp;
274280304Sjkim	IN struct vnode *vp;
275280304Sjkim	IN struct componentname *cnp;
276306196Sjkim};
277280304Sjkim
278280304Sjkim
27955714Skris%! rename	pre	vop_rename_pre
280109998Smarkm%! rename	post	vop_rename_post
281280304Sjkim
282280304Sjkimvop_rename {
283280304Sjkim	IN WILLRELE struct vnode *fdvp;
284280304Sjkim	IN WILLRELE struct vnode *fvp;
285109998Smarkm	IN struct componentname *fcnp;
286109998Smarkm	IN WILLRELE struct vnode *tdvp;
287280304Sjkim	IN WILLRELE struct vnode *tvp;
288280304Sjkim	IN struct componentname *tcnp;
289280304Sjkim};
290280304Sjkim
291280304Sjkim
292280304Sjkim%% mkdir	dvp	E E E
293111147Snectar%% mkdir	vpp	- E -
294280304Sjkim%! mkdir	post	vop_mkdir_post
295280304Sjkim
296280304Sjkimvop_mkdir {
297280304Sjkim	IN struct vnode *dvp;
298280304Sjkim	OUT struct vnode **vpp;
299111147Snectar	IN struct componentname *cnp;
300109998Smarkm	IN struct vattr *vap;
301280304Sjkim};
302280304Sjkim
303280304Sjkim
304280304Sjkim%% rmdir	dvp	E E E
305280304Sjkim%% rmdir	vp	E E E
306280304Sjkim%! rmdir	post	vop_rmdir_post
307280304Sjkim
308109998Smarkmvop_rmdir {
309280304Sjkim	IN struct vnode *dvp;
310280304Sjkim	IN struct vnode *vp;
311280304Sjkim	IN struct componentname *cnp;
312280304Sjkim};
313280304Sjkim
314280304Sjkim
315280304Sjkim%% symlink	dvp	E E E
316280304Sjkim%% symlink	vpp	- E -
317280304Sjkim%! symlink	post	vop_symlink_post
318280304Sjkim
319280304Sjkimvop_symlink {
320280304Sjkim	IN struct vnode *dvp;
321127128Snectar	OUT struct vnode **vpp;
322280304Sjkim	IN struct componentname *cnp;
323238405Sjkim	IN struct vattr *vap;
324280304Sjkim	IN char *target;
325280304Sjkim};
326280304Sjkim
327280304Sjkim
328280304Sjkim%% readdir	vp	L L L
329280304Sjkim
330280304Sjkimvop_readdir {
331238405Sjkim	IN struct vnode *vp;
332280304Sjkim	INOUT struct uio *uio;
333280304Sjkim	IN struct ucred *cred;
334109998Smarkm	INOUT int *eofflag;
335280304Sjkim	OUT int *ncookies;
336280304Sjkim	INOUT u_long **cookies;
337280304Sjkim};
338160814Ssimon
339280304Sjkim
340280304Sjkim%% readlink	vp	L L L
341280304Sjkim
342280304Sjkimvop_readlink {
343280304Sjkim	IN struct vnode *vp;
344109998Smarkm	INOUT struct uio *uio;
345280304Sjkim	IN struct ucred *cred;
346280304Sjkim};
347280304Sjkim
348280304Sjkim
349280304Sjkim%% inactive	vp	E E E
350280304Sjkim
351109998Smarkmvop_inactive {
352280304Sjkim	IN struct vnode *vp;
353280304Sjkim	IN struct thread *td;
354109998Smarkm};
355109998Smarkm
356280304Sjkim
357280304Sjkim%% reclaim	vp	E E E
358280304Sjkim
359280304Sjkimvop_reclaim {
360280304Sjkim	IN struct vnode *vp;
361280304Sjkim	IN struct thread *td;
362109998Smarkm};
363109998Smarkm
364109998Smarkm
365280304Sjkim%! lock1	pre	vop_lock_pre
366238405Sjkim%! lock1	post	vop_lock_post
367280304Sjkim
368280304Sjkimvop_lock1 {
369280304Sjkim	IN struct vnode *vp;
370280304Sjkim	IN int flags;
371280304Sjkim	IN char *file;
372280304Sjkim	IN int line;
373280304Sjkim};
374280304Sjkim
375280304Sjkim
376280304Sjkim%! unlock	pre	vop_unlock_pre
377280304Sjkim%! unlock	post	vop_unlock_post
378280304Sjkim
379238405Sjkimvop_unlock {
380280304Sjkim	IN struct vnode *vp;
381280304Sjkim	IN int flags;
382111147Snectar};
383280304Sjkim
384280304Sjkim
385280304Sjkim%% bmap		vp	L L L
386280304Sjkim
387280304Sjkimvop_bmap {
388280304Sjkim	IN struct vnode *vp;
389111147Snectar	IN daddr_t bn;
390238405Sjkim	OUT struct bufobj **bop;
391280304Sjkim	IN daddr_t *bnp;
392238405Sjkim	OUT int *runp;
393280304Sjkim	OUT int *runb;
394109998Smarkm};
395280304Sjkim
396280304Sjkim
397%% strategy	vp	L L L
398%! strategy	pre	vop_strategy_pre
399
400vop_strategy {
401	IN struct vnode *vp;
402	IN struct buf *bp;
403};
404
405
406%% getwritemount vp	= = =
407
408vop_getwritemount {
409	IN struct vnode *vp;
410	OUT struct mount **mpp;
411};
412
413
414%% print	vp	- - -
415
416vop_print {
417	IN struct vnode *vp;
418};
419
420
421%% pathconf	vp	L L L
422
423vop_pathconf {
424	IN struct vnode *vp;
425	IN int name;
426	OUT register_t *retval;
427};
428
429
430%% advlock	vp	U U U
431
432vop_advlock {
433	IN struct vnode *vp;
434	IN void *id;
435	IN int op;
436	IN struct flock *fl;
437	IN int flags;
438};
439
440
441%% advlockasync	vp	U U U
442
443vop_advlockasync {
444	IN struct vnode *vp;
445	IN void *id;
446	IN int op;
447	IN struct flock *fl;
448	IN int flags;
449	IN struct task *task;	
450	INOUT void **cookiep;
451};
452
453
454%% advlockpurge	vp	E E E
455
456vop_advlockpurge {
457	IN struct vnode *vp;
458};
459
460
461%% reallocblks	vp	E E E
462
463vop_reallocblks {
464	IN struct vnode *vp;
465	IN struct cluster_save *buflist;
466};
467
468
469%% getpages	vp	L L L
470
471vop_getpages {
472	IN struct vnode *vp;
473	IN vm_page_t *m;
474	IN int count;
475	IN int reqpage;
476	IN vm_ooffset_t offset;
477};
478
479
480%% putpages	vp	L L L
481
482vop_putpages {
483	IN struct vnode *vp;
484	IN vm_page_t *m;
485	IN int count;
486	IN int sync;
487	IN int *rtvals;
488	IN vm_ooffset_t offset;
489};
490
491
492%% getacl	vp	L L L
493
494vop_getacl {
495	IN struct vnode *vp;
496	IN acl_type_t type;
497	OUT struct acl *aclp;
498	IN struct ucred *cred;
499	IN struct thread *td;
500};
501
502
503%% setacl	vp	E E E
504
505vop_setacl {
506	IN struct vnode *vp;
507	IN acl_type_t type;
508	IN struct acl *aclp;
509	IN struct ucred *cred;
510	IN struct thread *td;
511};
512
513
514%% aclcheck	vp	= = =
515
516vop_aclcheck {
517	IN struct vnode *vp;
518	IN acl_type_t type;
519	IN struct acl *aclp;
520	IN struct ucred *cred;
521	IN struct thread *td;
522};
523
524
525%% closeextattr	vp	L L L
526
527vop_closeextattr {
528	IN struct vnode *vp;
529	IN int commit;
530	IN struct ucred *cred;
531	IN struct thread *td;
532};
533
534
535%% getextattr	vp	L L L
536
537vop_getextattr {
538	IN struct vnode *vp;
539	IN int attrnamespace;
540	IN const char *name;
541	INOUT struct uio *uio;
542	OUT size_t *size;
543	IN struct ucred *cred;
544	IN struct thread *td;
545};
546
547
548%% listextattr	vp	L L L
549
550vop_listextattr {
551	IN struct vnode *vp;
552	IN int attrnamespace;
553	INOUT struct uio *uio;
554	OUT size_t *size;
555	IN struct ucred *cred;
556	IN struct thread *td;
557};
558
559
560%% openextattr	vp	L L L
561
562vop_openextattr {
563	IN struct vnode *vp;
564	IN struct ucred *cred;
565	IN struct thread *td;
566};
567
568
569%% deleteextattr	vp	E E E
570%! deleteextattr	post	vop_deleteextattr_post
571
572vop_deleteextattr {
573	IN struct vnode *vp;
574	IN int attrnamespace;
575	IN const char *name;
576	IN struct ucred *cred;
577	IN struct thread *td;
578};
579
580
581%% setextattr	vp	E E E
582%! setextattr	post	vop_setextattr_post
583
584vop_setextattr {
585	IN struct vnode *vp;
586	IN int attrnamespace;
587	IN const char *name;
588	INOUT struct uio *uio;
589	IN struct ucred *cred;
590	IN struct thread *td;
591};
592
593
594%% setlabel	vp	E E E
595
596vop_setlabel {
597	IN struct vnode *vp;
598	IN struct label *label;
599	IN struct ucred *cred;
600	IN struct thread *td;
601};
602
603
604%% vptofh	vp	= = =
605
606vop_vptofh {
607	IN struct vnode *vp;
608	IN struct fid *fhp;
609};
610
611
612%% vptocnp		vp	L L L
613%% vptocnp		vpp	- U -
614
615vop_vptocnp {
616	IN struct vnode *vp;
617	OUT struct vnode **vpp;
618	IN struct ucred *cred;
619	INOUT char *buf;
620	INOUT int *buflen;
621};
622
623
624%% allocate	vp	E E E
625
626vop_allocate {
627	IN struct vnode *vp;
628	INOUT off_t *offset;
629	INOUT off_t *len;
630};
631
632%% advise	vp	U U U
633
634vop_advise {
635	IN struct vnode *vp;
636	IN off_t start;
637	IN off_t end;
638	IN int advice;
639};
640
641%% unp_bind	vp	E E E
642
643vop_unp_bind {
644	IN struct vnode *vp;
645	IN struct socket *socket;
646};
647
648%% unp_connect	vp	L L L
649
650vop_unp_connect {
651	IN struct vnode *vp;
652	OUT struct socket **socket;
653};
654
655%% unp_detach	vp	= = =
656
657vop_unp_detach {
658	IN struct vnode *vp;
659};
660
661%% is_text	vp	L L L
662
663vop_is_text {
664	IN struct vnode *vp;
665};
666
667%% set_text	vp	E E E
668
669vop_set_text {
670	IN struct vnode *vp;
671};
672
673%% vop_unset_text	vp	E E E
674
675vop_unset_text {
676	IN struct vnode *vp;
677};
678
679%% get_writecount	vp	L L L
680
681vop_get_writecount {
682	IN struct vnode *vp;
683	OUT int *writecount;
684};
685
686%% add_writecount	vp	E E E
687
688vop_add_writecount {
689	IN struct vnode *vp;
690	IN int inc;
691};
692
693# The VOPs below are spares at the end of the table to allow new VOPs to be
694# added in stable branches without breaking the KBI.  New VOPs in HEAD should
695# be added above these spares.  When merging a new VOP to a stable branch,
696# the new VOP should replace one of the spares.
697
698vop_spare1 {
699	IN struct vnode *vp;
700};
701
702vop_spare2 {
703	IN struct vnode *vp;
704};
705
706vop_spare3 {
707	IN struct vnode *vp;
708};
709
710vop_spare4 {
711	IN struct vnode *vp;
712};
713
714vop_spare5 {
715	IN struct vnode *vp;
716};
717