xref: /csrg-svn/sys/kern/vnode_if.src (revision 68660)
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*68660Smckusick#	@(#)vnode_if.src	8.10 (Berkeley) 03/30/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
3168297Scgd#	on the flags and operation fields in the (cnp) structure.  Note
3268297Scgd#	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	- - -
5568297Scgd#
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#
7468297Scgd#% 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#
12468297Scgd#% 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;
15868297Scgd	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)
16968297Scgd#
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
17868297Scgd#
17968420Smckusick#% revoke	vp	U U U
18068420Smckusick#
18168420Smckusickvop_revoke {
18268420Smckusick	IN struct vnode *vp;
18368420Smckusick	IN int flags;
18468420Smckusick};
18568420Smckusick
18668420Smckusick#
18767113Spendry# XXX - not used
18868297Scgd#
18954647Smckusickvop_mmap {
19054647Smckusick	IN struct vnode *vp;
19154647Smckusick	IN int fflags;
19254647Smckusick	IN struct ucred *cred;
19354647Smckusick	IN struct proc *p;
19454647Smckusick};
19554647Smckusick
19667113Spendry#
19767113Spendry#% fsync	vp	L L L
19867113Spendry#
19954647Smckusickvop_fsync {
20054647Smckusick	IN struct vnode *vp;
20154647Smckusick	IN struct ucred *cred;
20254647Smckusick	IN int waitfor;
20354647Smckusick	IN struct proc *p;
20454647Smckusick};
20554647Smckusick
20668297Scgd#
20767113Spendry# XXX - not used
20868297Scgd# Needs work: Is newoff right?  What's it mean?
20968297Scgd#
21054647Smckusickvop_seek {
21154647Smckusick	IN struct vnode *vp;
21254647Smckusick	IN off_t oldoff;
21354647Smckusick	IN off_t newoff;
21454647Smckusick	IN struct ucred *cred;
21554647Smckusick};
21654647Smckusick
21767113Spendry#
21867113Spendry#% remove	dvp	L U U
21967113Spendry#% remove	vp	L U U
22067113Spendry#
22154647Smckusickvop_remove {
22254991Sheideman	IN WILLRELE struct vnode *dvp;
22354991Sheideman	IN WILLRELE struct vnode *vp;
22454647Smckusick	IN struct componentname *cnp;
22554647Smckusick};
22654647Smckusick
22767113Spendry#
22868297Scgd#% link		vp	U U U
22968297Scgd#% link		tdvp	L U U
23067113Spendry#
23154647Smckusickvop_link {
23254991Sheideman	IN WILLRELE struct vnode *vp;
23354647Smckusick	IN struct vnode *tdvp;
23454647Smckusick	IN struct componentname *cnp;
23554647Smckusick};
23654647Smckusick
23767113Spendry#
23867113Spendry#% rename	fdvp	U U U
23967113Spendry#% rename	fvp	U U U
24067113Spendry#% rename	tdvp	L U U
24167113Spendry#% rename	tvp	X U U
24267113Spendry#
24354647Smckusickvop_rename {
24454991Sheideman	IN WILLRELE struct vnode *fdvp;
24554991Sheideman	IN WILLRELE struct vnode *fvp;
24654647Smckusick	IN struct componentname *fcnp;
24754991Sheideman	IN WILLRELE struct vnode *tdvp;
24854991Sheideman	IN WILLRELE struct vnode *tvp;
24954647Smckusick	IN struct componentname *tcnp;
25054647Smckusick};
25154647Smckusick
25267113Spendry#
25367113Spendry#% mkdir	dvp	L U U
25467113Spendry#% mkdir	vpp	- L -
25567113Spendry#
25654647Smckusickvop_mkdir {
25754991Sheideman	IN WILLRELE struct vnode *dvp;
25854647Smckusick	OUT struct vnode **vpp;
25954647Smckusick	IN struct componentname *cnp;
26054647Smckusick	IN struct vattr *vap;
26154647Smckusick};
26254647Smckusick
26367113Spendry#
26467113Spendry#% rmdir	dvp	L U U
26567113Spendry#% rmdir	vp	L U U
26667113Spendry#
26754647Smckusickvop_rmdir {
26854991Sheideman	IN WILLRELE struct vnode *dvp;
26954991Sheideman	IN WILLRELE struct vnode *vp;
27054647Smckusick	IN struct componentname *cnp;
27154647Smckusick};
27254647Smckusick
27367113Spendry#
27467113Spendry#% symlink	dvp	L U U
27567113Spendry#% symlink	vpp	- U -
27668297Scgd#
27767113Spendry# XXX - note that the return vnode has already been VRELE'ed
27868297Scgd#	by the filesystem layer.  To use it you must use vget,
27968297Scgd#	possibly with a further namei.
28067113Spendry#
28154647Smckusickvop_symlink {
28254991Sheideman	IN WILLRELE struct vnode *dvp;
28354991Sheideman	OUT WILLRELE struct vnode **vpp;
28454647Smckusick	IN struct componentname *cnp;
28554647Smckusick	IN struct vattr *vap;
28654647Smckusick	IN char *target;
28754647Smckusick};
28854647Smckusick
28967113Spendry#
29067113Spendry#% readdir	vp	L L L
29167113Spendry#
29254647Smckusickvop_readdir {
29354647Smckusick	IN struct vnode *vp;
29454647Smckusick	INOUT struct uio *uio;
29554647Smckusick	IN struct ucred *cred;
29667361Smckusick	INOUT int *eofflag;
297*68660Smckusick	OUT int *ncookies;
298*68660Smckusick	INOUT u_long **cookies;
29954647Smckusick};
30054647Smckusick
30167113Spendry#
30267113Spendry#% readlink	vp	L L L
30367113Spendry#
30454647Smckusickvop_readlink {
30554647Smckusick	IN struct vnode *vp;
30654647Smckusick	INOUT struct uio *uio;
30754647Smckusick	IN struct ucred *cred;
30854647Smckusick};
30954647Smckusick
31067113Spendry#
31167113Spendry#% abortop	dvp	= = =
31267113Spendry#
31354647Smckusickvop_abortop {
31454647Smckusick	IN struct vnode *dvp;
31554647Smckusick	IN struct componentname *cnp;
31654647Smckusick};
31754647Smckusick
31867113Spendry#
31967113Spendry#% inactive	vp	U U U
32067113Spendry#
32154647Smckusickvop_inactive {
32254647Smckusick	IN struct vnode *vp;
32354647Smckusick};
32454647Smckusick
32567113Spendry#
32667113Spendry#% reclaim	vp	U U U
32767113Spendry#
32854647Smckusickvop_reclaim {
32954647Smckusick	IN struct vnode *vp;
33054647Smckusick};
33154647Smckusick
33267113Spendry#
33368297Scgd#% lock		vp	U L U
33467113Spendry#
33554647Smckusickvop_lock {
33654647Smckusick	IN struct vnode *vp;
33754647Smckusick};
33854647Smckusick
33967113Spendry#
34067113Spendry#% unlock	vp	L U L
34167113Spendry#
34254647Smckusickvop_unlock {
34354647Smckusick	IN struct vnode *vp;
34454647Smckusick};
34554647Smckusick
34667113Spendry#
34768297Scgd#% bmap		vp	L L L
34868297Scgd#% bmap		vpp	- U -
34967113Spendry#
35054647Smckusickvop_bmap {
35154647Smckusick	IN struct vnode *vp;
35254647Smckusick	IN daddr_t bn;
35354647Smckusick	OUT struct vnode **vpp;
35454647Smckusick	IN daddr_t *bnp;
35556441Smargo	OUT int *runp;
35654647Smckusick};
35754647Smckusick
35868297Scgd#
35968297Scgd# Needs work: no vp?
36068297Scgd#
36154647Smckusick#vop_strategy {
36254647Smckusick#	IN struct buf *bp;
36354647Smckusick#};
36454647Smckusick
36567113Spendry#
36667113Spendry#% print	vp	= = =
36767113Spendry#
36854647Smckusickvop_print {
36954647Smckusick	IN struct vnode *vp;
37054647Smckusick};
37154647Smckusick
37267113Spendry#
37367113Spendry#% islocked	vp	= = =
37467113Spendry#
37554647Smckusickvop_islocked {
37654647Smckusick	IN struct vnode *vp;
37754647Smckusick};
37854647Smckusick
37967113Spendry#
38067113Spendry#% pathconf	vp	L L L
38167113Spendry#
38260383Smckusickvop_pathconf {
38360383Smckusick	IN struct vnode *vp;
38460383Smckusick	IN int name;
38568297Scgd	OUT register_t *retval;
38660383Smckusick};
38760383Smckusick
38867113Spendry#
38967113Spendry#% advlock	vp	U U U
39067113Spendry#
39154647Smckusickvop_advlock {
39254647Smckusick	IN struct vnode *vp;
39354647Smckusick	IN caddr_t id;
39454647Smckusick	IN int op;
39554647Smckusick	IN struct flock *fl;
39654647Smckusick	IN int flags;
39754647Smckusick};
39854647Smckusick
39967113Spendry#
40067113Spendry#% blkatoff	vp	L L L
40167113Spendry#
40254647Smckusickvop_blkatoff {
40354647Smckusick	IN struct vnode *vp;
40454647Smckusick	IN off_t offset;
40554647Smckusick	OUT char **res;
40654647Smckusick	OUT struct buf **bpp;
40754647Smckusick};
40854647Smckusick
40967113Spendry#
41067113Spendry#% valloc	pvp	L L L
41167113Spendry#
41254647Smckusickvop_valloc {
41354647Smckusick	IN struct vnode *pvp;
41454647Smckusick	IN int mode;
41554647Smckusick	IN struct ucred *cred;
41654647Smckusick	OUT struct vnode **vpp;
41754647Smckusick};
41854647Smckusick
41967113Spendry#
42067113Spendry#% reallocblks	vp	L L L
42167113Spendry#
42265976Smckusickvop_reallocblks {
42365976Smckusick	IN struct vnode *vp;
42465976Smckusick	IN struct cluster_save *buflist;
42565976Smckusick};
42665976Smckusick
42767113Spendry#
42867113Spendry#% vfree	pvp	L L L
42967113Spendry#
43054647Smckusickvop_vfree {
43154647Smckusick	IN struct vnode *pvp;
43254647Smckusick	IN ino_t ino;
43354647Smckusick	IN int mode;
43454647Smckusick};
43554647Smckusick
43667113Spendry#
43767113Spendry#% truncate	vp	L L L
43867113Spendry#
43954647Smckusickvop_truncate {
44054647Smckusick	IN struct vnode *vp;
44154647Smckusick	IN off_t length;
44254647Smckusick	IN int flags;
44354647Smckusick	IN struct ucred *cred;
44454647Smckusick	IN struct proc *p;
44554647Smckusick};
44654647Smckusick
44767113Spendry#
44867113Spendry#% update	vp	L L L
44967113Spendry#
45054647Smckusickvop_update {
45154647Smckusick	IN struct vnode *vp;
45264415Sbostic	IN struct timeval *access;
45364415Sbostic	IN struct timeval *modify;
45454647Smckusick	IN int waitfor;
45554647Smckusick};
45654647Smckusick
45768297Scgd#
45854647Smckusick# Needs work: no vp?
45968297Scgd#
46054647Smckusick#vop_bwrite {
46154647Smckusick#	IN struct buf *bp;
46254647Smckusick#};
463