vnode_if.src revision 140781
1#-
2# Copyright (c) 1992, 1993
3#	The Regents of the University of California.  All rights reserved.
4#
5# Redistribution and use in source and binary forms, with or without
6# modification, are permitted provided that the following conditions
7# are met:
8# 1. Redistributions of source code must retain the above copyright
9#    notice, this list of conditions and the following disclaimer.
10# 2. Redistributions in binary form must reproduce the above copyright
11#    notice, this list of conditions and the following disclaimer in the
12#    documentation and/or other materials provided with the distribution.
13# 4. Neither the name of the University nor the names of its contributors
14#    may be used to endorse or promote products derived from this software
15#    without specific prior written permission.
16#
17# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23# 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 140781 2005-01-25 00:12:24Z phk $
31#
32
33#
34# Above each of the vop descriptors is a specification of the locking
35# protocol used by each vop call.  The first column is the name of
36# the variable, the remaining three columns are in, out and error
37# respectively.  The "in" column defines the lock state on input,
38# the "out" column defines the state on succesful return, and the
39# "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-codeed in vnode_if.awk !
54#
55# If other such parameters are introduced, they have to be added to
56# the AWK script at the head of the definition of "add_debug_code()".
57#
58
59#
60# islocked	vp	= = =
61#
62vop_islocked {
63	IN struct vnode *vp;
64	IN struct thread *td;
65};
66
67#
68# lookup	dvp	L ? ?
69# lookup	vpp	- L -
70#! lookup	pre	vop_lookup_pre
71#! lookup	post	vop_lookup_post
72#
73# XXX - the lookup locking protocol defies simple description and depends
74#	on the flags and operation fields in the (cnp) structure.  Note
75#	especially that *vpp may equal dvp and both may be locked.
76#
77vop_lookup {
78	IN struct vnode *dvp;
79	INOUT struct vnode **vpp;
80	IN struct componentname *cnp;
81};
82
83#
84#% cachedlookup	dvp	L ? ?
85#% cachedlookup	vpp	- L -
86#
87# This must be an exact copy of lookup.  See kern/vfs_cache.c for details.
88#
89vop_cachedlookup {
90	IN struct vnode *dvp;
91	INOUT struct vnode **vpp;
92	IN struct componentname *cnp;
93};
94
95#
96#% create	dvp	L L L
97#% create	vpp	- L -
98#
99vop_create {
100	IN struct vnode *dvp;
101	OUT struct vnode **vpp;
102	IN struct componentname *cnp;
103	IN struct vattr *vap;
104};
105
106#
107#% whiteout	dvp	L L L
108#
109vop_whiteout {
110	IN struct vnode *dvp;
111	IN struct componentname *cnp;
112	IN int flags;
113};
114
115#
116#% mknod	dvp	L L L
117#% mknod	vpp	- L -
118#
119vop_mknod {
120	IN struct vnode *dvp;
121	OUT struct vnode **vpp;
122	IN struct componentname *cnp;
123	IN struct vattr *vap;
124};
125
126#
127#% open		vp	L L L
128#
129vop_open {
130	IN struct vnode *vp;
131	IN int mode;
132	IN struct ucred *cred;
133	IN struct thread *td;
134	IN int fdidx;
135};
136
137#
138#% close	vp	U U U
139#
140vop_close {
141	IN struct vnode *vp;
142	IN int fflag;
143	IN struct ucred *cred;
144	IN struct thread *td;
145};
146
147#
148#% access	vp	L L L
149#
150vop_access {
151	IN struct vnode *vp;
152	IN int mode;
153	IN struct ucred *cred;
154	IN struct thread *td;
155};
156
157#
158#% getattr	vp	L L L
159#
160vop_getattr {
161	IN struct vnode *vp;
162	OUT struct vattr *vap;
163	IN struct ucred *cred;
164	IN struct thread *td;
165};
166
167#
168#% setattr	vp	L L L
169#
170vop_setattr {
171	IN struct vnode *vp;
172	IN struct vattr *vap;
173	IN struct ucred *cred;
174	IN struct thread *td;
175};
176
177#
178#% read		vp	L L L
179#
180vop_read {
181	IN struct vnode *vp;
182	INOUT struct uio *uio;
183	IN int ioflag;
184	IN struct ucred *cred;
185};
186
187#
188#% write	vp	L L L
189#
190vop_write {
191	IN struct vnode *vp;
192	INOUT struct uio *uio;
193	IN int ioflag;
194	IN struct ucred *cred;
195};
196
197#
198#% lease	vp	= = =
199#
200vop_lease {
201	IN struct vnode *vp;
202	IN struct thread *td;
203	IN struct ucred *cred;
204	IN int flag;
205};
206
207#
208#% ioctl	vp	U U U
209#
210vop_ioctl {
211	IN struct vnode *vp;
212	IN u_long command;
213	IN caddr_t data;
214	IN int fflag;
215	IN struct ucred *cred;
216	IN struct thread *td;
217};
218
219#
220#% poll	vp	U U U
221#
222vop_poll {
223	IN struct vnode *vp;
224	IN int events;
225	IN struct ucred *cred;
226	IN struct thread *td;
227};
228
229#
230#% kqfilter	vp	U U U
231#
232vop_kqfilter {
233	IN struct vnode *vp;
234	IN struct knote *kn;
235};
236
237#
238#% revoke	vp	U U U
239#
240vop_revoke {
241	IN struct vnode *vp;
242	IN int flags;
243};
244
245#
246#% fsync	vp	L L L
247#
248vop_fsync {
249	IN struct vnode *vp;
250	IN int waitfor;
251	IN struct thread *td;
252};
253
254#
255#% remove	dvp	L L L
256#% remove	vp	L L L
257#
258vop_remove {
259	IN struct vnode *dvp;
260	IN struct vnode *vp;
261	IN struct componentname *cnp;
262};
263
264#
265#% link		tdvp	L L L
266#% link		vp	L L L
267#
268vop_link {
269	IN struct vnode *tdvp;
270	IN struct vnode *vp;
271	IN struct componentname *cnp;
272};
273
274#
275# rename	fdvp	U U U
276# rename	fvp	U U U
277# rename	tdvp	L U U
278# rename	tvp	X U U
279#! rename	pre	vop_rename_pre
280#
281vop_rename {
282	IN WILLRELE struct vnode *fdvp;
283	IN WILLRELE struct vnode *fvp;
284	IN struct componentname *fcnp;
285	IN WILLRELE struct vnode *tdvp;
286	IN WILLRELE struct vnode *tvp;
287	IN struct componentname *tcnp;
288};
289
290#
291#% mkdir	dvp	L L L
292#% mkdir	vpp	- L -
293#
294vop_mkdir {
295	IN struct vnode *dvp;
296	OUT struct vnode **vpp;
297	IN struct componentname *cnp;
298	IN struct vattr *vap;
299};
300
301#
302#% rmdir	dvp	L L L
303#% rmdir	vp	L L L
304#
305vop_rmdir {
306	IN struct vnode *dvp;
307	IN struct vnode *vp;
308	IN struct componentname *cnp;
309};
310
311#
312#% symlink	dvp	L L L
313#% symlink	vpp	- L -
314#
315vop_symlink {
316	IN struct vnode *dvp;
317	OUT struct vnode **vpp;
318	IN struct componentname *cnp;
319	IN struct vattr *vap;
320	IN char *target;
321};
322
323#
324#% readdir	vp	L L L
325#
326vop_readdir {
327	IN struct vnode *vp;
328	INOUT struct uio *uio;
329	IN struct ucred *cred;
330	INOUT int *eofflag;
331	OUT int *ncookies;
332	INOUT u_long **cookies;
333};
334
335#
336#% readlink	vp	L L L
337#
338vop_readlink {
339	IN struct vnode *vp;
340	INOUT struct uio *uio;
341	IN struct ucred *cred;
342};
343
344#
345#% inactive	vp	L U U
346#
347vop_inactive {
348	IN struct vnode *vp;
349	IN struct thread *td;
350};
351
352#
353#% reclaim	vp	U U U
354#
355vop_reclaim {
356	IN struct vnode *vp;
357	IN struct thread *td;
358};
359
360#
361#lock		vp	? ? ?
362#! lock		pre	vop_lock_pre
363#! lock		post	vop_lock_post
364#
365vop_lock {
366	IN struct vnode *vp;
367	IN int flags;
368	IN struct thread *td;
369};
370
371#
372#unlock		vp	L ? L
373#! unlock	pre	vop_unlock_pre
374#! unlock	post	vop_unlock_post
375#
376vop_unlock {
377	IN struct vnode *vp;
378	IN int flags;
379	IN struct thread *td;
380};
381
382#
383#% bmap		vp	L L L
384#
385vop_bmap {
386	IN struct vnode *vp;
387	IN daddr_t bn;
388	OUT struct bufobj **bop;
389	IN daddr_t *bnp;
390	OUT int *runp;
391	OUT int *runb;
392};
393
394#
395# strategy	vp	L L L
396#! strategy	pre	vop_strategy_pre
397#
398vop_strategy {
399	IN struct vnode *vp;
400	IN struct buf *bp;
401};
402
403#
404#% getwritemount vp	= = =
405#
406vop_getwritemount {
407	IN struct vnode *vp;
408	OUT struct mount **mpp;
409};
410
411#
412#% print	vp	= = =
413#
414vop_print {
415	IN struct vnode *vp;
416};
417
418#
419#% pathconf	vp	L L L
420#
421vop_pathconf {
422	IN struct vnode *vp;
423	IN int name;
424	OUT register_t *retval;
425};
426
427#
428#% advlock	vp	U U U
429#
430vop_advlock {
431	IN struct vnode *vp;
432	IN caddr_t id;
433	IN int op;
434	IN struct flock *fl;
435	IN int flags;
436};
437
438#
439#% reallocblks	vp	L L L
440#
441vop_reallocblks {
442	IN struct vnode *vp;
443	IN struct cluster_save *buflist;
444};
445
446#
447#% getpages	vp	L L L
448#
449vop_getpages {
450	IN struct vnode *vp;
451	IN vm_page_t *m;
452	IN int count;
453	IN int reqpage;
454	IN vm_ooffset_t offset;
455};
456
457#
458#% putpages	vp	L L L
459#
460vop_putpages {
461	IN struct vnode *vp;
462	IN vm_page_t *m;
463	IN int count;
464	IN int sync;
465	IN int *rtvals;
466	IN vm_ooffset_t offset;
467};
468
469#
470#% getacl	vp	L L L
471#
472vop_getacl {
473	IN struct vnode *vp;
474	IN acl_type_t type;
475	OUT struct acl *aclp;
476	IN struct ucred *cred;
477	IN struct thread *td;
478};
479
480#
481#% setacl	vp	L L L
482#
483vop_setacl {
484	IN struct vnode *vp;
485	IN acl_type_t type;
486	IN struct acl *aclp;
487	IN struct ucred *cred;
488	IN struct thread *td;
489};
490
491#
492#% aclcheck	vp	= = =
493#
494vop_aclcheck {
495	IN struct vnode *vp;
496	IN acl_type_t type;
497	IN struct acl *aclp;
498	IN struct ucred *cred;
499	IN struct thread *td;
500};
501
502#
503#% closeextattr	vp	L L L
504#
505vop_closeextattr {
506	IN struct vnode *vp;
507	IN int commit;
508	IN struct ucred *cred;
509	IN struct thread *td;
510};
511
512#
513#% getextattr	vp	L L L
514#
515vop_getextattr {
516	IN struct vnode *vp;
517	IN int attrnamespace;
518	IN const char *name;
519	INOUT struct uio *uio;
520	OUT size_t *size;
521	IN struct ucred *cred;
522	IN struct thread *td;
523};
524
525#
526#% listextattr	vp	L L L
527#
528vop_listextattr {
529	IN struct vnode *vp;
530	IN int attrnamespace;
531	INOUT struct uio *uio;
532	OUT size_t *size;
533	IN struct ucred *cred;
534	IN struct thread *td;
535};
536
537#
538#% openextattr	vp	L L L
539#
540vop_openextattr {
541	IN struct vnode *vp;
542	IN struct ucred *cred;
543	IN struct thread *td;
544};
545
546#
547#% deleteextattr	vp	L L L
548#
549vop_deleteextattr {
550	IN struct vnode *vp;
551	IN int attrnamespace;
552	IN const char *name;
553	IN struct ucred *cred;
554	IN struct thread *td;
555};
556
557#
558#% setextattr	vp	L L L
559#
560vop_setextattr {
561	IN struct vnode *vp;
562	IN int attrnamespace;
563	IN const char *name;
564	INOUT struct uio *uio;
565	IN struct ucred *cred;
566	IN struct thread *td;
567};
568
569#
570#% destroyvobject	vp	L L L
571#
572vop_destroyvobject {
573	IN struct vnode *vp;
574};
575
576#
577#% getvobject	vp	L L L
578#
579vop_getvobject {
580	IN struct vnode *vp;
581	OUT struct vm_object **objpp;
582};
583
584#
585#% setlabel	vp	L L L
586#
587vop_setlabel {
588	IN struct vnode *vp;
589	IN struct label *label;
590	IN struct ucred *cred;
591	IN struct thread *td;
592};
593