vnode_if.src revision 159080
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 159080 2006-05-30 20:21:51Z dds $
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
59vop_islocked {
60	IN struct vnode *vp;
61	IN struct thread *td;
62};
63
64#
65#% lookup	dvp	L ? ?
66#% lookup	vpp	- L -
67#! lookup	pre	vop_lookup_pre
68#! lookup	post	vop_lookup_post
69#
70# XXX - the lookup locking protocol defies simple description and depends
71#	on the flags and operation fields in the (cnp) structure.  Note
72#	especially that *vpp may equal dvp and both may be locked.
73#
74vop_lookup {
75	IN struct vnode *dvp;
76	INOUT struct vnode **vpp;
77	IN struct componentname *cnp;
78};
79
80#
81#% cachedlookup	dvp	L ? ?
82#% cachedlookup	vpp	- L -
83#
84# This must be an exact copy of lookup.  See kern/vfs_cache.c for details.
85#
86vop_cachedlookup {
87	IN struct vnode *dvp;
88	INOUT struct vnode **vpp;
89	IN struct componentname *cnp;
90};
91
92#
93#% create	dvp	E E E
94#% create	vpp	- L -
95#! create	post	vop_create_post
96#
97vop_create {
98	IN struct vnode *dvp;
99	OUT struct vnode **vpp;
100	IN struct componentname *cnp;
101	IN struct vattr *vap;
102};
103
104#
105#% whiteout	dvp	E E E
106#
107vop_whiteout {
108	IN struct vnode *dvp;
109	IN struct componentname *cnp;
110	IN int flags;
111};
112
113#
114#% mknod	dvp	E E E
115#% mknod	vpp	- L -
116#! mknod	post	vop_mknod_post
117#
118vop_mknod {
119	IN struct vnode *dvp;
120	OUT struct vnode **vpp;
121	IN struct componentname *cnp;
122	IN struct vattr *vap;
123};
124
125#
126#% open		vp	L L L
127#
128vop_open {
129	IN struct vnode *vp;
130	IN int mode;
131	IN struct ucred *cred;
132	IN struct thread *td;
133	IN int fdidx;
134};
135
136#
137#% close	vp	E E E
138#
139vop_close {
140	IN struct vnode *vp;
141	IN int fflag;
142	IN struct ucred *cred;
143	IN struct thread *td;
144};
145
146#
147#% access	vp	L L L
148#
149vop_access {
150	IN struct vnode *vp;
151	IN int mode;
152	IN struct ucred *cred;
153	IN struct thread *td;
154};
155
156#
157#% getattr	vp	L L L
158#
159vop_getattr {
160	IN struct vnode *vp;
161	OUT struct vattr *vap;
162	IN struct ucred *cred;
163	IN struct thread *td;
164};
165
166#
167#% setattr	vp	E E E
168#! setattr	post	vop_setattr_post
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	E E E
189#! write	pre	VOP_WRITE_PRE
190#! write	post	VOP_WRITE_POST
191#
192vop_write {
193	IN struct vnode *vp;
194	INOUT struct uio *uio;
195	IN int ioflag;
196	IN struct ucred *cred;
197};
198
199#
200#% lease	vp	= = =
201#
202vop_lease {
203	IN struct vnode *vp;
204	IN struct thread *td;
205	IN struct ucred *cred;
206	IN int flag;
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	E E E
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#lock		vp	? ? ?
366#! lock		pre	vop_lock_pre
367#! lock		post	vop_lock_post
368#
369vop_lock {
370	IN struct vnode *vp;
371	IN int flags;
372	IN struct thread *td;
373};
374
375#
376#unlock		vp	L ? L
377#! unlock	pre	vop_unlock_pre
378#! unlock	post	vop_unlock_post
379#
380vop_unlock {
381	IN struct vnode *vp;
382	IN int flags;
383	IN struct thread *td;
384};
385
386#
387#% bmap		vp	L L L
388#
389vop_bmap {
390	IN struct vnode *vp;
391	IN daddr_t bn;
392	OUT struct bufobj **bop;
393	IN daddr_t *bnp;
394	OUT int *runp;
395	OUT int *runb;
396};
397
398#
399#% strategy	vp	L L L
400#! strategy	pre	vop_strategy_pre
401#
402vop_strategy {
403	IN struct vnode *vp;
404	IN struct buf *bp;
405};
406
407#
408#% getwritemount vp	= = =
409#
410vop_getwritemount {
411	IN struct vnode *vp;
412	OUT struct mount **mpp;
413};
414
415#
416#% print	vp	= = =
417#
418vop_print {
419	IN struct vnode *vp;
420};
421
422#
423#% pathconf	vp	L L L
424#
425vop_pathconf {
426	IN struct vnode *vp;
427	IN int name;
428	OUT register_t *retval;
429};
430
431#
432#% advlock	vp	U U U
433#
434vop_advlock {
435	IN struct vnode *vp;
436	IN void *id;
437	IN int op;
438	IN struct flock *fl;
439	IN int flags;
440};
441
442#
443#% reallocblks	vp	E E E
444#
445vop_reallocblks {
446	IN struct vnode *vp;
447	IN struct cluster_save *buflist;
448};
449
450#
451#% getpages	vp	L L L
452#
453vop_getpages {
454	IN struct vnode *vp;
455	IN vm_page_t *m;
456	IN int count;
457	IN int reqpage;
458	IN vm_ooffset_t offset;
459};
460
461#
462#% putpages	vp	E E E
463#
464vop_putpages {
465	IN struct vnode *vp;
466	IN vm_page_t *m;
467	IN int count;
468	IN int sync;
469	IN int *rtvals;
470	IN vm_ooffset_t offset;
471};
472
473#
474#% getacl	vp	L L L
475#
476vop_getacl {
477	IN struct vnode *vp;
478	IN acl_type_t type;
479	OUT struct acl *aclp;
480	IN struct ucred *cred;
481	IN struct thread *td;
482};
483
484#
485#% setacl	vp	E E E
486#
487vop_setacl {
488	IN struct vnode *vp;
489	IN acl_type_t type;
490	IN struct acl *aclp;
491	IN struct ucred *cred;
492	IN struct thread *td;
493};
494
495#
496#% aclcheck	vp	= = =
497#
498vop_aclcheck {
499	IN struct vnode *vp;
500	IN acl_type_t type;
501	IN struct acl *aclp;
502	IN struct ucred *cred;
503	IN struct thread *td;
504};
505
506#
507#% closeextattr	vp	L L L
508#
509vop_closeextattr {
510	IN struct vnode *vp;
511	IN int commit;
512	IN struct ucred *cred;
513	IN struct thread *td;
514};
515
516#
517#% getextattr	vp	L L L
518#
519vop_getextattr {
520	IN struct vnode *vp;
521	IN int attrnamespace;
522	IN const char *name;
523	INOUT struct uio *uio;
524	OUT size_t *size;
525	IN struct ucred *cred;
526	IN struct thread *td;
527};
528
529#
530#% listextattr	vp	L L L
531#
532vop_listextattr {
533	IN struct vnode *vp;
534	IN int attrnamespace;
535	INOUT struct uio *uio;
536	OUT size_t *size;
537	IN struct ucred *cred;
538	IN struct thread *td;
539};
540
541#
542#% openextattr	vp	L L L
543#
544vop_openextattr {
545	IN struct vnode *vp;
546	IN struct ucred *cred;
547	IN struct thread *td;
548};
549
550#
551#% deleteextattr	vp	E E E
552#
553vop_deleteextattr {
554	IN struct vnode *vp;
555	IN int attrnamespace;
556	IN const char *name;
557	IN struct ucred *cred;
558	IN struct thread *td;
559};
560
561#
562#% setextattr	vp	E E E
563#
564vop_setextattr {
565	IN struct vnode *vp;
566	IN int attrnamespace;
567	IN const char *name;
568	INOUT struct uio *uio;
569	IN struct ucred *cred;
570	IN struct thread *td;
571};
572
573#
574#% setlabel	vp	E E E
575#
576vop_setlabel {
577	IN struct vnode *vp;
578	IN struct label *label;
579	IN struct ucred *cred;
580	IN struct thread *td;
581};
582