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