|
|
1.1 root 1: #
2: # Copyright (c) 1995, 1997-1998 Apple Computer, Inc. All Rights Reserved.
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.12 (Berkeley) 5/14/95
35: #
36:
37: #
38: # Above each of the vop descriptors is a specification of the locking
39: # protocol used by each vop call. The first column is the name of
40: # the variable, the remaining three columns are in, out and error
41: # respectively. The "in" column defines the lock state on input,
42: # the "out" column defines the state on succesful return, and the
43: # "error" column defines the locking state on error exit.
44: #
45: # The locking value can take the following values:
46: # L: locked.
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:
53: #
54: #% lookup dvp L ? ?
55: #% lookup vpp - L -
56: #
57: # XXX - the lookup locking protocol defies simple description and depends
58: # on the flags and operation fields in the (cnp) structure. Note
59: # especially that *vpp may equal dvp and both may be locked.
60: #
61: vop_lookup {
62: IN struct vnode *dvp;
63: INOUT struct vnode **vpp;
64: IN struct componentname *cnp;
65: };
66:
67: #
68: #% create dvp L U U
69: #% create vpp - L -
70: #
71: vop_create {
72: IN WILLRELE struct vnode *dvp;
73: OUT struct vnode **vpp;
74: IN struct componentname *cnp;
75: IN struct vattr *vap;
76: };
77:
78: #
79: #% whiteout dvp L L L
80: #% whiteout cnp - - -
81: #% whiteout flag - - -
82: #
83: vop_whiteout {
84: IN WILLRELE struct vnode *dvp;
85: IN struct componentname *cnp;
86: IN int flags;
87: };
88:
89: #
90: #% mknod dvp L U U
91: #% mknod vpp - X -
92: #
93: vop_mknod {
94: IN WILLRELE struct vnode *dvp;
95: OUT WILLRELE struct vnode **vpp;
96: IN struct componentname *cnp;
97: IN struct vattr *vap;
98: };
99:
100: #
101: #% mkcomplex dvp L U U
102: #% mkcomplex vpp - X -
103: #
104: vop_mkcomplex {
105: IN WILLRELE struct vnode *dvp;
106: OUT WILLRELE struct vnode **vpp;
107: IN struct componentname *cnp;
108: IN struct vattr *vap;
109: IN u_long type;
110: };
111:
112: #
113: #% open vp L L L
114: #
115: vop_open {
116: IN struct vnode *vp;
117: IN int mode;
118: IN struct ucred *cred;
119: IN struct proc *p;
120: };
121:
122: #
123: #% close vp U U U
124: #
125: vop_close {
126: IN struct vnode *vp;
127: IN int fflag;
128: IN struct ucred *cred;
129: IN struct proc *p;
130: };
131:
132: #
133: #% access vp L L L
134: #
135: vop_access {
136: IN struct vnode *vp;
137: IN int mode;
138: IN struct ucred *cred;
139: IN struct proc *p;
140: };
141:
142: #
143: #% getattr vp = = =
144: #
145: vop_getattr {
146: IN struct vnode *vp;
147: IN struct vattr *vap;
148: IN struct ucred *cred;
149: IN struct proc *p;
150: };
151:
152: #
153: #% setattr vp L L L
154: #
155: vop_setattr {
156: IN struct vnode *vp;
157: IN struct vattr *vap;
158: IN struct ucred *cred;
159: IN struct proc *p;
160: };
161:
162: #
163: #% getattrlist vp = = =
164: #
165: vop_getattrlist {
166: IN struct vnode *vp;
167: IN struct attrlist *alist;
168: INOUT struct uio *uio;
169: IN struct ucred *cred;
170: IN struct proc *p;
171: };
172:
173: #
174: #% setattrlist vp L L L
175: #
176: vop_setattrlist {
177: IN struct vnode *vp;
178: IN struct attrlist *alist;
179: INOUT struct uio *uio;
180: IN struct ucred *cred;
181: IN struct proc *p;
182: };
183:
184: #
185: #% read vp L L L
186: #
187: vop_read {
188: IN struct vnode *vp;
189: INOUT struct uio *uio;
190: IN int ioflag;
191: IN struct ucred *cred;
192: };
193:
194: #
195: #% write vp L L L
196: #
197: vop_write {
198: IN struct vnode *vp;
199: INOUT struct uio *uio;
200: IN int ioflag;
201: IN struct ucred *cred;
202: };
203:
204: #
205: #% lease vp = = =
206: #
207: vop_lease {
208: IN struct vnode *vp;
209: IN struct proc *p;
210: IN struct ucred *cred;
211: IN int flag;
212: };
213:
214: #
215: #% ioctl vp U U U
216: #
217: vop_ioctl {
218: IN struct vnode *vp;
219: IN u_long command;
220: IN caddr_t data;
221: IN int fflag;
222: IN struct ucred *cred;
223: IN struct proc *p;
224: };
225:
226: #
227: #% select vp U U U
228: #
229: # Needs work? (fflags)
230: #
231: vop_select {
232: IN struct vnode *vp;
233: IN int which;
234: IN int fflags;
235: IN struct ucred *cred;
236: IN struct proc *p;
237: };
238:
239: #
240: #% exchange fvp L L L
241: #% exchange tvp L L L
242: #
243: vop_exchange {
244: IN struct vnode *fvp;
245: IN struct vnode *tvp;
246: IN struct ucred *cred;
247: IN struct proc *p;
248: };
249:
250: #
251: #% revoke vp U U U
252: #
253: vop_revoke {
254: IN struct vnode *vp;
255: IN int flags;
256: };
257:
258: #
259: # XXX - not used
260: #
261: vop_mmap {
262: IN struct vnode *vp;
263: IN int fflags;
264: IN struct ucred *cred;
265: IN struct proc *p;
266: };
267:
268: #
269: #% fsync vp L L L
270: #
271: vop_fsync {
272: IN struct vnode *vp;
273: IN struct ucred *cred;
274: IN int waitfor;
275: IN struct proc *p;
276: };
277:
278: #
279: # XXX - not used
280: # Needs work: Is newoff right? What's it mean?
281: #
282: vop_seek {
283: IN struct vnode *vp;
284: IN off_t oldoff;
285: IN off_t newoff;
286: IN struct ucred *cred;
287: };
288:
289: #
290: #% remove dvp L U U
291: #% remove vp L U U
292: #
293: vop_remove {
294: IN WILLRELE struct vnode *dvp;
295: IN WILLRELE struct vnode *vp;
296: IN struct componentname *cnp;
297: };
298:
299: #
300: #% link vp U U U
301: #% link tdvp L U U
302: #
303: vop_link {
304: IN WILLRELE struct vnode *vp;
305: IN struct vnode *tdvp;
306: IN struct componentname *cnp;
307: };
308:
309: #
310: #% rename fdvp U U U
311: #% rename fvp U U U
312: #% rename tdvp L U U
313: #% rename tvp X U U
314: #
315: vop_rename {
316: IN WILLRELE struct vnode *fdvp;
317: IN WILLRELE struct vnode *fvp;
318: IN struct componentname *fcnp;
319: IN WILLRELE struct vnode *tdvp;
320: IN WILLRELE struct vnode *tvp;
321: IN struct componentname *tcnp;
322: };
323:
324: #
325: #% mkdir dvp L U U
326: #% mkdir vpp - L -
327: #
328: vop_mkdir {
329: IN WILLRELE struct vnode *dvp;
330: OUT struct vnode **vpp;
331: IN struct componentname *cnp;
332: IN struct vattr *vap;
333: };
334:
335: #
336: #% rmdir dvp L U U
337: #% rmdir vp L U U
338: #
339: vop_rmdir {
340: IN WILLRELE struct vnode *dvp;
341: IN WILLRELE struct vnode *vp;
342: IN struct componentname *cnp;
343: };
344:
345: #
346: #% symlink dvp L U U
347: #% symlink vpp - U -
348: #
349: # XXX - note that the return vnode has already been VRELE'ed
350: # by the filesystem layer. To use it you must use vget,
351: # possibly with a further namei.
352: #
353: vop_symlink {
354: IN WILLRELE struct vnode *dvp;
355: OUT WILLRELE struct vnode **vpp;
356: IN struct componentname *cnp;
357: IN struct vattr *vap;
358: IN char *target;
359: };
360:
361: #
362: #% readdir vp L L L
363: #
364: vop_readdir {
365: IN struct vnode *vp;
366: INOUT struct uio *uio;
367: IN struct ucred *cred;
368: INOUT int *eofflag;
369: OUT int *ncookies;
370: INOUT u_long **cookies;
371: };
372:
373: #
374: #% readdirattr vp L L L
375: #
376: vop_readdirattr {
377: IN struct vnode *vp;
378: IN struct attrlist *alist;
379: INOUT struct uio *uio;
380: INOUT int index;
381: INOUT int *eofflag;
382: OUT u_long *ncookies;
383: INOUT u_long **cookies;
384: IN struct ucred *cred;
385: };
386:
387: #
388: #% readlink vp L L L
389: #
390: vop_readlink {
391: IN struct vnode *vp;
392: INOUT struct uio *uio;
393: IN struct ucred *cred;
394: };
395:
396: #
397: #% abortop dvp = = =
398: #
399: vop_abortop {
400: IN struct vnode *dvp;
401: IN struct componentname *cnp;
402: };
403:
404: #
405: #% inactive vp L U U
406: #
407: vop_inactive {
408: IN struct vnode *vp;
409: IN struct proc *p;
410: };
411:
412: #
413: #% reclaim vp U U U
414: #
415: vop_reclaim {
416: IN struct vnode *vp;
417: IN struct proc *p;
418: };
419:
420: #
421: #% lock vp U L U
422: #
423: vop_lock {
424: IN struct vnode *vp;
425: IN int flags;
426: IN struct proc *p;
427: };
428:
429: #
430: #% unlock vp L U L
431: #
432: vop_unlock {
433: IN struct vnode *vp;
434: IN int flags;
435: IN struct proc *p;
436: };
437:
438: #
439: #% bmap vp L L L
440: #% bmap vpp - U -
441: #
442: vop_bmap {
443: IN struct vnode *vp;
444: IN daddr_t bn;
445: OUT struct vnode **vpp;
446: IN daddr_t *bnp;
447: OUT int *runp;
448: };
449:
450: #
451: # Needs work: no vp?
452: #
453: #vop_strategy {
454: # IN struct buf *bp;
455: #};
456:
457: #
458: #% print vp = = =
459: #
460: vop_print {
461: IN struct vnode *vp;
462: };
463:
464: #
465: #% islocked vp = = =
466: #
467: vop_islocked {
468: IN struct vnode *vp;
469: };
470:
471: #
472: #% pathconf vp L L L
473: #
474: vop_pathconf {
475: IN struct vnode *vp;
476: IN int name;
477: OUT register_t *retval;
478: };
479:
480: #
481: #% advlock vp U U U
482: #
483: vop_advlock {
484: IN struct vnode *vp;
485: IN caddr_t id;
486: IN int op;
487: IN struct flock *fl;
488: IN int flags;
489: };
490:
491: #
492: #% blkatoff vp L L L
493: #
494: vop_blkatoff {
495: IN struct vnode *vp;
496: IN off_t offset;
497: OUT char **res;
498: OUT struct buf **bpp;
499: };
500:
501: #
502: #% valloc pvp L L L
503: #
504: vop_valloc {
505: IN struct vnode *pvp;
506: IN int mode;
507: IN struct ucred *cred;
508: OUT struct vnode **vpp;
509: };
510:
511: #
512: #% reallocblks vp L L L
513: #
514: vop_reallocblks {
515: IN struct vnode *vp;
516: IN struct cluster_save *buflist;
517: };
518:
519: #
520: #% vfree pvp L L L
521: #
522: vop_vfree {
523: IN struct vnode *pvp;
524: IN ino_t ino;
525: IN int mode;
526: };
527:
528: #
529: #% truncate vp L L L
530: #
531: vop_truncate {
532: IN struct vnode *vp;
533: IN off_t length;
534: IN int flags;
535: IN struct ucred *cred;
536: IN struct proc *p;
537: };
538:
539: #
540: #% allocate vp L L L
541: #
542: vop_allocate {
543: IN struct vnode *vp;
544: IN off_t length;
545: IN u_int32_t flags;
546: OUT off_t *bytesallocated;
547: IN struct ucred *cred;
548: IN struct proc *p;
549: };
550:
551: #
552: #% update vp L L L
553: #
554: vop_update {
555: IN struct vnode *vp;
556: IN struct timeval *access;
557: IN struct timeval *modify;
558: IN int waitfor;
559: };
560:
561: #
562: #% pgrd vp L L L
563: #
564: vop_pgrd {
565: IN struct vnode *vp;
566: INOUT struct uio *uio;
567: IN struct ucred *cred;
568: };
569:
570: #
571: #% pgwr vp L L L
572: #
573: vop_pgwr {
574: IN struct vnode *vp;
575: INOUT struct uio *uio;
576: IN struct ucred *cred;
577: IN vm_offset_t offset;
578: };
579:
580: #
581: # Needs work: no vp?
582: #
583: #vop_bwrite {
584: # IN struct buf *bp;
585: #};
586:
587: #
588: #% pagein vp L L L
589: #
590: vop_pagein {
591: IN struct vnode *vp;
592: INOUT struct uio *uio;
593: IN int ioflag;
594: IN struct ucred *cred;
595: };
596:
597: #
598: #% pageout vp L L L
599: #
600: vop_pageout {
601: IN struct vnode *vp;
602: INOUT struct uio *uio;
603: IN int ioflag;
604: IN struct ucred *cred;
605: };
606:
607: #
608: #% devblocksize vp = = =
609: #
610: vop_devblocksize {
611: IN struct vnode *vp;
612: OUT register_t *retval;
613: };
614:
615: #
616: #% searchfs vp L L L
617: #
618:
619: vop_searchfs {
620: IN struct vnode *vp;
621: IN void *searchparams1;
622: IN void *searchparams2;
623: IN struct attrlist *searchattrs;
624: IN u_long maxmatches;
625: IN struct timeval *timelimit;
626: OUT struct attrlist *returnattrs;
627: OUT u_long *nummatches;
628: IN u_long scriptcode;
629: IN u_long options;
630: INOUT struct uio *uio;
631: INOUT struct searchstate *searchstate;
632: };
633:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.