vnode_if.src revision 54795
123833Speter#
223833Speter# Copyright (c) 1992, 1993
323833Speter#	The Regents of the University of California.  All rights reserved.
423833Speter#
523833Speter# Redistribution and use in source and binary forms, with or without
623833Speter# modification, are permitted provided that the following conditions
723833Speter# are met:
823833Speter# 1. Redistributions of source code must retain the above copyright
923833Speter#    notice, this list of conditions and the following disclaimer.
1023833Speter# 2. Redistributions in binary form must reproduce the above copyright
1123833Speter#    notice, this list of conditions and the following disclaimer in the
1223833Speter#    documentation and/or other materials provided with the distribution.
1323833Speter# 3. All advertising materials mentioning features or use of this software
1423833Speter#    must display the following acknowledgement:
1523833Speter#	This product includes software developed by the University of
1623833Speter#	California, Berkeley and its contributors.
1723833Speter# 4. Neither the name of the University nor the names of its contributors
1823833Speter#    may be used to endorse or promote products derived from this software
1923833Speter#    without specific prior written permission.
2023833Speter#
2123833Speter# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2223833Speter# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2323833Speter# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2423833Speter# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2523833Speter# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2623833Speter# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2723833Speter# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2823833Speter# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2923833Speter# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3023833Speter# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3123833Speter# SUCH DAMAGE.
3223833Speter#
3323833Speter#	@(#)vnode_if.src	8.12 (Berkeley) 5/14/95
3423833Speter# $FreeBSD: head/sys/kern/vnode_if.src 54795 1999-12-18 23:01:52Z eivind $
3523833Speter#
3623833Speter
3723833Speter#
3823833Speter# Above each of the vop descriptors is a specification of the locking
3923833Speter# protocol used by each vop call.  The first column is the name of
4092986Sobrien# the variable, the remaining three columns are in, out and error
4192986Sobrien# respectively.  The "in" column defines the lock state on input,
4223833Speter# the "out" column defines the state on succesful return, and the
4371579Sdeischen# "error" column defines the locking state on error exit.
4423833Speter#
4523833Speter# The locking value can take the following values:
4623833Speter# L: locked; not converted to type of lock.
4723833Speter# A: any lock type.
4823833Speter# S: locked with shared lock.
4923833Speter# E: locked with exclusive lock for this process.
5023833Speter# O: locked with exclusive lock for other process.
5123833Speter# U: unlocked.
5271579Sdeischen# -: not applicable.  vnode does not yet (or no longer) exists.
5323833Speter# =: the same on input and output, may be either L or U.
5423833Speter# X: locked if not nil.
5523833Speter#
5623833Speter
5723833Speter#
5823833Speter#% islocked	vp	= = =
5923833Speter#
6023833Spetervop_islocked {
6123833Speter	IN struct vnode *vp;
6223833Speter	IN struct proc *p;
6323833Speter};
6423833Speter
6523833Speter#
6623833Speter#% lookup	dvp	L ? ?
6723833Speter#% lookup	vpp	- L -
6823833Speter#
6943937Sache# XXX - the lookup locking protocol defies simple description and depends
7023833Speter#	on the flags and operation fields in the (cnp) structure.  Note
7123833Speter#	especially that *vpp may equal dvp and both may be locked.
7256698Sjasone#
7323833Spetervop_lookup {
7423833Speter	IN struct vnode *dvp;
7523833Speter	INOUT struct vnode **vpp;
7623833Speter	IN struct componentname *cnp;
7723833Speter};
7823833Speter
7923833Speter#
8023833Speter#% cachedlookup	dvp	L ? ?
8123833Speter#% cachedlookup	vpp	- L -
8223833Speter#
8323833Speter# This must be an exact copy of lookup.  See kern/vfs_cache.c for details.
8423833Speter#
8523833Spetervop_cachedlookup {
8623833Speter	IN struct vnode *dvp;
8723833Speter	INOUT struct vnode **vpp;
8823833Speter	IN struct componentname *cnp;
8923833Speter};
9023833Speter
9123833Speter#
9223833Speter#% create	dvp	L L L
9323833Speter#% create	vpp	- L -
9423833Speter#
9523833Spetervop_create {
9623833Speter	IN struct vnode *dvp;
9723833Speter	OUT struct vnode **vpp;
9823833Speter	IN struct componentname *cnp;
9923833Speter	IN struct vattr *vap;
10023833Speter};
10123833Speter
10223833Speter#
10323833Speter#% whiteout	dvp	L L L
10423833Speter#
10523833Spetervop_whiteout {
10623833Speter	IN struct vnode *dvp;
10723833Speter	IN struct componentname *cnp;
10843937Sache	IN int flags;
10943937Sache};
11043937Sache
11143937Sache#
11239327Simp#% mknod	dvp	L L L
11323833Speter#% mknod	vpp	- X -
11423833Speter#
11523833Spetervop_mknod {
11623833Speter	IN struct vnode *dvp;
11723833Speter	OUT struct vnode **vpp;
11823833Speter	IN struct componentname *cnp;
11923833Speter	IN struct vattr *vap;
12023833Speter};
12123833Speter
12223833Speter#
12323833Speter#% open		vp	L L L
12423833Speter#
12523833Spetervop_open {
12623833Speter	IN struct vnode *vp;
12723833Speter	IN int mode;
12823833Speter	IN struct ucred *cred;
12923833Speter	IN struct proc *p;
13023833Speter};
13123833Speter
13223833Speter#
13323833Speter#% close	vp	U U U
13423833Speter#
13523833Spetervop_close {
13623833Speter	IN struct vnode *vp;
13723833Speter	IN int fflag;
13823833Speter	IN struct ucred *cred;
13923833Speter	IN struct proc *p;
14023833Speter};
14123833Speter
14223833Speter#
14323833Speter#% access	vp	L L L
14423833Speter#
14523833Spetervop_access {
14623833Speter	IN struct vnode *vp;
14723833Speter	IN int mode;
14823833Speter	IN struct ucred *cred;
14923833Speter	IN struct proc *p;
15023833Speter};
15123833Speter
15223833Speter#
15323833Speter#% getattr	vp	= = =
15423833Speter#
15523833Spetervop_getattr {
15623833Speter	IN struct vnode *vp;
15723833Speter	IN struct vattr *vap;
15823833Speter	IN struct ucred *cred;
15956698Sjasone	IN struct proc *p;
16023833Speter};
16123833Speter
16223833Speter#
16323833Speter#% setattr	vp	L L L
16456698Sjasone#
16523833Spetervop_setattr {
16623833Speter	IN struct vnode *vp;
16723833Speter	IN struct vattr *vap;
168	IN struct ucred *cred;
169	IN struct proc *p;
170};
171
172#
173#% read		vp	L L L
174#
175vop_read {
176	IN struct vnode *vp;
177	INOUT struct uio *uio;
178	IN int ioflag;
179	IN struct ucred *cred;
180};
181
182#
183#% write	vp	L L L
184#
185vop_write {
186	IN struct vnode *vp;
187	INOUT struct uio *uio;
188	IN int ioflag;
189	IN struct ucred *cred;
190};
191
192#
193#% lease	vp	= = =
194#
195vop_lease {
196	IN struct vnode *vp;
197	IN struct proc *p;
198	IN struct ucred *cred;
199	IN int flag;
200};
201
202#
203#% ioctl	vp	U U U
204#
205vop_ioctl {
206	IN struct vnode *vp;
207	IN u_long command;
208	IN caddr_t data;
209	IN int fflag;
210	IN struct ucred *cred;
211	IN struct proc *p;
212};
213
214#
215#% poll	vp	U U U
216#
217vop_poll {
218	IN struct vnode *vp;
219	IN int events;
220	IN struct ucred *cred;
221	IN struct proc *p;
222};
223
224#
225#% revoke	vp	U U U
226#
227vop_revoke {
228	IN struct vnode *vp;
229	IN int flags;
230};
231
232#
233# XXX - not used
234#
235vop_mmap {
236	IN struct vnode *vp;
237	IN int fflags;
238	IN struct ucred *cred;
239	IN struct proc *p;
240};
241
242#
243#% fsync	vp	L L L
244#
245vop_fsync {
246	IN struct vnode *vp;
247	IN struct ucred *cred;
248	IN int waitfor;
249	IN struct proc *p;
250};
251
252#
253#% remove	dvp	L L L
254#% remove	vp	L L L
255#
256vop_remove {
257	IN struct vnode *dvp;
258	IN struct vnode *vp;
259	IN struct componentname *cnp;
260};
261
262#
263#% link		tdvp	L L L
264#% link		vp	U U U
265#
266vop_link {
267	IN struct vnode *tdvp;
268	IN struct vnode *vp;
269	IN struct componentname *cnp;
270};
271
272#
273#% rename	fdvp	U U U
274#% rename	fvp	U U U
275#% rename	tdvp	L U U
276#% rename	tvp	X U U
277#
278vop_rename {
279	IN WILLRELE struct vnode *fdvp;
280	IN WILLRELE struct vnode *fvp;
281	IN struct componentname *fcnp;
282	IN WILLRELE struct vnode *tdvp;
283	IN WILLRELE struct vnode *tvp;
284	IN struct componentname *tcnp;
285};
286
287#
288#% mkdir	dvp	L L L
289#% mkdir	vpp	- L -
290#
291vop_mkdir {
292	IN struct vnode *dvp;
293	OUT struct vnode **vpp;
294	IN struct componentname *cnp;
295	IN struct vattr *vap;
296};
297
298#
299#% rmdir	dvp	L L L
300#% rmdir	vp	L L L
301#
302vop_rmdir {
303	IN struct vnode *dvp;
304	IN struct vnode *vp;
305	IN struct componentname *cnp;
306};
307
308#
309#% symlink	dvp	L L L
310#% symlink	vpp	- U -
311#
312vop_symlink {
313	IN struct vnode *dvp;
314	OUT struct vnode **vpp;
315	IN struct componentname *cnp;
316	IN struct vattr *vap;
317	IN char *target;
318};
319
320#
321#% readdir	vp	L L L
322#
323vop_readdir {
324	IN struct vnode *vp;
325	INOUT struct uio *uio;
326	IN struct ucred *cred;
327	INOUT int *eofflag;
328	OUT int *ncookies;
329	INOUT u_long **cookies;
330};
331
332#
333#% readlink	vp	L L L
334#
335vop_readlink {
336	IN struct vnode *vp;
337	INOUT struct uio *uio;
338	IN struct ucred *cred;
339};
340
341#
342#% inactive	vp	L U U
343#
344vop_inactive {
345	IN struct vnode *vp;
346	IN struct proc *p;
347};
348
349#
350#% reclaim	vp	U U U
351#
352vop_reclaim {
353	IN struct vnode *vp;
354	IN struct proc *p;
355};
356
357#
358#% lock		vp	? ? ?
359#
360vop_lock {
361	IN struct vnode *vp;
362	IN int flags;
363	IN struct proc *p;
364};
365
366#
367#% unlock	vp	L U L
368#
369vop_unlock {
370	IN struct vnode *vp;
371	IN int flags;
372	IN struct proc *p;
373};
374
375#
376#% bmap		vp	L L L
377#% bmap		vpp	- U -
378#
379vop_bmap {
380	IN struct vnode *vp;
381	IN daddr_t bn;
382	OUT struct vnode **vpp;
383	IN daddr_t *bnp;
384	OUT int *runp;
385	OUT int *runb;
386};
387
388#
389#% strategy	vp	L L L
390#
391vop_strategy {
392	IN struct vnode *vp;
393	IN struct buf *bp;
394};
395
396#
397#% print	vp	= = =
398#
399vop_print {
400	IN struct vnode *vp;
401};
402
403#
404#% pathconf	vp	L L L
405#
406vop_pathconf {
407	IN struct vnode *vp;
408	IN int name;
409	OUT register_t *retval;
410};
411
412#
413#% advlock	vp	U U U
414#
415vop_advlock {
416	IN struct vnode *vp;
417	IN caddr_t id;
418	IN int op;
419	IN struct flock *fl;
420	IN int flags;
421};
422
423#
424#% balloc	vp	L L L
425#
426vop_balloc {
427	IN struct vnode *vp;
428	IN off_t startoffset;
429	IN int size;
430	IN struct ucred *cred;
431	IN int flags;
432	OUT struct buf **bpp;
433};
434
435#
436#% reallocblks	vp	L L L
437#
438vop_reallocblks {
439	IN struct vnode *vp;
440	IN struct cluster_save *buflist;
441};
442
443#
444#% getpages	vp	L L L
445#
446vop_getpages {
447	IN struct vnode *vp;
448	IN vm_page_t *m;
449	IN int count;
450	IN int reqpage;
451	IN vm_ooffset_t offset;
452};
453
454#
455#% putpages	vp	L L L
456#
457vop_putpages {
458	IN struct vnode *vp;
459	IN vm_page_t *m;
460	IN int count;
461	IN int sync;
462	IN int *rtvals;
463	IN vm_ooffset_t offset;
464};
465
466#
467#% freeblks	vp	- - -
468#
469# This call is used by the filesystem to release blocks back to 
470# device-driver.  This is useful if the driver has a lengthy 
471# erase handling or similar.
472#
473
474vop_freeblks {
475	IN struct vnode *vp;
476	IN daddr_t addr;
477	IN daddr_t length;
478};
479
480#
481#% bwrite	vp	L L L
482#
483vop_bwrite {
484	IN struct vnode *vp;
485	IN struct buf *bp;
486};
487