vnode_if.src revision 153400
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 153400 2005-12-14 00:49:52Z des $
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	E E E
97#% create	vpp	- L -
98#! create	post	vop_create_post
99#
100vop_create {
101	IN struct vnode *dvp;
102	OUT struct vnode **vpp;
103	IN struct componentname *cnp;
104	IN struct vattr *vap;
105};
106
107#
108#% whiteout	dvp	E E E
109#
110vop_whiteout {
111	IN struct vnode *dvp;
112	IN struct componentname *cnp;
113	IN int flags;
114};
115
116#
117#% mknod	dvp	E E E
118#% mknod	vpp	- L -
119#! mknod	post	vop_mknod_post
120#
121vop_mknod {
122	IN struct vnode *dvp;
123	OUT struct vnode **vpp;
124	IN struct componentname *cnp;
125	IN struct vattr *vap;
126};
127
128#
129#% open		vp	L L L
130#
131vop_open {
132	IN struct vnode *vp;
133	IN int mode;
134	IN struct ucred *cred;
135	IN struct thread *td;
136	IN int fdidx;
137};
138
139#
140#% close	vp	E E E
141#
142vop_close {
143	IN struct vnode *vp;
144	IN int fflag;
145	IN struct ucred *cred;
146	IN struct thread *td;
147};
148
149#
150#% access	vp	L L L
151#
152vop_access {
153	IN struct vnode *vp;
154	IN int mode;
155	IN struct ucred *cred;
156	IN struct thread *td;
157};
158
159#
160#% getattr	vp	L L L
161#
162vop_getattr {
163	IN struct vnode *vp;
164	OUT struct vattr *vap;
165	IN struct ucred *cred;
166	IN struct thread *td;
167};
168
169#
170#% setattr	vp	E E E
171#! setattr	post	vop_setattr_post
172#
173vop_setattr {
174	IN struct vnode *vp;
175	IN struct vattr *vap;
176	IN struct ucred *cred;
177	IN struct thread *td;
178};
179
180#
181#% read		vp	L L L
182#
183vop_read {
184	IN struct vnode *vp;
185	INOUT struct uio *uio;
186	IN int ioflag;
187	IN struct ucred *cred;
188};
189
190#
191#% write	vp	E E E
192#! write	pre	VOP_WRITE_PRE
193#! write	post	VOP_WRITE_POST
194#
195vop_write {
196	IN struct vnode *vp;
197	INOUT struct uio *uio;
198	IN int ioflag;
199	IN struct ucred *cred;
200};
201
202#
203#% lease	vp	= = =
204#
205vop_lease {
206	IN struct vnode *vp;
207	IN struct thread *td;
208	IN struct ucred *cred;
209	IN int flag;
210};
211
212#
213#% ioctl	vp	U U U
214#
215vop_ioctl {
216	IN struct vnode *vp;
217	IN u_long command;
218	IN void *data;
219	IN int fflag;
220	IN struct ucred *cred;
221	IN struct thread *td;
222};
223
224#
225#% poll	vp	U U U
226#
227vop_poll {
228	IN struct vnode *vp;
229	IN int events;
230	IN struct ucred *cred;
231	IN struct thread *td;
232};
233
234#
235#% kqfilter	vp	U U U
236#
237vop_kqfilter {
238	IN struct vnode *vp;
239	IN struct knote *kn;
240};
241
242#
243#% revoke	vp	L L L
244#
245vop_revoke {
246	IN struct vnode *vp;
247	IN int flags;
248};
249
250#
251#% fsync	vp	E E E
252#
253vop_fsync {
254	IN struct vnode *vp;
255	IN int waitfor;
256	IN struct thread *td;
257};
258
259#
260#% remove	dvp	E E E
261#% remove	vp	E E E
262#! remove	post	vop_remove_post
263#
264vop_remove {
265	IN struct vnode *dvp;
266	IN struct vnode *vp;
267	IN struct componentname *cnp;
268};
269
270#
271#% link		tdvp	E E E
272#% link		vp	E E E
273#! link		post	vop_link_post
274#
275vop_link {
276	IN struct vnode *tdvp;
277	IN struct vnode *vp;
278	IN struct componentname *cnp;
279};
280
281#
282# rename	fdvp	U U U
283# rename	fvp	U U U
284# rename	tdvp	E U U
285# rename	tvp	X U U
286#! rename	pre	vop_rename_pre
287#! rename	post	vop_rename_post
288#
289vop_rename {
290	IN WILLRELE struct vnode *fdvp;
291	IN WILLRELE struct vnode *fvp;
292	IN struct componentname *fcnp;
293	IN WILLRELE struct vnode *tdvp;
294	IN WILLRELE struct vnode *tvp;
295	IN struct componentname *tcnp;
296};
297
298#
299#% mkdir	dvp	E E E
300#% mkdir	vpp	- E -
301#! mkdir	post	vop_mkdir_post
302#
303vop_mkdir {
304	IN struct vnode *dvp;
305	OUT struct vnode **vpp;
306	IN struct componentname *cnp;
307	IN struct vattr *vap;
308};
309
310#
311#% rmdir	dvp	E E E
312#% rmdir	vp	E E E
313#! rmdir	post	vop_rmdir_post
314#
315vop_rmdir {
316	IN struct vnode *dvp;
317	IN struct vnode *vp;
318	IN struct componentname *cnp;
319};
320
321#
322#% symlink	dvp	E E E
323#% symlink	vpp	- E -
324#! symlink	post	vop_symlink_post
325#
326vop_symlink {
327	IN struct vnode *dvp;
328	OUT struct vnode **vpp;
329	IN struct componentname *cnp;
330	IN struct vattr *vap;
331	IN char *target;
332};
333
334#
335#% readdir	vp	L L L
336#
337vop_readdir {
338	IN struct vnode *vp;
339	INOUT struct uio *uio;
340	IN struct ucred *cred;
341	INOUT int *eofflag;
342	OUT int *ncookies;
343	INOUT u_long **cookies;
344};
345
346#
347#% readlink	vp	L L L
348#
349vop_readlink {
350	IN struct vnode *vp;
351	INOUT struct uio *uio;
352	IN struct ucred *cred;
353};
354
355#
356#% inactive	vp	E E E
357#
358vop_inactive {
359	IN struct vnode *vp;
360	IN struct thread *td;
361};
362
363#
364#% reclaim	vp	E E E
365#
366vop_reclaim {
367	IN struct vnode *vp;
368	IN struct thread *td;
369};
370
371#
372#lock		vp	? ? ?
373#! lock		pre	vop_lock_pre
374#! lock		post	vop_lock_post
375#
376vop_lock {
377	IN struct vnode *vp;
378	IN int flags;
379	IN struct thread *td;
380};
381
382#
383#unlock		vp	L ? L
384#! unlock	pre	vop_unlock_pre
385#! unlock	post	vop_unlock_post
386#
387vop_unlock {
388	IN struct vnode *vp;
389	IN int flags;
390	IN struct thread *td;
391};
392
393#
394#% bmap		vp	L L L
395#
396vop_bmap {
397	IN struct vnode *vp;
398	IN daddr_t bn;
399	OUT struct bufobj **bop;
400	IN daddr_t *bnp;
401	OUT int *runp;
402	OUT int *runb;
403};
404
405#
406# strategy	vp	L L L
407#! strategy	pre	vop_strategy_pre
408#
409vop_strategy {
410	IN struct vnode *vp;
411	IN struct buf *bp;
412};
413
414#
415#% getwritemount vp	= = =
416#
417vop_getwritemount {
418	IN struct vnode *vp;
419	OUT struct mount **mpp;
420};
421
422#
423#% print	vp	= = =
424#
425vop_print {
426	IN struct vnode *vp;
427};
428
429#
430#% pathconf	vp	L L L
431#
432vop_pathconf {
433	IN struct vnode *vp;
434	IN int name;
435	OUT register_t *retval;
436};
437
438#
439#% advlock	vp	U U U
440#
441vop_advlock {
442	IN struct vnode *vp;
443	IN void *id;
444	IN int op;
445	IN struct flock *fl;
446	IN int flags;
447};
448
449#
450#% reallocblks	vp	E E E
451#
452vop_reallocblks {
453	IN struct vnode *vp;
454	IN struct cluster_save *buflist;
455};
456
457#
458#% getpages	vp	L L L
459#
460vop_getpages {
461	IN struct vnode *vp;
462	IN vm_page_t *m;
463	IN int count;
464	IN int reqpage;
465	IN vm_ooffset_t offset;
466};
467
468#
469#% putpages	vp	E E E
470#
471vop_putpages {
472	IN struct vnode *vp;
473	IN vm_page_t *m;
474	IN int count;
475	IN int sync;
476	IN int *rtvals;
477	IN vm_ooffset_t offset;
478};
479
480#
481#% getacl	vp	L L L
482#
483vop_getacl {
484	IN struct vnode *vp;
485	IN acl_type_t type;
486	OUT struct acl *aclp;
487	IN struct ucred *cred;
488	IN struct thread *td;
489};
490
491#
492#% setacl	vp	E E E
493#
494vop_setacl {
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#% aclcheck	vp	= = =
504#
505vop_aclcheck {
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#% closeextattr	vp	L L L
515#
516vop_closeextattr {
517	IN struct vnode *vp;
518	IN int commit;
519	IN struct ucred *cred;
520	IN struct thread *td;
521};
522
523#
524#% getextattr	vp	L L L
525#
526vop_getextattr {
527	IN struct vnode *vp;
528	IN int attrnamespace;
529	IN const char *name;
530	INOUT struct uio *uio;
531	OUT size_t *size;
532	IN struct ucred *cred;
533	IN struct thread *td;
534};
535
536#
537#% listextattr	vp	L L L
538#
539vop_listextattr {
540	IN struct vnode *vp;
541	IN int attrnamespace;
542	INOUT struct uio *uio;
543	OUT size_t *size;
544	IN struct ucred *cred;
545	IN struct thread *td;
546};
547
548#
549#% openextattr	vp	L L L
550#
551vop_openextattr {
552	IN struct vnode *vp;
553	IN struct ucred *cred;
554	IN struct thread *td;
555};
556
557#
558#% deleteextattr	vp	E E E
559#
560vop_deleteextattr {
561	IN struct vnode *vp;
562	IN int attrnamespace;
563	IN const char *name;
564	IN struct ucred *cred;
565	IN struct thread *td;
566};
567
568#
569#% setextattr	vp	E E E
570#
571vop_setextattr {
572	IN struct vnode *vp;
573	IN int attrnamespace;
574	IN const char *name;
575	INOUT struct uio *uio;
576	IN struct ucred *cred;
577	IN struct thread *td;
578};
579
580#
581#% setlabel	vp	E E E
582#
583vop_setlabel {
584	IN struct vnode *vp;
585	IN struct label *label;
586	IN struct ucred *cred;
587	IN struct thread *td;
588};
589