xref: /csrg-svn/sys/kern/vnode_if.src (revision 68297)
154647Smckusick#
263183Sbostic# Copyright (c) 1992, 1993
363183Sbostic#	The Regents of the University of California.  All rights reserved.
454647Smckusick#
554647Smckusick# %sccs.include.redist.sh%
654647Smckusick#
7*68297Scgd#	@(#)vnode_if.src	8.8 (Berkeley) 02/14/95
854647Smckusick#
967113Spendry
1067113Spendry#
1167113Spendry# Above each of the vop descriptors is a specification of the locking
1267113Spendry# protocol used by each vop call.  The first column is the name of
1367113Spendry# the variable, the remaining three columns are in, out and error
1467113Spendry# respectively.  The "in" column defines the lock state on input,
1567113Spendry# the "out" column defines the state on succesful return, and the
1667113Spendry# "error" column defines the locking state on error exit.
1767113Spendry#
1867113Spendry# The locking value can take the following values:
1967113Spendry# L: locked.
2067113Spendry# U: unlocked/
2167113Spendry# -: not applicable.  vnode does not yet (or no longer) exists.
2267113Spendry# =: the same on input and output, may be either L or U.
2367113Spendry# X: locked if not nil.
2467113Spendry#
2567113Spendry
2667113Spendry#
2767113Spendry#% lookup	dvp	L ? ?
2867113Spendry#% lookup	vpp	- L -
2967113Spendry#
3067113Spendry# XXX - the lookup locking protocol defies simple description and depends
31*68297Scgd#	on the flags and operation fields in the (cnp) structure.  Note
32*68297Scgd#	especially that *vpp may equal dvp and both may be locked.
3367113Spendry#
3454647Smckusickvop_lookup {
3554647Smckusick	IN struct vnode *dvp;
3655087Spendry	INOUT struct vnode **vpp;
3754647Smckusick	IN struct componentname *cnp;
3854647Smckusick};
3954647Smckusick
4067113Spendry#
4167113Spendry#% create	dvp	L U U
4267113Spendry#% create	vpp	- L -
4367113Spendry#
4454647Smckusickvop_create {
4554991Sheideman	IN WILLRELE struct vnode *dvp;
4654647Smckusick	OUT struct vnode **vpp;
4754647Smckusick	IN struct componentname *cnp;
4854647Smckusick	IN struct vattr *vap;
4954647Smckusick};
5054647Smckusick
5167113Spendry#
5267518Spendry#% whiteout	dvp	L L L
5367518Spendry#% whiteout	cnp	- - -
5467518Spendry#% whiteout	flag	- - -
55*68297Scgd#
5667518Spendryvop_whiteout {
5767518Spendry	IN WILLRELE struct vnode *dvp;
5867518Spendry	IN struct componentname *cnp;
5967518Spendry	IN int flags;
6067518Spendry};
6167518Spendry
6267518Spendry#
6367113Spendry#% mknod	dvp	L U U
6467113Spendry#% mknod	vpp	- X -
6567113Spendry#
6654647Smckusickvop_mknod {
6754991Sheideman	IN WILLRELE struct vnode *dvp;
6854991Sheideman	OUT WILLRELE struct vnode **vpp;
6954647Smckusick	IN struct componentname *cnp;
7054647Smckusick	IN struct vattr *vap;
7154647Smckusick};
7254647Smckusick
7367113Spendry#
74*68297Scgd#% open		vp	L L L
7567113Spendry#
7654647Smckusickvop_open {
7754647Smckusick	IN struct vnode *vp;
7854647Smckusick	IN int mode;
7954647Smckusick	IN struct ucred *cred;
8054647Smckusick	IN struct proc *p;
8154647Smckusick};
8254647Smckusick
8367113Spendry#
8467113Spendry#% close	vp	U U U
8567113Spendry#
8654647Smckusickvop_close {
8754647Smckusick	IN struct vnode *vp;
8854647Smckusick	IN int fflag;
8954647Smckusick	IN struct ucred *cred;
9054647Smckusick	IN struct proc *p;
9154647Smckusick};
9254647Smckusick
9367113Spendry#
9467113Spendry#% access	vp	L L L
9567113Spendry#
9654647Smckusickvop_access {
9754647Smckusick	IN struct vnode *vp;
9854647Smckusick	IN int mode;
9954647Smckusick	IN struct ucred *cred;
10054647Smckusick	IN struct proc *p;
10154647Smckusick};
10254647Smckusick
10367113Spendry#
10467113Spendry#% getattr	vp	= = =
10567113Spendry#
10654647Smckusickvop_getattr {
10754647Smckusick	IN struct vnode *vp;
10854647Smckusick	IN struct vattr *vap;
10954647Smckusick	IN struct ucred *cred;
11054647Smckusick	IN struct proc *p;
11154647Smckusick};
11254647Smckusick
11367113Spendry#
11467113Spendry#% setattr	vp	L L L
11567113Spendry#
11654647Smckusickvop_setattr {
11754647Smckusick	IN struct vnode *vp;
11854647Smckusick	IN struct vattr *vap;
11954647Smckusick	IN struct ucred *cred;
12054647Smckusick	IN struct proc *p;
12154647Smckusick};
12254647Smckusick
12367113Spendry#
124*68297Scgd#% read		vp	L L L
12567113Spendry#
12654647Smckusickvop_read {
12754647Smckusick	IN struct vnode *vp;
12854647Smckusick	INOUT struct uio *uio;
12954647Smckusick	IN int ioflag;
13054647Smckusick	IN struct ucred *cred;
13154647Smckusick};
13254647Smckusick
13367113Spendry#
13467113Spendry#% write	vp	L L L
13567113Spendry#
13654647Smckusickvop_write {
13754647Smckusick	IN struct vnode *vp;
13854647Smckusick	INOUT struct uio *uio;
13954647Smckusick	IN int ioflag;
14054647Smckusick	IN struct ucred *cred;
14154647Smckusick};
14254647Smckusick
14367113Spendry#
14467637Smckusick#% lease	vp	= = =
14567637Smckusick#
14667637Smckusickvop_lease {
14767637Smckusick	IN struct vnode *vp;
14867637Smckusick	IN struct proc *p;
14967637Smckusick	IN struct ucred *cred;
15067637Smckusick	IN int flag;
15167637Smckusick};
15267637Smckusick
15367637Smckusick#
15467113Spendry#% ioctl	vp	U U U
15567113Spendry#
15654647Smckusickvop_ioctl {
15754647Smckusick	IN struct vnode *vp;
158*68297Scgd	IN u_long command;
15954647Smckusick	IN caddr_t data;
16054647Smckusick	IN int fflag;
16154647Smckusick	IN struct ucred *cred;
16254647Smckusick	IN struct proc *p;
16354647Smckusick};
16454647Smckusick
16567113Spendry#
16667113Spendry#% select	vp	U U U
16767113Spendry#
16854647Smckusick# Needs work?  (fflags)
169*68297Scgd#
17054647Smckusickvop_select {
17154647Smckusick	IN struct vnode *vp;
17254647Smckusick	IN int which;
17354647Smckusick	IN int fflags;
17454647Smckusick	IN struct ucred *cred;
17554647Smckusick	IN struct proc *p;
17654647Smckusick};
17754647Smckusick
178*68297Scgd#
17967113Spendry# XXX - not used
180*68297Scgd#
18154647Smckusickvop_mmap {
18254647Smckusick	IN struct vnode *vp;
18354647Smckusick	IN int fflags;
18454647Smckusick	IN struct ucred *cred;
18554647Smckusick	IN struct proc *p;
18654647Smckusick};
18754647Smckusick
18867113Spendry#
18967113Spendry#% fsync	vp	L L L
19067113Spendry#
19154647Smckusickvop_fsync {
19254647Smckusick	IN struct vnode *vp;
19354647Smckusick	IN struct ucred *cred;
19454647Smckusick	IN int waitfor;
19554647Smckusick	IN struct proc *p;
19654647Smckusick};
19754647Smckusick
198*68297Scgd#
19967113Spendry# XXX - not used
200*68297Scgd# Needs work: Is newoff right?  What's it mean?
201*68297Scgd#
20254647Smckusickvop_seek {
20354647Smckusick	IN struct vnode *vp;
20454647Smckusick	IN off_t oldoff;
20554647Smckusick	IN off_t newoff;
20654647Smckusick	IN struct ucred *cred;
20754647Smckusick};
20854647Smckusick
20967113Spendry#
21067113Spendry#% remove	dvp	L U U
21167113Spendry#% remove	vp	L U U
21267113Spendry#
21354647Smckusickvop_remove {
21454991Sheideman	IN WILLRELE struct vnode *dvp;
21554991Sheideman	IN WILLRELE struct vnode *vp;
21654647Smckusick	IN struct componentname *cnp;
21754647Smckusick};
21854647Smckusick
21967113Spendry#
220*68297Scgd#% link		vp	U U U
221*68297Scgd#% link		tdvp	L U U
22267113Spendry#
22354647Smckusickvop_link {
22454991Sheideman	IN WILLRELE struct vnode *vp;
22554647Smckusick	IN struct vnode *tdvp;
22654647Smckusick	IN struct componentname *cnp;
22754647Smckusick};
22854647Smckusick
22967113Spendry#
23067113Spendry#% rename	fdvp	U U U
23167113Spendry#% rename	fvp	U U U
23267113Spendry#% rename	tdvp	L U U
23367113Spendry#% rename	tvp	X U U
23467113Spendry#
23554647Smckusickvop_rename {
23654991Sheideman	IN WILLRELE struct vnode *fdvp;
23754991Sheideman	IN WILLRELE struct vnode *fvp;
23854647Smckusick	IN struct componentname *fcnp;
23954991Sheideman	IN WILLRELE struct vnode *tdvp;
24054991Sheideman	IN WILLRELE struct vnode *tvp;
24154647Smckusick	IN struct componentname *tcnp;
24254647Smckusick};
24354647Smckusick
24467113Spendry#
24567113Spendry#% mkdir	dvp	L U U
24667113Spendry#% mkdir	vpp	- L -
24767113Spendry#
24854647Smckusickvop_mkdir {
24954991Sheideman	IN WILLRELE struct vnode *dvp;
25054647Smckusick	OUT struct vnode **vpp;
25154647Smckusick	IN struct componentname *cnp;
25254647Smckusick	IN struct vattr *vap;
25354647Smckusick};
25454647Smckusick
25567113Spendry#
25667113Spendry#% rmdir	dvp	L U U
25767113Spendry#% rmdir	vp	L U U
25867113Spendry#
25954647Smckusickvop_rmdir {
26054991Sheideman	IN WILLRELE struct vnode *dvp;
26154991Sheideman	IN WILLRELE struct vnode *vp;
26254647Smckusick	IN struct componentname *cnp;
26354647Smckusick};
26454647Smckusick
26567113Spendry#
26667113Spendry#% symlink	dvp	L U U
26767113Spendry#% symlink	vpp	- U -
268*68297Scgd#
26967113Spendry# XXX - note that the return vnode has already been VRELE'ed
270*68297Scgd#	by the filesystem layer.  To use it you must use vget,
271*68297Scgd#	possibly with a further namei.
27267113Spendry#
27354647Smckusickvop_symlink {
27454991Sheideman	IN WILLRELE struct vnode *dvp;
27554991Sheideman	OUT WILLRELE struct vnode **vpp;
27654647Smckusick	IN struct componentname *cnp;
27754647Smckusick	IN struct vattr *vap;
27854647Smckusick	IN char *target;
27954647Smckusick};
28054647Smckusick
28167113Spendry#
28267113Spendry#% readdir	vp	L L L
28367113Spendry#
28454647Smckusickvop_readdir {
28554647Smckusick	IN struct vnode *vp;
28654647Smckusick	INOUT struct uio *uio;
28754647Smckusick	IN struct ucred *cred;
28867361Smckusick	INOUT int *eofflag;
28967361Smckusick	OUT u_long *cookies;
29067361Smckusick	IN int ncookies;
29154647Smckusick};
29254647Smckusick
29367113Spendry#
29467113Spendry#% readlink	vp	L L L
29567113Spendry#
29654647Smckusickvop_readlink {
29754647Smckusick	IN struct vnode *vp;
29854647Smckusick	INOUT struct uio *uio;
29954647Smckusick	IN struct ucred *cred;
30054647Smckusick};
30154647Smckusick
30267113Spendry#
30367113Spendry#% abortop	dvp	= = =
30467113Spendry#
30554647Smckusickvop_abortop {
30654647Smckusick	IN struct vnode *dvp;
30754647Smckusick	IN struct componentname *cnp;
30854647Smckusick};
30954647Smckusick
31067113Spendry#
31167113Spendry#% inactive	vp	U U U
31267113Spendry#
31354647Smckusickvop_inactive {
31454647Smckusick	IN struct vnode *vp;
31554647Smckusick};
31654647Smckusick
31767113Spendry#
31867113Spendry#% reclaim	vp	U U U
31967113Spendry#
32054647Smckusickvop_reclaim {
32154647Smckusick	IN struct vnode *vp;
32254647Smckusick};
32354647Smckusick
32467113Spendry#
325*68297Scgd#% lock		vp	U L U
32667113Spendry#
32754647Smckusickvop_lock {
32854647Smckusick	IN struct vnode *vp;
32954647Smckusick};
33054647Smckusick
33167113Spendry#
33267113Spendry#% unlock	vp	L U L
33367113Spendry#
33454647Smckusickvop_unlock {
33554647Smckusick	IN struct vnode *vp;
33654647Smckusick};
33754647Smckusick
33867113Spendry#
339*68297Scgd#% bmap		vp	L L L
340*68297Scgd#% bmap		vpp	- U -
34167113Spendry#
34254647Smckusickvop_bmap {
34354647Smckusick	IN struct vnode *vp;
34454647Smckusick	IN daddr_t bn;
34554647Smckusick	OUT struct vnode **vpp;
34654647Smckusick	IN daddr_t *bnp;
34756441Smargo	OUT int *runp;
34854647Smckusick};
34954647Smckusick
350*68297Scgd#
351*68297Scgd# Needs work: no vp?
352*68297Scgd#
35354647Smckusick#vop_strategy {
35454647Smckusick#	IN struct buf *bp;
35554647Smckusick#};
35654647Smckusick
35767113Spendry#
35867113Spendry#% print	vp	= = =
35967113Spendry#
36054647Smckusickvop_print {
36154647Smckusick	IN struct vnode *vp;
36254647Smckusick};
36354647Smckusick
36467113Spendry#
36567113Spendry#% islocked	vp	= = =
36667113Spendry#
36754647Smckusickvop_islocked {
36854647Smckusick	IN struct vnode *vp;
36954647Smckusick};
37054647Smckusick
37167113Spendry#
37267113Spendry#% pathconf	vp	L L L
37367113Spendry#
37460383Smckusickvop_pathconf {
37560383Smckusick	IN struct vnode *vp;
37660383Smckusick	IN int name;
377*68297Scgd	OUT register_t *retval;
37860383Smckusick};
37960383Smckusick
38067113Spendry#
38167113Spendry#% advlock	vp	U U U
38267113Spendry#
38354647Smckusickvop_advlock {
38454647Smckusick	IN struct vnode *vp;
38554647Smckusick	IN caddr_t id;
38654647Smckusick	IN int op;
38754647Smckusick	IN struct flock *fl;
38854647Smckusick	IN int flags;
38954647Smckusick};
39054647Smckusick
39167113Spendry#
39267113Spendry#% blkatoff	vp	L L L
39367113Spendry#
39454647Smckusickvop_blkatoff {
39554647Smckusick	IN struct vnode *vp;
39654647Smckusick	IN off_t offset;
39754647Smckusick	OUT char **res;
39854647Smckusick	OUT struct buf **bpp;
39954647Smckusick};
40054647Smckusick
40167113Spendry#
40267113Spendry#% valloc	pvp	L L L
40367113Spendry#
40454647Smckusickvop_valloc {
40554647Smckusick	IN struct vnode *pvp;
40654647Smckusick	IN int mode;
40754647Smckusick	IN struct ucred *cred;
40854647Smckusick	OUT struct vnode **vpp;
40954647Smckusick};
41054647Smckusick
41167113Spendry#
41267113Spendry#% reallocblks	vp	L L L
41367113Spendry#
41465976Smckusickvop_reallocblks {
41565976Smckusick	IN struct vnode *vp;
41665976Smckusick	IN struct cluster_save *buflist;
41765976Smckusick};
41865976Smckusick
41967113Spendry#
42067113Spendry#% vfree	pvp	L L L
42167113Spendry#
42254647Smckusickvop_vfree {
42354647Smckusick	IN struct vnode *pvp;
42454647Smckusick	IN ino_t ino;
42554647Smckusick	IN int mode;
42654647Smckusick};
42754647Smckusick
42867113Spendry#
42967113Spendry#% truncate	vp	L L L
43067113Spendry#
43154647Smckusickvop_truncate {
43254647Smckusick	IN struct vnode *vp;
43354647Smckusick	IN off_t length;
43454647Smckusick	IN int flags;
43554647Smckusick	IN struct ucred *cred;
43654647Smckusick	IN struct proc *p;
43754647Smckusick};
43854647Smckusick
43967113Spendry#
44067113Spendry#% update	vp	L L L
44167113Spendry#
44254647Smckusickvop_update {
44354647Smckusick	IN struct vnode *vp;
44464415Sbostic	IN struct timeval *access;
44564415Sbostic	IN struct timeval *modify;
44654647Smckusick	IN int waitfor;
44754647Smckusick};
44854647Smckusick
449*68297Scgd#
45054647Smckusick# Needs work: no vp?
451*68297Scgd#
45254647Smckusick#vop_bwrite {
45354647Smckusick#	IN struct buf *bp;
45454647Smckusick#};
455