vnode_if.src revision 65770
1130803Smarcel#
2130803Smarcel# Copyright (c) 1992, 1993
3130803Smarcel#	The Regents of the University of California.  All rights reserved.
4130803Smarcel#
5130803Smarcel# Redistribution and use in source and binary forms, with or without
6130803Smarcel# modification, are permitted provided that the following conditions
7130803Smarcel# are met:
8130803Smarcel# 1. Redistributions of source code must retain the above copyright
9130803Smarcel#    notice, this list of conditions and the following disclaimer.
10130803Smarcel# 2. Redistributions in binary form must reproduce the above copyright
11130803Smarcel#    notice, this list of conditions and the following disclaimer in the
12130803Smarcel#    documentation and/or other materials provided with the distribution.
13130803Smarcel# 3. All advertising materials mentioning features or use of this software
14130803Smarcel#    must display the following acknowledgement:
15130803Smarcel#	This product includes software developed by the University of
16130803Smarcel#	California, Berkeley and its contributors.
17130803Smarcel# 4. Neither the name of the University nor the names of its contributors
18130803Smarcel#    may be used to endorse or promote products derived from this software
19130803Smarcel#    without specific prior written permission.
20130803Smarcel#
21130803Smarcel# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22130803Smarcel# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23130803Smarcel# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24130803Smarcel# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25130803Smarcel# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26130803Smarcel# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27130803Smarcel# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28130803Smarcel# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29130803Smarcel# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30130803Smarcel# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31130803Smarcel# SUCH DAMAGE.
32130803Smarcel#
33130803Smarcel#	@(#)vnode_if.src	8.12 (Berkeley) 5/14/95
34130803Smarcel# $FreeBSD: head/sys/kern/vnode_if.src 65770 2000-09-12 09:49:08Z bp $
35130803Smarcel#
36130803Smarcel
37130803Smarcel#
38130803Smarcel# Above each of the vop descriptors is a specification of the locking
39130803Smarcel# protocol used by each vop call.  The first column is the name of
40130803Smarcel# the variable, the remaining three columns are in, out and error
41130803Smarcel# respectively.  The "in" column defines the lock state on input,
42130803Smarcel# the "out" column defines the state on succesful return, and the
43130803Smarcel# "error" column defines the locking state on error exit.
44130803Smarcel#
45130803Smarcel# The locking value can take the following values:
46130803Smarcel# L: locked; not converted to type of lock.
47130803Smarcel# A: any lock type.
48130803Smarcel# S: locked with shared lock.
49130803Smarcel# E: locked with exclusive lock for this process.
50130803Smarcel# O: locked with exclusive lock for other process.
51130803Smarcel# U: unlocked.
52130803Smarcel# -: not applicable.  vnode does not yet (or no longer) exists.
53130803Smarcel# =: the same on input and output, may be either L or U.
54130803Smarcel# X: locked if not nil.
55130803Smarcel#
56130803Smarcel
57130803Smarcel#
58130803Smarcel#% islocked	vp	= = =
59130803Smarcel#
60130803Smarcelvop_islocked {
61130803Smarcel	IN struct vnode *vp;
62130803Smarcel	IN struct proc *p;
63130803Smarcel};
64130803Smarcel
65130803Smarcel#
66130803Smarcel#% lookup	dvp	L ? ?
67130803Smarcel#% lookup	vpp	- L -
68130803Smarcel#
69130803Smarcel# XXX - the lookup locking protocol defies simple description and depends
70130803Smarcel#	on the flags and operation fields in the (cnp) structure.  Note
71130803Smarcel#	especially that *vpp may equal dvp and both may be locked.
72130803Smarcel#
73130803Smarcelvop_lookup {
74130803Smarcel	IN struct vnode *dvp;
75130803Smarcel	INOUT struct vnode **vpp;
76130803Smarcel	IN struct componentname *cnp;
77130803Smarcel};
78130803Smarcel
79130803Smarcel#
80130803Smarcel#% cachedlookup	dvp	L ? ?
81130803Smarcel#% cachedlookup	vpp	- L -
82130803Smarcel#
83130803Smarcel# This must be an exact copy of lookup.  See kern/vfs_cache.c for details.
84130803Smarcel#
85130803Smarcelvop_cachedlookup {
86130803Smarcel	IN struct vnode *dvp;
87130803Smarcel	INOUT struct vnode **vpp;
88130803Smarcel	IN struct componentname *cnp;
89130803Smarcel};
90130803Smarcel
91130803Smarcel#
92130803Smarcel#% create	dvp	L L L
93130803Smarcel#% create	vpp	- L -
94130803Smarcel#
95130803Smarcelvop_create {
96130803Smarcel	IN struct vnode *dvp;
97130803Smarcel	OUT struct vnode **vpp;
98130803Smarcel	IN struct componentname *cnp;
99130803Smarcel	IN struct vattr *vap;
100130803Smarcel};
101130803Smarcel
102130803Smarcel#
103130803Smarcel#% whiteout	dvp	L L L
104130803Smarcel#
105130803Smarcelvop_whiteout {
106130803Smarcel	IN struct vnode *dvp;
107130803Smarcel	IN struct componentname *cnp;
108130803Smarcel	IN int flags;
109130803Smarcel};
110130803Smarcel
111130803Smarcel#
112130803Smarcel#% mknod	dvp	L L L
113130803Smarcel#% mknod	vpp	- X -
114130803Smarcel#
115130803Smarcelvop_mknod {
116130803Smarcel	IN struct vnode *dvp;
117130803Smarcel	OUT struct vnode **vpp;
118130803Smarcel	IN struct componentname *cnp;
119130803Smarcel	IN struct vattr *vap;
120130803Smarcel};
121130803Smarcel
122130803Smarcel#
123130803Smarcel#% open		vp	L L L
124130803Smarcel#
125130803Smarcelvop_open {
126130803Smarcel	IN struct vnode *vp;
127130803Smarcel	IN int mode;
128130803Smarcel	IN struct ucred *cred;
129130803Smarcel	IN struct proc *p;
130130803Smarcel};
131130803Smarcel
132130803Smarcel#
133130803Smarcel#% close	vp	U U U
134130803Smarcel#
135130803Smarcelvop_close {
136130803Smarcel	IN struct vnode *vp;
137130803Smarcel	IN int fflag;
138130803Smarcel	IN struct ucred *cred;
139130803Smarcel	IN struct proc *p;
140130803Smarcel};
141130803Smarcel
142130803Smarcel#
143130803Smarcel#% access	vp	L L L
144130803Smarcel#
145130803Smarcelvop_access {
146130803Smarcel	IN struct vnode *vp;
147130803Smarcel	IN int mode;
148130803Smarcel	IN struct ucred *cred;
149130803Smarcel	IN struct proc *p;
150130803Smarcel};
151130803Smarcel
152130803Smarcel#
153130803Smarcel#% getattr	vp	= = =
154130803Smarcel#
155130803Smarcelvop_getattr {
156130803Smarcel	IN struct vnode *vp;
157130803Smarcel	OUT struct vattr *vap;
158130803Smarcel	IN struct ucred *cred;
159130803Smarcel	IN struct proc *p;
160130803Smarcel};
161130803Smarcel
162130803Smarcel#
163130803Smarcel#% setattr	vp	L L L
164130803Smarcel#
165130803Smarcelvop_setattr {
166130803Smarcel	IN struct vnode *vp;
167130803Smarcel	IN struct vattr *vap;
168130803Smarcel	IN struct ucred *cred;
169130803Smarcel	IN struct proc *p;
170130803Smarcel};
171130803Smarcel
172130803Smarcel#
173130803Smarcel#% read		vp	L L L
174130803Smarcel#
175130803Smarcelvop_read {
176130803Smarcel	IN struct vnode *vp;
177130803Smarcel	INOUT struct uio *uio;
178130803Smarcel	IN int ioflag;
179130803Smarcel	IN struct ucred *cred;
180130803Smarcel};
181130803Smarcel
182130803Smarcel#
183130803Smarcel#% write	vp	L L L
184130803Smarcel#
185130803Smarcelvop_write {
186130803Smarcel	IN struct vnode *vp;
187130803Smarcel	INOUT struct uio *uio;
188130803Smarcel	IN int ioflag;
189130803Smarcel	IN struct ucred *cred;
190130803Smarcel};
191130803Smarcel
192130803Smarcel#
193130803Smarcel#% lease	vp	= = =
194130803Smarcel#
195130803Smarcelvop_lease {
196130803Smarcel	IN struct vnode *vp;
197130803Smarcel	IN struct proc *p;
198130803Smarcel	IN struct ucred *cred;
199130803Smarcel	IN int flag;
200130803Smarcel};
201130803Smarcel
202130803Smarcel#
203130803Smarcel#% ioctl	vp	U U U
204130803Smarcel#
205130803Smarcelvop_ioctl {
206130803Smarcel	IN struct vnode *vp;
207130803Smarcel	IN u_long command;
208130803Smarcel	IN caddr_t data;
209130803Smarcel	IN int fflag;
210130803Smarcel	IN struct ucred *cred;
211130803Smarcel	IN struct proc *p;
212130803Smarcel};
213130803Smarcel
214130803Smarcel#
215130803Smarcel#% poll	vp	U U U
216130803Smarcel#
217130803Smarcelvop_poll {
218130803Smarcel	IN struct vnode *vp;
219130803Smarcel	IN int events;
220130803Smarcel	IN struct ucred *cred;
221130803Smarcel	IN struct proc *p;
222130803Smarcel};
223130803Smarcel
224130803Smarcel#
225130803Smarcel#% revoke	vp	U U U
226130803Smarcel#
227130803Smarcelvop_revoke {
228130803Smarcel	IN struct vnode *vp;
229130803Smarcel	IN int flags;
230130803Smarcel};
231130803Smarcel
232130803Smarcel#
233130803Smarcel# XXX - not used
234130803Smarcel#
235130803Smarcelvop_mmap {
236130803Smarcel	IN struct vnode *vp;
237130803Smarcel	IN int fflags;
238130803Smarcel	IN struct ucred *cred;
239130803Smarcel	IN struct proc *p;
240130803Smarcel};
241130803Smarcel
242130803Smarcel#
243130803Smarcel#% fsync	vp	L L L
244130803Smarcel#
245130803Smarcelvop_fsync {
246130803Smarcel	IN struct vnode *vp;
247130803Smarcel	IN struct ucred *cred;
248130803Smarcel	IN int waitfor;
249130803Smarcel	IN struct proc *p;
250130803Smarcel};
251130803Smarcel
252130803Smarcel#
253130803Smarcel#% remove	dvp	L L L
254130803Smarcel#% remove	vp	L L L
255130803Smarcel#
256130803Smarcelvop_remove {
257130803Smarcel	IN struct vnode *dvp;
258130803Smarcel	IN struct vnode *vp;
259130803Smarcel	IN struct componentname *cnp;
260130803Smarcel};
261130803Smarcel
262130803Smarcel#
263130803Smarcel#% link		tdvp	L L L
264130803Smarcel#% link		vp	U U U
265130803Smarcel#
266130803Smarcelvop_link {
267130803Smarcel	IN struct vnode *tdvp;
268130803Smarcel	IN struct vnode *vp;
269130803Smarcel	IN struct componentname *cnp;
270130803Smarcel};
271130803Smarcel
272130803Smarcel#
273130803Smarcel#% rename	fdvp	U U U
274130803Smarcel#% rename	fvp	U U U
275130803Smarcel#% rename	tdvp	L U U
276130803Smarcel#% rename	tvp	X U U
277130803Smarcel#
278130803Smarcelvop_rename {
279130803Smarcel	IN WILLRELE struct vnode *fdvp;
280130803Smarcel	IN WILLRELE struct vnode *fvp;
281130803Smarcel	IN struct componentname *fcnp;
282130803Smarcel	IN WILLRELE struct vnode *tdvp;
283130803Smarcel	IN WILLRELE struct vnode *tvp;
284130803Smarcel	IN struct componentname *tcnp;
285130803Smarcel};
286130803Smarcel
287130803Smarcel#
288130803Smarcel#% mkdir	dvp	L L L
289130803Smarcel#% mkdir	vpp	- L -
290130803Smarcel#
291130803Smarcelvop_mkdir {
292130803Smarcel	IN struct vnode *dvp;
293130803Smarcel	OUT struct vnode **vpp;
294130803Smarcel	IN struct componentname *cnp;
295130803Smarcel	IN struct vattr *vap;
296130803Smarcel};
297130803Smarcel
298130803Smarcel#
299130803Smarcel#% rmdir	dvp	L L L
300130803Smarcel#% rmdir	vp	L L L
301130803Smarcel#
302130803Smarcelvop_rmdir {
303130803Smarcel	IN struct vnode *dvp;
304130803Smarcel	IN struct vnode *vp;
305130803Smarcel	IN struct componentname *cnp;
306130803Smarcel};
307130803Smarcel
308130803Smarcel#
309130803Smarcel#% symlink	dvp	L L L
310130803Smarcel#% symlink	vpp	- U -
311130803Smarcel#
312130803Smarcelvop_symlink {
313130803Smarcel	IN struct vnode *dvp;
314130803Smarcel	OUT struct vnode **vpp;
315130803Smarcel	IN struct componentname *cnp;
316130803Smarcel	IN struct vattr *vap;
317130803Smarcel	IN char *target;
318130803Smarcel};
319130803Smarcel
320130803Smarcel#
321130803Smarcel#% readdir	vp	L L L
322130803Smarcel#
323130803Smarcelvop_readdir {
324130803Smarcel	IN struct vnode *vp;
325130803Smarcel	INOUT struct uio *uio;
326130803Smarcel	IN struct ucred *cred;
327130803Smarcel	INOUT int *eofflag;
328130803Smarcel	OUT int *ncookies;
329130803Smarcel	INOUT u_long **cookies;
330130803Smarcel};
331130803Smarcel
332130803Smarcel#
333130803Smarcel#% readlink	vp	L L L
334130803Smarcel#
335130803Smarcelvop_readlink {
336130803Smarcel	IN struct vnode *vp;
337130803Smarcel	INOUT struct uio *uio;
338130803Smarcel	IN struct ucred *cred;
339130803Smarcel};
340130803Smarcel
341130803Smarcel#
342130803Smarcel#% inactive	vp	L U U
343130803Smarcel#
344130803Smarcelvop_inactive {
345130803Smarcel	IN struct vnode *vp;
346130803Smarcel	IN struct proc *p;
347130803Smarcel};
348130803Smarcel
349130803Smarcel#
350130803Smarcel#% reclaim	vp	U U U
351130803Smarcel#
352130803Smarcelvop_reclaim {
353130803Smarcel	IN struct vnode *vp;
354130803Smarcel	IN struct proc *p;
355130803Smarcel};
356130803Smarcel
357130803Smarcel#
358130803Smarcel#% lock		vp	? ? ?
359130803Smarcel#
360130803Smarcelvop_lock {
361130803Smarcel	IN struct vnode *vp;
362130803Smarcel	IN int flags;
363130803Smarcel	IN struct proc *p;
364130803Smarcel};
365130803Smarcel
366130803Smarcel#
367130803Smarcel#% unlock	vp	L U L
368130803Smarcel#
369130803Smarcelvop_unlock {
370130803Smarcel	IN struct vnode *vp;
371130803Smarcel	IN int flags;
372130803Smarcel	IN struct proc *p;
373130803Smarcel};
374130803Smarcel
375130803Smarcel#
376130803Smarcel#% bmap		vp	L L L
377130803Smarcel#% bmap		vpp	- U -
378130803Smarcel#
379130803Smarcelvop_bmap {
380130803Smarcel	IN struct vnode *vp;
381130803Smarcel	IN daddr_t bn;
382130803Smarcel	OUT struct vnode **vpp;
383130803Smarcel	IN daddr_t *bnp;
384130803Smarcel	OUT int *runp;
385130803Smarcel	OUT int *runb;
386130803Smarcel};
387130803Smarcel
388130803Smarcel#
389130803Smarcel#% strategy	vp	L L L
390130803Smarcel#
391130803Smarcelvop_strategy {
392130803Smarcel	IN struct vnode *vp;
393130803Smarcel	IN struct buf *bp;
394130803Smarcel};
395130803Smarcel
396130803Smarcel#
397130803Smarcel#% getwritemount vp	= = =
398130803Smarcel#
399130803Smarcelvop_getwritemount {
400130803Smarcel	IN struct vnode *vp;
401130803Smarcel	OUT struct mount **mpp;
402130803Smarcel};
403130803Smarcel
404130803Smarcel#
405130803Smarcel#% copyonwrite  vp	L L L
406130803Smarcel#
407130803Smarcelvop_copyonwrite {
408130803Smarcel	IN struct vnode *vp;
409130803Smarcel	IN struct buf *bp;
410130803Smarcel};
411130803Smarcel
412130803Smarcel#
413130803Smarcel#% print	vp	= = =
414130803Smarcel#
415130803Smarcelvop_print {
416130803Smarcel	IN struct vnode *vp;
417130803Smarcel};
418130803Smarcel
419130803Smarcel#
420130803Smarcel#% pathconf	vp	L L L
421130803Smarcel#
422130803Smarcelvop_pathconf {
423130803Smarcel	IN struct vnode *vp;
424130803Smarcel	IN int name;
425130803Smarcel	OUT register_t *retval;
426130803Smarcel};
427130803Smarcel
428130803Smarcel#
429130803Smarcel#% advlock	vp	U U U
430130803Smarcel#
431130803Smarcelvop_advlock {
432130803Smarcel	IN struct vnode *vp;
433130803Smarcel	IN caddr_t id;
434130803Smarcel	IN int op;
435130803Smarcel	IN struct flock *fl;
436130803Smarcel	IN int flags;
437130803Smarcel};
438130803Smarcel
439130803Smarcel#
440130803Smarcel#% balloc	vp	L L L
441130803Smarcel#
442130803Smarcelvop_balloc {
443130803Smarcel	IN struct vnode *vp;
444130803Smarcel	IN off_t startoffset;
445130803Smarcel	IN int size;
446130803Smarcel	IN struct ucred *cred;
447130803Smarcel	IN int flags;
448130803Smarcel	OUT struct buf **bpp;
449130803Smarcel};
450130803Smarcel
451130803Smarcel#
452130803Smarcel#% reallocblks	vp	L L L
453130803Smarcel#
454130803Smarcelvop_reallocblks {
455130803Smarcel	IN struct vnode *vp;
456130803Smarcel	IN struct cluster_save *buflist;
457130803Smarcel};
458130803Smarcel
459130803Smarcel#
460130803Smarcel#% getpages	vp	L L L
461130803Smarcel#
462130803Smarcelvop_getpages {
463130803Smarcel	IN struct vnode *vp;
464130803Smarcel	IN vm_page_t *m;
465130803Smarcel	IN int count;
466130803Smarcel	IN int reqpage;
467130803Smarcel	IN vm_ooffset_t offset;
468130803Smarcel};
469130803Smarcel
470130803Smarcel#
471130803Smarcel#% putpages	vp	L L L
472130803Smarcel#
473130803Smarcelvop_putpages {
474130803Smarcel	IN struct vnode *vp;
475130803Smarcel	IN vm_page_t *m;
476130803Smarcel	IN int count;
477130803Smarcel	IN int sync;
478130803Smarcel	IN int *rtvals;
479130803Smarcel	IN vm_ooffset_t offset;
480130803Smarcel};
481130803Smarcel
482130803Smarcel#
483130803Smarcel#% freeblks	vp	- - -
484130803Smarcel#
485130803Smarcel# This call is used by the filesystem to release blocks back to 
486130803Smarcel# device-driver.  This is useful if the driver has a lengthy 
487130803Smarcel# erase handling or similar.
488130803Smarcel#
489130803Smarcel
490130803Smarcelvop_freeblks {
491130803Smarcel	IN struct vnode *vp;
492130803Smarcel	IN daddr_t addr;
493130803Smarcel	IN daddr_t length;
494130803Smarcel};
495130803Smarcel
496130803Smarcel#
497130803Smarcel#% bwrite	vp	L L L
498130803Smarcel#
499130803Smarcelvop_bwrite {
500130803Smarcel	IN struct vnode *vp;
501130803Smarcel	IN struct buf *bp;
502130803Smarcel};
503130803Smarcel
504130803Smarcel#
505130803Smarcel#% getacl	vp	= = =
506130803Smarcel#
507130803Smarcelvop_getacl {
508130803Smarcel	IN struct vnode *vp;
509130803Smarcel	IN acl_type_t type;
510130803Smarcel	OUT struct acl *aclp;
511130803Smarcel	IN struct ucred *cred;
512130803Smarcel	IN struct proc *p;
513130803Smarcel};
514130803Smarcel
515130803Smarcel#
516130803Smarcel#% setacl	vp	L L L
517130803Smarcel#
518130803Smarcelvop_setacl {
519130803Smarcel	IN struct vnode *vp;
520130803Smarcel	IN acl_type_t type;
521130803Smarcel	IN struct acl *aclp;
522130803Smarcel	IN struct ucred *cred;
523130803Smarcel	IN struct proc *p;
524130803Smarcel};
525130803Smarcel
526130803Smarcel#
527130803Smarcel#% aclcheck	vp	= = =
528130803Smarcel#
529130803Smarcelvop_aclcheck {
530130803Smarcel	IN struct vnode *vp;
531130803Smarcel	IN acl_type_t type;
532130803Smarcel	IN struct acl *aclp;
533130803Smarcel	IN struct ucred *cred;
534130803Smarcel	IN struct proc *p;
535130803Smarcel};
536130803Smarcel
537130803Smarcel#
538130803Smarcel#% getextattr	vp	L L L
539130803Smarcel#
540130803Smarcelvop_getextattr {
541130803Smarcel	IN struct vnode *vp;
542130803Smarcel	IN const char *name;
543130803Smarcel	INOUT struct uio *uio;
544130803Smarcel	IN struct ucred *cred;
545130803Smarcel	IN struct proc *p;
546130803Smarcel};
547130803Smarcel
548130803Smarcel#
549130803Smarcel#% setextattr	vp	L L L
550130803Smarcel#
551130803Smarcelvop_setextattr {
552130803Smarcel	IN struct vnode *vp;
553130803Smarcel	IN const char *name;
554130803Smarcel	INOUT struct uio *uio;
555130803Smarcel	IN struct ucred *cred;
556130803Smarcel	IN struct proc *p;
557130803Smarcel};
558130803Smarcel
559130803Smarcel#
560130803Smarcel#% createvobject	vp	L L L
561130803Smarcel#
562130803Smarcelvop_createvobject {
563130803Smarcel	IN struct vnode *vp;
564130803Smarcel	IN struct ucred *cred;
565130803Smarcel	IN struct proc *p;
566130803Smarcel};
567130803Smarcel
568130803Smarcel#
569130803Smarcel#% destroyvobject	vp	L L L
570130803Smarcel#
571130803Smarcelvop_destroyvobject {
572130803Smarcel	IN struct vnode *vp;
573130803Smarcel};
574130803Smarcel
575130803Smarcel#
576130803Smarcel#% getvobject	vp	L L L
577130803Smarcel#
578130803Smarcelvop_getvobject {
579130803Smarcel	IN struct vnode *vp;
580130803Smarcel	OUT struct vm_object **objpp;
581130803Smarcel};
582130803Smarcel