vnode_if.src revision 280869
1219820Sjeff#-
2219820Sjeff# Copyright (c) 1992, 1993
3219820Sjeff#	The Regents of the University of California.  All rights reserved.
4219820Sjeff#
5219820Sjeff# Redistribution and use in source and binary forms, with or without
6219820Sjeff# modification, are permitted provided that the following conditions
7219820Sjeff# are met:
8219820Sjeff# 1. Redistributions of source code must retain the above copyright
9219820Sjeff#    notice, this list of conditions and the following disclaimer.
10219820Sjeff# 2. Redistributions in binary form must reproduce the above copyright
11219820Sjeff#    notice, this list of conditions and the following disclaimer in the
12219820Sjeff#    documentation and/or other materials provided with the distribution.
13219820Sjeff# 4. Neither the name of the University nor the names of its contributors
14219820Sjeff#    may be used to endorse or promote products derived from this software
15219820Sjeff#    without specific prior written permission.
16219820Sjeff#
17219820Sjeff# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18277371Sngie# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19219820Sjeff# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20219820Sjeff# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21219820Sjeff# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22219820Sjeff# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23219820Sjeff# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27# SUCH DAMAGE.
28#
29#	@(#)vnode_if.src	8.12 (Berkeley) 5/14/95
30# $FreeBSD: head/sys/kern/vnode_if.src 280869 2015-03-30 22:49:26Z glebius $
31#
32
33#
34# Above each of the vop descriptors in lines starting with %%
35# is a specification of the locking protocol used by each vop call.
36# The first column is the name of the variable, the remaining three
37# columns are in, out and error respectively.  The "in" column defines
38# the lock state on input, the "out" column defines the state on succesful
39# return, and the "error" column defines the locking state on error exit.
40#
41# The locking value can take the following values:
42# L: locked; not converted to type of lock.
43# A: any lock type.
44# S: locked with shared lock.
45# E: locked with exclusive lock for this process.
46# O: locked with exclusive lock for other process.
47# U: unlocked.
48# -: not applicable.  vnode does not yet (or no longer) exists.
49# =: the same on input and output, may be either L or U.
50# X: locked if not nil.
51#
52# The paramater named "vpp" is assumed to be always used with double
53# indirection (**vpp) and that name is hard-coded in vnode_if.awk !
54#
55# Lines starting with %! specify a pre or post-condition function
56# to call before/after the vop call.
57#
58# If other such parameters are introduced, they have to be added to
59# the AWK script at the head of the definition of "add_debug_code()".
60#
61
62vop_islocked {
63	IN struct vnode *vp;
64};
65
66%% lookup	dvp	L L L
67%% lookup	vpp	- L -
68
69# XXX - the lookup locking protocol defies simple description and depends
70#	on the flags and operation fields in the (cnp) structure.  Note
71#	especially that *vpp may equal dvp and both may be locked.
72
73vop_lookup {
74	IN struct vnode *dvp;
75	INOUT struct vnode **vpp;
76	IN struct componentname *cnp;
77};
78
79%% cachedlookup	dvp	L L L
80%% cachedlookup	vpp	- L -
81
82# This must be an exact copy of lookup.  See kern/vfs_cache.c for details.
83
84vop_cachedlookup {
85	IN struct vnode *dvp;
86	INOUT struct vnode **vpp;
87	IN struct componentname *cnp;
88};
89
90%% create	dvp	E E E
91%% create	vpp	- L -
92%! create	post	vop_create_post
93
94vop_create {
95	IN struct vnode *dvp;
96	OUT struct vnode **vpp;
97	IN struct componentname *cnp;
98	IN struct vattr *vap;
99};
100
101
102%% whiteout	dvp	E E E
103
104vop_whiteout {
105	IN struct vnode *dvp;
106	IN struct componentname *cnp;
107	IN int flags;
108};
109
110
111%% mknod	dvp	E E E
112%% mknod	vpp	- L -
113%! mknod	post	vop_mknod_post
114
115vop_mknod {
116	IN struct vnode *dvp;
117	OUT struct vnode **vpp;
118	IN struct componentname *cnp;
119	IN struct vattr *vap;
120};
121
122
123%% open		vp	L L L
124
125vop_open {
126	IN struct vnode *vp;
127	IN int mode;
128	IN struct ucred *cred;
129	IN struct thread *td;
130	IN struct file *fp;
131};
132
133
134%% close	vp	L L L
135
136vop_close {
137	IN struct vnode *vp;
138	IN int fflag;
139	IN struct ucred *cred;
140	IN struct thread *td;
141};
142
143
144%% access	vp	L L L
145
146vop_access {
147	IN struct vnode *vp;
148	IN accmode_t accmode;
149	IN struct ucred *cred;
150	IN struct thread *td;
151};
152
153
154%% accessx	vp	L L L
155
156vop_accessx {
157	IN struct vnode *vp;
158	IN accmode_t accmode;
159	IN struct ucred *cred;
160	IN struct thread *td;
161};
162
163
164%% getattr	vp	L L L
165
166vop_getattr {
167	IN struct vnode *vp;
168	OUT struct vattr *vap;
169	IN struct ucred *cred;
170};
171
172
173%% setattr	vp	E E E
174%! setattr	post	vop_setattr_post
175
176vop_setattr {
177	IN struct vnode *vp;
178	IN struct vattr *vap;
179	IN struct ucred *cred;
180};
181
182%% markatime	vp	L L L
183
184vop_markatime {
185	IN struct vnode *vp;
186};
187
188%% read		vp	L L L
189
190vop_read {
191	IN struct vnode *vp;
192	INOUT struct uio *uio;
193	IN int ioflag;
194	IN struct ucred *cred;
195};
196
197
198%% write	vp	L L L
199%! write	pre	VOP_WRITE_PRE
200%! write	post	VOP_WRITE_POST
201
202vop_write {
203	IN struct vnode *vp;
204	INOUT struct uio *uio;
205	IN int ioflag;
206	IN struct ucred *cred;
207};
208
209
210%% ioctl	vp	U U U
211
212vop_ioctl {
213	IN struct vnode *vp;
214	IN u_long command;
215	IN void *data;
216	IN int fflag;
217	IN struct ucred *cred;
218	IN struct thread *td;
219};
220
221
222%% poll		vp	U U U
223
224vop_poll {
225	IN struct vnode *vp;
226	IN int events;
227	IN struct ucred *cred;
228	IN struct thread *td;
229};
230
231
232%% kqfilter	vp	U U U
233
234vop_kqfilter {
235	IN struct vnode *vp;
236	IN struct knote *kn;
237};
238
239
240%% revoke	vp	L L L
241
242vop_revoke {
243	IN struct vnode *vp;
244	IN int flags;
245};
246
247
248%% fsync	vp	L L L
249
250vop_fsync {
251	IN struct vnode *vp;
252	IN int waitfor;
253	IN struct thread *td;
254};
255
256
257%% remove	dvp	E E E
258%% remove	vp	E E E
259%! remove	post	vop_remove_post
260
261vop_remove {
262	IN struct vnode *dvp;
263	IN struct vnode *vp;
264	IN struct componentname *cnp;
265};
266
267
268%% link		tdvp	E E E
269%% link		vp	E E E
270%! link		post	vop_link_post
271
272vop_link {
273	IN struct vnode *tdvp;
274	IN struct vnode *vp;
275	IN struct componentname *cnp;
276};
277
278
279%! rename	pre	vop_rename_pre
280%! rename	post	vop_rename_post
281
282vop_rename {
283	IN WILLRELE struct vnode *fdvp;
284	IN WILLRELE struct vnode *fvp;
285	IN struct componentname *fcnp;
286	IN WILLRELE struct vnode *tdvp;
287	IN WILLRELE struct vnode *tvp;
288	IN struct componentname *tcnp;
289};
290
291
292%% mkdir	dvp	E E E
293%% mkdir	vpp	- E -
294%! mkdir	post	vop_mkdir_post
295
296vop_mkdir {
297	IN struct vnode *dvp;
298	OUT struct vnode **vpp;
299	IN struct componentname *cnp;
300	IN struct vattr *vap;
301};
302
303
304%% rmdir	dvp	E E E
305%% rmdir	vp	E E E
306%! rmdir	post	vop_rmdir_post
307
308vop_rmdir {
309	IN struct vnode *dvp;
310	IN struct vnode *vp;
311	IN struct componentname *cnp;
312};
313
314
315%% symlink	dvp	E E E
316%% symlink	vpp	- E -
317%! symlink	post	vop_symlink_post
318
319vop_symlink {
320	IN struct vnode *dvp;
321	OUT struct vnode **vpp;
322	IN struct componentname *cnp;
323	IN struct vattr *vap;
324	IN char *target;
325};
326
327
328%% readdir	vp	L L L
329
330vop_readdir {
331	IN struct vnode *vp;
332	INOUT struct uio *uio;
333	IN struct ucred *cred;
334	INOUT int *eofflag;
335	OUT int *ncookies;
336	INOUT u_long **cookies;
337};
338
339
340%% readlink	vp	L L L
341
342vop_readlink {
343	IN struct vnode *vp;
344	INOUT struct uio *uio;
345	IN struct ucred *cred;
346};
347
348
349%% inactive	vp	E E E
350
351vop_inactive {
352	IN struct vnode *vp;
353	IN struct thread *td;
354};
355
356
357%% reclaim	vp	E E E
358
359vop_reclaim {
360	IN struct vnode *vp;
361	IN struct thread *td;
362};
363
364
365%! lock1	pre	vop_lock_pre
366%! lock1	post	vop_lock_post
367
368vop_lock1 {
369	IN struct vnode *vp;
370	IN int flags;
371	IN char *file;
372	IN int line;
373};
374
375
376%! unlock	pre	vop_unlock_pre
377%! unlock	post	vop_unlock_post
378
379vop_unlock {
380	IN struct vnode *vp;
381	IN int flags;
382};
383
384
385%% bmap		vp	L L L
386
387vop_bmap {
388	IN struct vnode *vp;
389	IN daddr_t bn;
390	OUT struct bufobj **bop;
391	IN daddr_t *bnp;
392	OUT int *runp;
393	OUT int *runb;
394};
395
396
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};
477
478
479%% getpages_async	vp	L L L
480
481vop_getpages_async {
482	IN struct vnode *vp;
483	IN vm_page_t *m;
484	IN int count;
485	IN int reqpage;
486	IN vop_getpages_iodone_t *iodone;
487	IN void *arg;
488};
489
490
491%% putpages	vp	L L L
492
493vop_putpages {
494	IN struct vnode *vp;
495	IN vm_page_t *m;
496	IN int count;
497	IN int sync;
498	IN int *rtvals;
499};
500
501
502%% getacl	vp	L L L
503
504vop_getacl {
505	IN struct vnode *vp;
506	IN acl_type_t type;
507	OUT struct acl *aclp;
508	IN struct ucred *cred;
509	IN struct thread *td;
510};
511
512
513%% setacl	vp	E E E
514
515vop_setacl {
516	IN struct vnode *vp;
517	IN acl_type_t type;
518	IN struct acl *aclp;
519	IN struct ucred *cred;
520	IN struct thread *td;
521};
522
523
524%% aclcheck	vp	= = =
525
526vop_aclcheck {
527	IN struct vnode *vp;
528	IN acl_type_t type;
529	IN struct acl *aclp;
530	IN struct ucred *cred;
531	IN struct thread *td;
532};
533
534
535%% closeextattr	vp	L L L
536
537vop_closeextattr {
538	IN struct vnode *vp;
539	IN int commit;
540	IN struct ucred *cred;
541	IN struct thread *td;
542};
543
544
545%% getextattr	vp	L L L
546
547vop_getextattr {
548	IN struct vnode *vp;
549	IN int attrnamespace;
550	IN const char *name;
551	INOUT struct uio *uio;
552	OUT size_t *size;
553	IN struct ucred *cred;
554	IN struct thread *td;
555};
556
557
558%% listextattr	vp	L L L
559
560vop_listextattr {
561	IN struct vnode *vp;
562	IN int attrnamespace;
563	INOUT struct uio *uio;
564	OUT size_t *size;
565	IN struct ucred *cred;
566	IN struct thread *td;
567};
568
569
570%% openextattr	vp	L L L
571
572vop_openextattr {
573	IN struct vnode *vp;
574	IN struct ucred *cred;
575	IN struct thread *td;
576};
577
578
579%% deleteextattr	vp	E E E
580%! deleteextattr	post	vop_deleteextattr_post
581
582vop_deleteextattr {
583	IN struct vnode *vp;
584	IN int attrnamespace;
585	IN const char *name;
586	IN struct ucred *cred;
587	IN struct thread *td;
588};
589
590
591%% setextattr	vp	E E E
592%! setextattr	post	vop_setextattr_post
593
594vop_setextattr {
595	IN struct vnode *vp;
596	IN int attrnamespace;
597	IN const char *name;
598	INOUT struct uio *uio;
599	IN struct ucred *cred;
600	IN struct thread *td;
601};
602
603
604%% setlabel	vp	E E E
605
606vop_setlabel {
607	IN struct vnode *vp;
608	IN struct label *label;
609	IN struct ucred *cred;
610	IN struct thread *td;
611};
612
613
614%% vptofh	vp	= = =
615
616vop_vptofh {
617	IN struct vnode *vp;
618	IN struct fid *fhp;
619};
620
621
622%% vptocnp		vp	L L L
623%% vptocnp		vpp	- U -
624
625vop_vptocnp {
626	IN struct vnode *vp;
627	OUT struct vnode **vpp;
628	IN struct ucred *cred;
629	INOUT char *buf;
630	INOUT int *buflen;
631};
632
633
634%% allocate	vp	E E E
635
636vop_allocate {
637	IN struct vnode *vp;
638	INOUT off_t *offset;
639	INOUT off_t *len;
640};
641
642%% advise	vp	U U U
643
644vop_advise {
645	IN struct vnode *vp;
646	IN off_t start;
647	IN off_t end;
648	IN int advice;
649};
650
651%% unp_bind	vp	E E E
652
653vop_unp_bind {
654	IN struct vnode *vp;
655	IN struct socket *socket;
656};
657
658%% unp_connect	vp	L L L
659
660vop_unp_connect {
661	IN struct vnode *vp;
662	OUT struct socket **socket;
663};
664
665%% unp_detach	vp	= = =
666
667vop_unp_detach {
668	IN struct vnode *vp;
669};
670
671%% is_text	vp	L L L
672
673vop_is_text {
674	IN struct vnode *vp;
675};
676
677%% set_text	vp	E E E
678
679vop_set_text {
680	IN struct vnode *vp;
681};
682
683%% vop_unset_text	vp	E E E
684
685vop_unset_text {
686	IN struct vnode *vp;
687};
688
689%% get_writecount	vp	L L L
690
691vop_get_writecount {
692	IN struct vnode *vp;
693	OUT int *writecount;
694};
695
696%% add_writecount	vp	E E E
697
698vop_add_writecount {
699	IN struct vnode *vp;
700	IN int inc;
701};
702
703# The VOPs below are spares at the end of the table to allow new VOPs to be
704# added in stable branches without breaking the KBI.  New VOPs in HEAD should
705# be added above these spares.  When merging a new VOP to a stable branch,
706# the new VOP should replace one of the spares.
707
708vop_spare1 {
709	IN struct vnode *vp;
710};
711
712vop_spare2 {
713	IN struct vnode *vp;
714};
715
716vop_spare3 {
717	IN struct vnode *vp;
718};
719
720vop_spare4 {
721	IN struct vnode *vp;
722};
723
724vop_spare5 {
725	IN struct vnode *vp;
726};
727