FreeBSD/Linux Kernel Cross Reference
sys/kern/vnode_if.src
1 # $NetBSD: vnode_if.src,v 1.50.12.1 2007/02/17 23:27:48 tron 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 L L
60 #% lookup vpp - L -
61 #
62 # XXX - the lookup locking protocol defies simple description.
63 # Note especially that *vpp may equal dvp.
64 #
65 # More details:
66 # There are three types of lookups: ".", ".." (ISDOTDOT), and other.
67 # On successful lookup of ".", a reference is added to dvp, and it
68 # is returned in *vpp.
69 # To look up ISDOTDOT, dvp is unlocked, the ".." node is locked, and
70 # then dvp is relocked. This preserves the protocol of always
71 # locking nodes from root ("/") downward and prevents deadlock.
72 # Other lookups find the named node (creating the vnode if needed) and
73 # return it, locked, in *vpp.
74 # On failure, *vpp is NULL, and *dvp is left locked.
75 #
76 # *vpp is always locked on return if the operation succeeds.
77 # Typically, if *vpp == dvp, you need to release twice, but
78 # unlock only once.
79 #
80 # See sys/sys/namei.h for a description of the SAVENAME and SAVESTART
81 # flags.
82 #
83 vop_lookup {
84 IN struct vnode *dvp;
85 INOUT struct vnode **vpp;
86 IN struct componentname *cnp;
87 };
88
89 #
90 #% create dvp L U U
91 #% create vpp - L -
92 #
93 #! create cnp CREATE, LOCKPARENT
94 #
95 vop_create {
96 IN LOCKED=YES WILLPUT struct vnode *dvp;
97 OUT struct vnode **vpp;
98 IN struct componentname *cnp;
99 IN struct vattr *vap;
100 };
101
102 #
103 #% mknod dvp L U U
104 #% mknod vpp - L -
105 #
106 #! mknod cnp CREATE, LOCKPARENT
107 #
108 vop_mknod {
109 IN LOCKED=YES WILLPUT struct vnode *dvp;
110 OUT struct vnode **vpp;
111 IN struct componentname *cnp;
112 IN struct vattr *vap;
113 };
114
115 #
116 #% open vp L L L
117 #
118 vop_open {
119 IN LOCKED=YES struct vnode *vp;
120 IN int mode;
121 IN kauth_cred_t cred;
122 IN struct lwp *l;
123 };
124
125 #
126 #% close vp L L L
127 #
128 vop_close {
129 IN LOCKED=YES struct vnode *vp;
130 IN int fflag;
131 IN kauth_cred_t cred;
132 IN struct lwp *l;
133 };
134
135 #
136 #% access vp L L L
137 #
138 vop_access {
139 IN LOCKED=YES struct vnode *vp;
140 IN int mode;
141 IN kauth_cred_t cred;
142 IN struct lwp *l;
143 };
144
145 #
146 #% getattr vp = = =
147 #
148 vop_getattr {
149 IN struct vnode *vp;
150 IN struct vattr *vap;
151 IN kauth_cred_t cred;
152 IN struct lwp *l;
153 };
154
155 #
156 #% setattr vp L L L
157 #
158 vop_setattr {
159 IN LOCKED=YES struct vnode *vp;
160 IN struct vattr *vap;
161 IN kauth_cred_t cred;
162 IN struct lwp *l;
163 };
164
165 #
166 #% read vp L L L
167 #
168 vop_read {
169 IN LOCKED=YES struct vnode *vp;
170 INOUT struct uio *uio;
171 IN int ioflag;
172 IN kauth_cred_t cred;
173 };
174
175 #
176 #% write vp L L L
177 #
178 vop_write {
179 IN LOCKED=YES struct vnode *vp;
180 INOUT struct uio *uio;
181 IN int ioflag;
182 IN kauth_cred_t cred;
183 };
184
185 #
186 #% ioctl vp U U U
187 #
188 vop_ioctl {
189 IN LOCKED=NO struct vnode *vp;
190 IN u_long command;
191 IN void *data;
192 IN int fflag;
193 IN kauth_cred_t cred;
194 IN struct lwp *l;
195 };
196
197 #
198 #% fcntl vp U U U
199 #
200 vop_fcntl {
201 IN LOCKED=NO struct vnode *vp;
202 IN u_int command;
203 IN void *data;
204 IN int fflag;
205 IN kauth_cred_t cred;
206 IN struct lwp *l;
207 };
208
209 #
210 #% poll vp U U U
211 #
212 vop_poll {
213 IN LOCKED=NO struct vnode *vp;
214 IN int events;
215 IN struct lwp *l;
216 };
217
218 #
219 #% kqfilter vp U U U
220 #
221 vop_kqfilter {
222 IN LOCKED=NO struct vnode *vp;
223 IN struct knote *kn;
224 };
225
226 #
227 #% revoke vp U U U
228 #
229 vop_revoke {
230 IN LOCKED=NO struct vnode *vp;
231 IN int flags;
232 };
233
234 #
235 #% mmap vp = = =
236 #
237 vop_mmap {
238 IN struct vnode *vp;
239 IN int fflags;
240 IN kauth_cred_t cred;
241 IN struct lwp *l;
242 };
243
244 #
245 #% fsync vp L L L
246 #
247 vop_fsync {
248 IN LOCKED=YES struct vnode *vp;
249 IN kauth_cred_t cred;
250 IN int flags;
251 IN off_t offlo;
252 IN off_t offhi;
253 IN struct lwp *l;
254 };
255
256 #
257 # Needs work: Is newoff right? What's it mean?
258 # XXX Locking protocol?
259 #
260 vop_seek {
261 IN struct vnode *vp;
262 IN off_t oldoff;
263 IN off_t newoff;
264 IN kauth_cred_t cred;
265 };
266
267 #
268 #% remove dvp L U U
269 #% remove vp L U U
270 #
271 #! remove cnp DELETE, LOCKPARENT | LOCKLEAF
272 #
273 vop_remove {
274 IN LOCKED=YES WILLPUT struct vnode *dvp;
275 IN LOCKED=YES WILLPUT struct vnode *vp;
276 IN struct componentname *cnp;
277 };
278
279 #
280 #% link vp U U U
281 #% link dvp L U U
282 #
283 #! link cnp CREATE, LOCKPARENT
284 #
285 vop_link {
286 IN LOCKED=YES WILLPUT struct vnode *dvp;
287 IN LOCKED=NO struct vnode *vp;
288 IN struct componentname *cnp;
289 };
290
291 #
292 #% rename fdvp U U U
293 #% rename fvp U U U
294 #% rename tdvp L U U
295 #% rename tvp X U U
296 #
297 #! rename fcnp DELETE, LOCKPARENT | SAVESTART
298 #! rename tcnp RENAME, LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART
299 #
300 # XXX the vop_rename routines should REALLY NOT be depending on SAVESTART!
301 #
302 vop_rename {
303 IN LOCKED=NO WILLRELE struct vnode *fdvp;
304 IN LOCKED=NO WILLRELE struct vnode *fvp;
305 IN struct componentname *fcnp;
306 IN LOCKED=YES WILLPUT struct vnode *tdvp;
307 IN WILLPUT struct vnode *tvp;
308 IN struct componentname *tcnp;
309 };
310
311 #
312 #% mkdir dvp L U U
313 #% mkdir vpp - L -
314 #
315 #! mkdir cnp CREATE, LOCKPARENT
316 #
317 vop_mkdir {
318 IN LOCKED=YES WILLPUT struct vnode *dvp;
319 OUT struct vnode **vpp;
320 IN struct componentname *cnp;
321 IN struct vattr *vap;
322 };
323
324 #
325 #% rmdir dvp L U U
326 #% rmdir vp L U U
327 #
328 #! rmdir cnp DELETE, LOCKPARENT | LOCKLEAF
329 #
330 vop_rmdir {
331 IN LOCKED=YES WILLPUT struct vnode *dvp;
332 IN LOCKED=YES WILLPUT struct vnode *vp;
333 IN struct componentname *cnp;
334 };
335
336 #
337 #% symlink dvp L U U
338 #% symlink vpp - L -
339 #
340 #! symlink cnp CREATE, LOCKPARENT
341 #
342 vop_symlink {
343 IN LOCKED=YES WILLPUT struct vnode *dvp;
344 OUT struct vnode **vpp;
345 IN struct componentname *cnp;
346 IN struct vattr *vap;
347 IN char *target;
348 };
349
350 #
351 #% readdir vp L L L
352 #
353 vop_readdir {
354 IN LOCKED=YES struct vnode *vp;
355 INOUT struct uio *uio;
356 IN kauth_cred_t cred;
357 OUT int *eofflag;
358 OUT off_t **cookies;
359 IN int *ncookies;
360 };
361
362 #
363 #% readlink vp L L L
364 #
365 vop_readlink {
366 IN LOCKED=YES struct vnode *vp;
367 INOUT struct uio *uio;
368 IN kauth_cred_t cred;
369 };
370
371 #
372 #% abortop dvp = = =
373 #
374 #! abortop cnp as appropriate.
375 #
376 vop_abortop {
377 IN struct vnode *dvp;
378 IN struct componentname *cnp;
379 };
380
381 #
382 #% inactive vp L U U
383 #
384 vop_inactive {
385 IN LOCKED=YES WILLUNLOCK struct vnode *vp;
386 IN struct lwp *l;
387 };
388
389 #
390 #% reclaim vp U U U
391 #
392 vop_reclaim {
393 IN LOCKED=NO struct vnode *vp;
394 IN struct lwp *l;
395 };
396
397 #
398 #% lock vp U L U
399 #
400 vop_lock {
401 IN LOCKED=NO struct vnode *vp;
402 IN int flags;
403 };
404
405 #
406 #% unlock vp L U L
407 #
408 vop_unlock {
409 IN LOCKED=YES struct vnode *vp;
410 IN int flags;
411 };
412
413 #
414 #% bmap vp = = =
415 #% bmap vpp - U -
416 #
417 vop_bmap {
418 IN struct vnode *vp;
419 IN daddr_t bn;
420 OUT struct vnode **vpp;
421 IN daddr_t *bnp;
422 OUT int *runp;
423 };
424
425 #
426 #% strategy vp = = =
427 #
428 vop_strategy {
429 IN struct vnode *vp;
430 IN struct buf *bp;
431 };
432
433 #
434 #% print vp = = =
435 #
436 vop_print {
437 IN struct vnode *vp;
438 };
439
440 #
441 #% islocked vp = = =
442 #
443 vop_islocked {
444 IN struct vnode *vp;
445 };
446
447 #
448 #% pathconf vp L L L
449 #
450 vop_pathconf {
451 IN LOCKED=YES struct vnode *vp;
452 IN int name;
453 OUT register_t *retval;
454 };
455
456 #
457 #% advlock vp U U U
458 #
459 vop_advlock {
460 IN LOCKED=NO struct vnode *vp;
461 IN void *id;
462 IN int op;
463 IN struct flock *fl;
464 IN int flags;
465 };
466
467 #
468 #% lease vp = = =
469 #
470 vop_lease {
471 IN struct vnode *vp;
472 IN struct lwp *l;
473 IN kauth_cred_t cred;
474 IN int flag;
475 };
476
477 #
478 #% whiteout dvp L L L
479 #% whiteout cnp - - -
480 #% whiteout flag - - -
481 #
482 #! whiteout cnp CREATE, LOCKPARENT
483 #
484 vop_whiteout {
485 IN LOCKED=YES struct vnode *dvp;
486 IN struct componentname *cnp;
487 IN int flags;
488 };
489
490 #
491 # Needs work: no vp?
492 #
493 #vop_bwrite {
494 # IN struct buf *bp;
495 #};
496
497 #
498 #% getpages vp = = =
499 #
500 vop_getpages {
501 IN struct vnode *vp;
502 IN voff_t offset;
503 IN struct vm_page **m;
504 IN int *count;
505 IN int centeridx;
506 IN vm_prot_t access_type;
507 IN int advice;
508 IN int flags;
509 };
510
511 #
512 #% putpages vp = = =
513 #
514 vop_putpages {
515 IN struct vnode *vp;
516 IN voff_t offlo;
517 IN voff_t offhi;
518 IN int flags;
519 };
520
521 #
522 #% closeextattr vp L L L
523 #
524 vop_closeextattr {
525 IN LOCKED=YES struct vnode *vp;
526 IN int commit;
527 IN kauth_cred_t cred;
528 IN struct lwp *l;
529 };
530
531 #
532 #% getextattr vp L L L
533 #
534 vop_getextattr {
535 IN LOCKED=YES struct vnode *vp;
536 IN int attrnamespace;
537 IN const char *name;
538 INOUT struct uio *uio;
539 OUT size_t *size;
540 IN kauth_cred_t cred;
541 IN struct lwp *l;
542 };
543
544 #
545 #% listextattr vp L L L
546 #
547 vop_listextattr {
548 IN LOCKED=YES struct vnode *vp;
549 IN int attrnamespace;
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 #% openextattr vp L L L
558 #
559 vop_openextattr {
560 IN LOCKED=YES struct vnode *vp;
561 IN kauth_cred_t cred;
562 IN struct lwp *l;
563 };
564
565 #
566 #% deleteextattr vp L L L
567 #
568 vop_deleteextattr {
569 IN LOCKED=YES struct vnode *vp;
570 IN int attrnamespace;
571 IN const char *name;
572 IN kauth_cred_t cred;
573 IN struct lwp *l;
574 };
575
576 #
577 #% setextattr vp L L L
578 #
579 vop_setextattr {
580 IN LOCKED=YES struct vnode *vp;
581 IN int attrnamespace;
582 IN const char *name;
583 INOUT struct uio *uio;
584 IN kauth_cred_t cred;
585 IN struct lwp *l;
586 };
Cache object: bab3f726857806f7d61987fd0e47c27e
|