xref: /netbsd-src/sys/kern/vnode_if.src (revision d48f14661dda8638fee055ba15d35bdfb29b9fa8)
1#	$NetBSD: vnode_if.src,v 1.50 2006/05/14 21:15:12 elad Exp $
2#
3# Copyright (c) 1992, 1993
4#	The Regents of the University of California.  All rights reserved.
5#
6# Redistribution and use in source and binary forms, with or without
7# modification, are permitted provided that the following conditions
8# are met:
9# 1. Redistributions of source code must retain the above copyright
10#    notice, this list of conditions and the following disclaimer.
11# 2. Redistributions in binary form must reproduce the above copyright
12#    notice, this list of conditions and the following disclaimer in the
13#    documentation and/or other materials provided with the distribution.
14# 3. All advertising materials mentioning features or use of this software
15#    must display the following acknowledgement:
16#	This product includes software developed by the University of
17#	California, Berkeley and its contributors.
18# 4. Neither the name of the University nor the names of its contributors
19#    may be used to endorse or promote products derived from this software
20#    without specific prior written permission.
21#
22# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32# SUCH DAMAGE.
33#
34#	@(#)vnode_if.src	8.14 (Berkeley) 8/6/95
35#
36#
37
38#
39# Above each of the vop descriptors is a specification of the locking
40# protocol used by each vop call.  The first column is the name of
41# the variable, the remaining three columns are in, out and error
42# respectively.  The "in" column defines the lock state on input,
43# the "out" column defines the state on successful return, and the
44# "error" column defines the locking state on error exit.
45#
46# The locking value can take the following values:
47# L: locked.
48# U: unlocked.
49# -: not applicable.  vnode does not yet (or no longer) exists.
50# =: the same on input and output, may be either L or U.
51# X: locked if not nil.
52#
53# For operations other than VOP_LOOKUP which require a component name
54# parameter, the flags required for the initial namei() call are listed.
55# Additional flags may be added to the namei() call, but these are required.
56#
57
58#
59#% lookup     dvp     L ? ?
60#% lookup     vpp     - L -
61#
62# XXX - the lookup locking protocol defies simple description and depends
63#     on the flags and operation fields in the (cnp) structure.  Note
64#     especially that *vpp may equal dvp and both may be locked.
65#
66#    More details:
67#     There are three types of lookups: ".", ".." (ISDOTDOT), and other.
68#     On successful lookup of ".", a reference is added to dvp, and it
69#          is returned in *vpp.
70#     To look up ISDOTDOT, dvp is unlocked, the ".." node is locked, and
71#          then dvp is relocked iff LOCKPARENT is set and this is the last
72#          component name (ISLASTCN set). This preserves the
73#          protocol of always locking nodes from root ("/") downward and
74#          prevents deadlock.
75#     Other lookups find the named node (creating the vnode if needed) and
76#          return it, locked, in *vpp.
77#     For non-"." lookups, if LOCKPARENT is not set or this was not the
78#          last component name, dvp is returned unlocked on a successful
79#          lookup.
80#     On failure, *vpp is NULL, and *dvp is left locked. If there was
81#          an error re-locking dvp (for instance in the ISDOTDOT case),
82#          the error is returned with PDIRUNLOCK set.
83#
84#     *vpp is always locked on return if the operation succeeds.
85#     typically, if *vpp == dvp, you need to release twice, but unlock once.
86#
87#     The PDIRUNLOCK flag is set when dvp is unlocked in the lookup routine.
88#          It signals the caller that dvp's lock state changed. It will
89#          be set on exit if either a successful lookup unlocked the
90#          parrent, or there was an error re-locking dvp in the ISDOTDOT case.
91#
92#     See sys/sys/namei.h for a description of the SAVENAME and SAVESTART
93#          flags.
94#
95vop_lookup {
96	IN struct vnode *dvp;
97	INOUT struct vnode **vpp;
98	IN struct componentname *cnp;
99};
100
101#
102#% create     dvp     L U U
103#% create     vpp     - L -
104#
105#! create cnp	CREATE, LOCKPARENT
106#
107vop_create {
108	IN LOCKED=YES WILLPUT struct vnode *dvp;
109	OUT struct vnode **vpp;
110	IN struct componentname *cnp;
111	IN struct vattr *vap;
112};
113
114#
115#% mknod      dvp     L U U
116#% mknod      vpp     - L -
117#
118#! mknod cnp	CREATE, LOCKPARENT
119#
120vop_mknod {
121	IN LOCKED=YES WILLPUT struct vnode *dvp;
122	OUT struct vnode **vpp;
123	IN struct componentname *cnp;
124	IN struct vattr *vap;
125};
126
127#
128#% open               vp      L L L
129#
130vop_open {
131	IN LOCKED=YES struct vnode *vp;
132	IN int mode;
133	IN kauth_cred_t cred;
134	IN struct lwp *l;
135};
136
137#
138#% close      vp      L L L
139#
140vop_close {
141	IN LOCKED=YES struct vnode *vp;
142	IN int fflag;
143	IN kauth_cred_t cred;
144	IN struct lwp *l;
145};
146
147#
148#% access     vp      L L L
149#
150vop_access {
151	IN LOCKED=YES struct vnode *vp;
152	IN int mode;
153	IN kauth_cred_t cred;
154	IN struct lwp *l;
155};
156
157#
158#% getattr    vp      = = =
159#
160vop_getattr {
161	IN struct vnode *vp;
162	IN struct vattr *vap;
163	IN kauth_cred_t cred;
164	IN struct lwp *l;
165};
166
167#
168#% setattr    vp      L L L
169#
170vop_setattr {
171	IN LOCKED=YES struct vnode *vp;
172	IN struct vattr *vap;
173	IN kauth_cred_t cred;
174	IN struct lwp *l;
175};
176
177#
178#% read               vp      L L L
179#
180vop_read {
181	IN LOCKED=YES struct vnode *vp;
182	INOUT struct uio *uio;
183	IN int ioflag;
184	IN kauth_cred_t cred;
185};
186
187#
188#% write      vp      L L L
189#
190vop_write {
191	IN LOCKED=YES struct vnode *vp;
192	INOUT struct uio *uio;
193	IN int ioflag;
194	IN kauth_cred_t cred;
195};
196
197#
198#% ioctl      vp      U U U
199#
200vop_ioctl {
201	IN LOCKED=NO struct vnode *vp;
202	IN u_long command;
203	IN void *data;
204	IN int fflag;
205	IN kauth_cred_t cred;
206	IN struct lwp *l;
207};
208
209#
210#% fcntl      vp      U U U
211#
212vop_fcntl {
213	IN LOCKED=NO struct vnode *vp;
214	IN u_int command;
215	IN void *data;
216	IN int fflag;
217	IN kauth_cred_t cred;
218	IN struct lwp *l;
219};
220
221#
222#% poll     vp      U U U
223#
224vop_poll {
225	IN LOCKED=NO struct vnode *vp;
226	IN int events;
227	IN struct lwp *l;
228};
229
230#
231#% kqfilter     vp      U U U
232#
233vop_kqfilter {
234	IN LOCKED=NO struct vnode *vp;
235	IN struct knote *kn;
236};
237
238#
239#% revoke     vp      U U U
240#
241vop_revoke {
242	IN LOCKED=NO struct vnode *vp;
243	IN int flags;
244};
245
246#
247#% mmap      vp      = = =
248#
249vop_mmap {
250	IN struct vnode *vp;
251	IN int fflags;
252	IN kauth_cred_t cred;
253	IN struct lwp *l;
254};
255
256#
257#% fsync      vp      L L L
258#
259vop_fsync {
260	IN LOCKED=YES struct vnode *vp;
261	IN kauth_cred_t cred;
262	IN int flags;
263	IN off_t offlo;
264	IN off_t offhi;
265	IN struct lwp *l;
266};
267
268#
269# Needs work: Is newoff right?  What's it mean?
270# XXX Locking protocol?
271#
272vop_seek {
273	IN struct vnode *vp;
274	IN off_t oldoff;
275	IN off_t newoff;
276	IN kauth_cred_t cred;
277};
278
279#
280#% remove     dvp     L U U
281#% remove     vp      L U U
282#
283#! remove cnp	DELETE, LOCKPARENT | LOCKLEAF
284#
285vop_remove {
286	IN LOCKED=YES WILLPUT struct vnode *dvp;
287	IN LOCKED=YES WILLPUT struct vnode *vp;
288	IN struct componentname *cnp;
289};
290
291#
292#% link               vp      U U U
293#% link               dvp     L U U
294#
295#! link	 cnp	CREATE, LOCKPARENT
296#
297vop_link {
298	IN LOCKED=YES WILLPUT struct vnode *dvp;
299	IN LOCKED=NO struct vnode *vp;
300	IN struct componentname *cnp;
301};
302
303#
304#% rename     fdvp    U U U
305#% rename     fvp     U U U
306#% rename     tdvp    L U U
307#% rename     tvp     X U U
308#
309#! rename fcnp	DELETE,	WANTPARENT | SAVESTART
310#! rename tcnp	RENAME, LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART
311#
312# XXX the vop_rename routines should REALLY NOT be depending on SAVESTART!
313#
314vop_rename {
315	IN LOCKED=NO WILLRELE struct vnode *fdvp;
316	IN LOCKED=NO WILLRELE struct vnode *fvp;
317	IN struct componentname *fcnp;
318	IN LOCKED=YES WILLPUT struct vnode *tdvp;
319	IN WILLPUT struct vnode *tvp;
320	IN struct componentname *tcnp;
321};
322
323#
324#% mkdir      dvp     L U U
325#% mkdir      vpp     - L -
326#
327#! mkdir cnp	CREATE, LOCKPARENT
328#
329vop_mkdir {
330	IN LOCKED=YES WILLPUT struct vnode *dvp;
331	OUT struct vnode **vpp;
332	IN struct componentname *cnp;
333	IN struct vattr *vap;
334};
335
336#
337#% rmdir      dvp     L U U
338#% rmdir      vp      L U U
339#
340#! rmdir cnp	DELETE, LOCKPARENT | LOCKLEAF
341#
342vop_rmdir {
343	IN LOCKED=YES WILLPUT struct vnode *dvp;
344	IN LOCKED=YES WILLPUT struct vnode *vp;
345	IN struct componentname *cnp;
346};
347
348#
349#% symlink    dvp     L U U
350#% symlink    vpp     - L -
351#
352#! symlink cnp	CREATE, LOCKPARENT
353#
354vop_symlink {
355	IN LOCKED=YES WILLPUT struct vnode *dvp;
356	OUT struct vnode **vpp;
357	IN struct componentname *cnp;
358	IN struct vattr *vap;
359	IN char *target;
360};
361
362#
363#% readdir    vp      L L L
364#
365vop_readdir {
366	IN LOCKED=YES struct vnode *vp;
367	INOUT struct uio *uio;
368	IN kauth_cred_t cred;
369	OUT int *eofflag;
370	OUT off_t **cookies;
371	IN int *ncookies;
372};
373
374#
375#% readlink   vp      L L L
376#
377vop_readlink {
378	IN LOCKED=YES struct vnode *vp;
379	INOUT struct uio *uio;
380	IN kauth_cred_t cred;
381};
382
383#
384#% abortop    dvp     = = =
385#
386#! abortop cnp	as appropriate.
387#
388vop_abortop {
389	IN struct vnode *dvp;
390	IN struct componentname *cnp;
391};
392
393#
394#% inactive   vp      L U U
395#
396vop_inactive {
397	IN LOCKED=YES WILLUNLOCK struct vnode *vp;
398	IN struct lwp *l;
399};
400
401#
402#% reclaim    vp      U U U
403#
404vop_reclaim {
405	IN LOCKED=NO struct vnode *vp;
406	IN struct lwp *l;
407};
408
409#
410#% lock               vp      U L U
411#
412vop_lock {
413	IN LOCKED=NO struct vnode *vp;
414	IN int flags;
415};
416
417#
418#% unlock     vp      L U L
419#
420vop_unlock {
421	IN LOCKED=YES struct vnode *vp;
422	IN int flags;
423};
424
425#
426#% bmap               vp      = = =
427#% bmap               vpp     - U -
428#
429vop_bmap {
430	IN struct vnode *vp;
431	IN daddr_t bn;
432	OUT struct vnode **vpp;
433	IN daddr_t *bnp;
434	OUT int *runp;
435};
436
437#
438#% strategy   vp      = = =
439#
440vop_strategy {
441	IN struct vnode *vp;
442	IN struct buf *bp;
443};
444
445#
446#% print      vp      = = =
447#
448vop_print {
449	IN struct vnode *vp;
450};
451
452#
453#% islocked   vp      = = =
454#
455vop_islocked {
456	IN struct vnode *vp;
457};
458
459#
460#% pathconf   vp      L L L
461#
462vop_pathconf {
463	IN LOCKED=YES struct vnode *vp;
464	IN int name;
465	OUT register_t *retval;
466};
467
468#
469#% advlock    vp      U U U
470#
471vop_advlock {
472	IN LOCKED=NO struct vnode *vp;
473	IN void *id;
474	IN int op;
475	IN struct flock *fl;
476	IN int flags;
477};
478
479#
480#% lease      vp      = = =
481#
482vop_lease {
483	IN struct vnode *vp;
484	IN struct lwp *l;
485	IN kauth_cred_t cred;
486	IN int flag;
487};
488
489#
490#% whiteout   dvp     L L L
491#% whiteout   cnp     - - -
492#% whiteout   flag    - - -
493#
494#! whiteout cnp	CREATE, LOCKPARENT
495#
496vop_whiteout {
497	IN LOCKED=YES struct vnode *dvp;
498	IN struct componentname *cnp;
499	IN int flags;
500};
501
502#
503# Needs work: no vp?
504#
505#vop_bwrite {
506#	IN struct buf *bp;
507#};
508
509#
510#% getpages	vp = = =
511#
512vop_getpages {
513	IN struct vnode *vp;
514	IN voff_t offset;
515	IN struct vm_page **m;
516	IN int *count;
517	IN int centeridx;
518	IN vm_prot_t access_type;
519	IN int advice;
520	IN int flags;
521};
522
523#
524#% putpages	vp = = =
525#
526vop_putpages {
527	IN struct vnode *vp;
528	IN voff_t offlo;
529	IN voff_t offhi;
530	IN int flags;
531};
532
533#
534#% closeextattr	vp L L L
535#
536vop_closeextattr {
537	IN LOCKED=YES struct vnode *vp;
538	IN int commit;
539	IN kauth_cred_t cred;
540	IN struct lwp *l;
541};
542
543#
544#% getextattr	vp L L L
545#
546vop_getextattr {
547	IN LOCKED=YES struct vnode *vp;
548	IN int attrnamespace;
549	IN const char *name;
550	INOUT struct uio *uio;
551	OUT size_t *size;
552	IN kauth_cred_t cred;
553	IN struct lwp *l;
554};
555
556#
557#% listextattr	vp L L L
558#
559vop_listextattr {
560	IN LOCKED=YES struct vnode *vp;
561	IN int attrnamespace;
562	INOUT struct uio *uio;
563	OUT size_t *size;
564	IN kauth_cred_t cred;
565	IN struct lwp *l;
566};
567
568#
569#% openextattr	vp L L L
570#
571vop_openextattr {
572	IN LOCKED=YES struct vnode *vp;
573	IN kauth_cred_t cred;
574	IN struct lwp *l;
575};
576
577#
578#% deleteextattr vp L L L
579#
580vop_deleteextattr {
581	IN LOCKED=YES struct vnode *vp;
582	IN int attrnamespace;
583	IN const char *name;
584	IN kauth_cred_t cred;
585	IN struct lwp *l;
586};
587
588#
589#% setextattr	vp L L L
590#
591vop_setextattr {
592	IN LOCKED=YES struct vnode *vp;
593	IN int attrnamespace;
594	IN const char *name;
595	INOUT struct uio *uio;
596	IN kauth_cred_t cred;
597	IN struct lwp *l;
598};
599