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