vnode_if.src revision 241025
159765Sjlemon#-
259765Sjlemon# Copyright (c) 1992, 1993
359765Sjlemon#	The Regents of the University of California.  All rights reserved.
459765Sjlemon#
559765Sjlemon# Redistribution and use in source and binary forms, with or without
659765Sjlemon# modification, are permitted provided that the following conditions
759765Sjlemon# are met:
859765Sjlemon# 1. Redistributions of source code must retain the above copyright
959765Sjlemon#    notice, this list of conditions and the following disclaimer.
1059765Sjlemon# 2. Redistributions in binary form must reproduce the above copyright
1159765Sjlemon#    notice, this list of conditions and the following disclaimer in the
1259765Sjlemon#    documentation and/or other materials provided with the distribution.
1359765Sjlemon# 4. Neither the name of the University nor the names of its contributors
1459765Sjlemon#    may be used to endorse or promote products derived from this software
1559765Sjlemon#    without specific prior written permission.
1659765Sjlemon#
1759765Sjlemon# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
1859765Sjlemon# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1959765Sjlemon# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2059765Sjlemon# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2159765Sjlemon# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2259765Sjlemon# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2359765Sjlemon# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2459765Sjlemon# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2559765Sjlemon# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2684221Sdillon# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2784221Sdillon# SUCH DAMAGE.
2884221Sdillon#
2984221Sdillon#	@(#)vnode_if.src	8.12 (Berkeley) 5/14/95
3059765Sjlemon# $FreeBSD: head/sys/kern/vnode_if.src 241025 2012-09-28 11:25:02Z kib $
3159765Sjlemon#
3259765Sjlemon
3359765Sjlemon#
3459765Sjlemon# Above each of the vop descriptors in lines starting with %%
3559765Sjlemon# is a specification of the locking protocol used by each vop call.
3659765Sjlemon# The first column is the name of the variable, the remaining three
3759765Sjlemon# columns are in, out and error respectively.  The "in" column defines
3859765Sjlemon# the lock state on input, the "out" column defines the state on succesful
3959765Sjlemon# return, and the "error" column defines the locking state on error exit.
4059765Sjlemon#
4159765Sjlemon# The locking value can take the following values:
4259765Sjlemon# L: locked; not converted to type of lock.
4359765Sjlemon# A: any lock type.
4459765Sjlemon# S: locked with shared lock.
4559765Sjlemon# E: locked with exclusive lock for this process.
4659765Sjlemon# O: locked with exclusive lock for other process.
4759765Sjlemon# U: unlocked.
4859765Sjlemon# -: not applicable.  vnode does not yet (or no longer) exists.
4959765Sjlemon# =: the same on input and output, may be either L or U.
5059765Sjlemon# X: locked if not nil.
5159765Sjlemon#
5259765Sjlemon# The paramater named "vpp" is assumed to be always used with double
5359765Sjlemon# indirection (**vpp) and that name is hard-coded in vnode_if.awk !
5459765Sjlemon#
5559765Sjlemon# Lines starting with %! specify a pre or post-condition function
5659765Sjlemon# to call before/after the vop call.
5759765Sjlemon#
5859765Sjlemon# If other such parameters are introduced, they have to be added to
5959765Sjlemon# the AWK script at the head of the definition of "add_debug_code()".
6059765Sjlemon#
6159765Sjlemon
6259765Sjlemonvop_islocked {
6359765Sjlemon	IN struct vnode *vp;
6459765Sjlemon};
6559765Sjlemon
6659765Sjlemon%% lookup	dvp	L ? ?
6759765Sjlemon%% lookup	vpp	- L -
6859765Sjlemon%! lookup	pre	vop_lookup_pre
6959765Sjlemon%! lookup	post	vop_lookup_post
7059765Sjlemon
7159765Sjlemon# XXX - the lookup locking protocol defies simple description and depends
7259765Sjlemon#	on the flags and operation fields in the (cnp) structure.  Note
7359765Sjlemon#	especially that *vpp may equal dvp and both may be locked.
7459765Sjlemon
7559765Sjlemonvop_lookup {
7659765Sjlemon	IN struct vnode *dvp;
7759765Sjlemon	INOUT struct vnode **vpp;
7859765Sjlemon	IN struct componentname *cnp;
7959765Sjlemon};
8059765Sjlemon
8159765Sjlemon%% cachedlookup	dvp	L ? ?
8259765Sjlemon%% cachedlookup	vpp	- L -
8359765Sjlemon
8459765Sjlemon# This must be an exact copy of lookup.  See kern/vfs_cache.c for details.
8559765Sjlemon
8659765Sjlemonvop_cachedlookup {
8759765Sjlemon	IN struct vnode *dvp;
8859765Sjlemon	INOUT struct vnode **vpp;
8959765Sjlemon	IN struct componentname *cnp;
9059765Sjlemon};
9159765Sjlemon
9259765Sjlemon%% create	dvp	E E E
9359765Sjlemon%% create	vpp	- L -
9459765Sjlemon%! create	post	vop_create_post
9559765Sjlemon
9659765Sjlemonvop_create {
9759765Sjlemon	IN struct vnode *dvp;
9859765Sjlemon	OUT struct vnode **vpp;
9959765Sjlemon	IN struct componentname *cnp;
10059765Sjlemon	IN struct vattr *vap;
10159765Sjlemon};
10259765Sjlemon
10359765Sjlemon
10459765Sjlemon%% whiteout	dvp	E E E
10559765Sjlemon
10659765Sjlemonvop_whiteout {
10759765Sjlemon	IN struct vnode *dvp;
10859765Sjlemon	IN struct componentname *cnp;
10959765Sjlemon	IN int flags;
11059765Sjlemon};
11159765Sjlemon
11259765Sjlemon
11359765Sjlemon%% mknod	dvp	E E E
11459765Sjlemon%% mknod	vpp	- L -
11559765Sjlemon%! mknod	post	vop_mknod_post
11659765Sjlemon
11759765Sjlemonvop_mknod {
11859765Sjlemon	IN struct vnode *dvp;
11959765Sjlemon	OUT struct vnode **vpp;
12059765Sjlemon	IN struct componentname *cnp;
12159765Sjlemon	IN struct vattr *vap;
12259765Sjlemon};
12359765Sjlemon
12459765Sjlemon
12559765Sjlemon%% open		vp	L L L
12659765Sjlemon
12759765Sjlemonvop_open {
12859765Sjlemon	IN struct vnode *vp;
12959765Sjlemon	IN int mode;
13059765Sjlemon	IN struct ucred *cred;
13159765Sjlemon	IN struct thread *td;
13259765Sjlemon	IN struct file *fp;
13359765Sjlemon};
13459765Sjlemon
13559765Sjlemon
13659765Sjlemon%% close	vp	L L L
13759765Sjlemon
13859765Sjlemonvop_close {
13959765Sjlemon	IN struct vnode *vp;
14059765Sjlemon	IN int fflag;
14159765Sjlemon	IN struct ucred *cred;
14259765Sjlemon	IN struct thread *td;
14359765Sjlemon};
14459765Sjlemon
14559765Sjlemon
14659765Sjlemon%% access	vp	L L L
14759765Sjlemon
14859765Sjlemonvop_access {
14959765Sjlemon	IN struct vnode *vp;
15059765Sjlemon	IN accmode_t accmode;
15159765Sjlemon	IN struct ucred *cred;
15259765Sjlemon	IN struct thread *td;
15359765Sjlemon};
15459765Sjlemon
15559765Sjlemon
15659765Sjlemon%% accessx	vp	L L L
15759765Sjlemon
15859765Sjlemonvop_accessx {
15959765Sjlemon	IN struct vnode *vp;
16059765Sjlemon	IN accmode_t accmode;
16159765Sjlemon	IN struct ucred *cred;
16259765Sjlemon	IN struct thread *td;
16359765Sjlemon};
16459765Sjlemon
16559765Sjlemon
16659765Sjlemon%% getattr	vp	L L L
16759765Sjlemon
16859765Sjlemonvop_getattr {
16959765Sjlemon	IN struct vnode *vp;
17059765Sjlemon	OUT struct vattr *vap;
17159765Sjlemon	IN struct ucred *cred;
17259765Sjlemon};
17359765Sjlemon
17459765Sjlemon
17559765Sjlemon%% setattr	vp	E E E
17659765Sjlemon%! setattr	post	vop_setattr_post
17759765Sjlemon
17859765Sjlemonvop_setattr {
17959765Sjlemon	IN struct vnode *vp;
18059765Sjlemon	IN struct vattr *vap;
18159765Sjlemon	IN struct ucred *cred;
18259765Sjlemon};
18359765Sjlemon
18459765Sjlemon%% markatime	vp	L L L
18559765Sjlemon
18659765Sjlemonvop_markatime {
18759765Sjlemon	IN struct vnode *vp;
18859765Sjlemon};
18959765Sjlemon
19059765Sjlemon%% read		vp	L L L
19159765Sjlemon
19259765Sjlemonvop_read {
19359765Sjlemon	IN struct vnode *vp;
19459765Sjlemon	INOUT struct uio *uio;
19559765Sjlemon	IN int ioflag;
19659765Sjlemon	IN struct ucred *cred;
19759765Sjlemon};
19859765Sjlemon
19959765Sjlemon
20059765Sjlemon%% write	vp	L L L
20159765Sjlemon%! write	pre	VOP_WRITE_PRE
20259765Sjlemon%! write	post	VOP_WRITE_POST
20359765Sjlemon
20472093Sasmodaivop_write {
20559765Sjlemon	IN struct vnode *vp;
20659765Sjlemon	INOUT struct uio *uio;
20759765Sjlemon	IN int ioflag;
20859765Sjlemon	IN struct ucred *cred;
20959765Sjlemon};
21059765Sjlemon
21159765Sjlemon
21259765Sjlemon%% ioctl	vp	U U U
21359765Sjlemon
21459765Sjlemonvop_ioctl {
21559765Sjlemon	IN struct vnode *vp;
21659765Sjlemon	IN u_long command;
21759765Sjlemon	IN void *data;
21859765Sjlemon	IN int fflag;
21959765Sjlemon	IN struct ucred *cred;
22059765Sjlemon	IN struct thread *td;
22159765Sjlemon};
22259765Sjlemon
22359765Sjlemon
22459765Sjlemon%% poll		vp	U U U
22559765Sjlemon
22659765Sjlemonvop_poll {
22759765Sjlemon	IN struct vnode *vp;
22859765Sjlemon	IN int events;
22959765Sjlemon	IN struct ucred *cred;
23059765Sjlemon	IN struct thread *td;
23159765Sjlemon};
23259765Sjlemon
23359765Sjlemon
23459765Sjlemon%% kqfilter	vp	U U U
23559765Sjlemon
23659765Sjlemonvop_kqfilter {
23759765Sjlemon	IN struct vnode *vp;
23859765Sjlemon	IN struct knote *kn;
23959765Sjlemon};
24059765Sjlemon
24159765Sjlemon
24259765Sjlemon%% revoke	vp	L L L
24359765Sjlemon
24459765Sjlemonvop_revoke {
24559765Sjlemon	IN struct vnode *vp;
24659765Sjlemon	IN int flags;
24759765Sjlemon};
24859765Sjlemon
24959765Sjlemon
25059765Sjlemon%% fsync	vp	L L L
25159765Sjlemon
25259765Sjlemonvop_fsync {
25359765Sjlemon	IN struct vnode *vp;
25459765Sjlemon	IN int waitfor;
25559765Sjlemon	IN struct thread *td;
25659765Sjlemon};
25759765Sjlemon
25859765Sjlemon
25959765Sjlemon%% remove	dvp	E E E
26059765Sjlemon%% remove	vp	E E E
26159765Sjlemon%! remove	post	vop_remove_post
26259765Sjlemon
26359765Sjlemonvop_remove {
26459765Sjlemon	IN struct vnode *dvp;
26559765Sjlemon	IN struct vnode *vp;
26659765Sjlemon	IN struct componentname *cnp;
26759765Sjlemon};
26859765Sjlemon
26959765Sjlemon
27059765Sjlemon%% link		tdvp	E E E
27159765Sjlemon%% link		vp	E E E
27259765Sjlemon%! link		post	vop_link_post
27359765Sjlemon
27459765Sjlemonvop_link {
27559765Sjlemon	IN struct vnode *tdvp;
27659765Sjlemon	IN struct vnode *vp;
27759765Sjlemon	IN struct componentname *cnp;
27859765Sjlemon};
27959765Sjlemon
28059765Sjlemon
28159765Sjlemon%! rename	pre	vop_rename_pre
28259765Sjlemon%! rename	post	vop_rename_post
28359765Sjlemon
28459765Sjlemonvop_rename {
28559765Sjlemon	IN WILLRELE struct vnode *fdvp;
28659765Sjlemon	IN WILLRELE struct vnode *fvp;
28759765Sjlemon	IN struct componentname *fcnp;
28859765Sjlemon	IN WILLRELE struct vnode *tdvp;
28959765Sjlemon	IN WILLRELE struct vnode *tvp;
29059765Sjlemon	IN struct componentname *tcnp;
29159765Sjlemon};
29259765Sjlemon
29359765Sjlemon
29459765Sjlemon%% mkdir	dvp	E E E
29559765Sjlemon%% mkdir	vpp	- E -
29659765Sjlemon%! mkdir	post	vop_mkdir_post
29759765Sjlemon
29859765Sjlemonvop_mkdir {
29959765Sjlemon	IN struct vnode *dvp;
30059765Sjlemon	OUT struct vnode **vpp;
30159765Sjlemon	IN struct componentname *cnp;
30259765Sjlemon	IN struct vattr *vap;
30359765Sjlemon};
30459765Sjlemon
30559765Sjlemon
30659765Sjlemon%% rmdir	dvp	E E E
30759765Sjlemon%% rmdir	vp	E E E
30859765Sjlemon%! rmdir	post	vop_rmdir_post
30959765Sjlemon
31059765Sjlemonvop_rmdir {
31159765Sjlemon	IN struct vnode *dvp;
31259765Sjlemon	IN struct vnode *vp;
31359765Sjlemon	IN struct componentname *cnp;
31459765Sjlemon};
31559765Sjlemon
31659765Sjlemon
31759765Sjlemon%% symlink	dvp	E E E
31859765Sjlemon%% symlink	vpp	- E -
31959765Sjlemon%! symlink	post	vop_symlink_post
32059765Sjlemon
32159765Sjlemonvop_symlink {
32259765Sjlemon	IN struct vnode *dvp;
32359765Sjlemon	OUT struct vnode **vpp;
32459765Sjlemon	IN struct componentname *cnp;
32559765Sjlemon	IN struct vattr *vap;
32659765Sjlemon	IN char *target;
32759765Sjlemon};
32859765Sjlemon
32959765Sjlemon
33059765Sjlemon%% readdir	vp	L L L
33159765Sjlemon
33259765Sjlemonvop_readdir {
33359765Sjlemon	IN struct vnode *vp;
33459765Sjlemon	INOUT struct uio *uio;
33559765Sjlemon	IN struct ucred *cred;
33659765Sjlemon	INOUT int *eofflag;
33759765Sjlemon	OUT int *ncookies;
33859765Sjlemon	INOUT u_long **cookies;
33959765Sjlemon};
34059765Sjlemon
34159765Sjlemon
34259765Sjlemon%% readlink	vp	L L L
34359765Sjlemon
34459765Sjlemonvop_readlink {
34559765Sjlemon	IN struct vnode *vp;
34659765Sjlemon	INOUT struct uio *uio;
34759765Sjlemon	IN struct ucred *cred;
34859765Sjlemon};
34959765Sjlemon
35059765Sjlemon
35159765Sjlemon%% inactive	vp	E E E
35259765Sjlemon
35359765Sjlemonvop_inactive {
35459765Sjlemon	IN struct vnode *vp;
35559765Sjlemon	IN struct thread *td;
356276079Sian};
35759765Sjlemon
358298230Sallanjude
35959765Sjlemon%% reclaim	vp	E E E
36059765Sjlemon
36159765Sjlemonvop_reclaim {
36259765Sjlemon	IN struct vnode *vp;
36359765Sjlemon	IN struct thread *td;
36459765Sjlemon};
36559765Sjlemon
36659765Sjlemon
36759765Sjlemon%! lock1	pre	vop_lock_pre
36859765Sjlemon%! lock1	post	vop_lock_post
36959765Sjlemon
37059765Sjlemonvop_lock1 {
37159765Sjlemon	IN struct vnode *vp;
37259765Sjlemon	IN int flags;
37359765Sjlemon	IN char *file;
37459765Sjlemon	IN int line;
37559765Sjlemon};
37659765Sjlemon
37759765Sjlemon
37859765Sjlemon%! unlock	pre	vop_unlock_pre
37959765Sjlemon%! unlock	post	vop_unlock_post
38059765Sjlemon
38159765Sjlemonvop_unlock {
38259765Sjlemon	IN struct vnode *vp;
38359765Sjlemon	IN int flags;
38459765Sjlemon};
38559765Sjlemon
38659765Sjlemon
38759765Sjlemon%% bmap		vp	L L L
38859765Sjlemon
38959765Sjlemonvop_bmap {
39059765Sjlemon	IN struct vnode *vp;
39159765Sjlemon	IN daddr_t bn;
39259765Sjlemon	OUT struct bufobj **bop;
39359765Sjlemon	IN daddr_t *bnp;
39459765Sjlemon	OUT int *runp;
39559765Sjlemon	OUT int *runb;
39659765Sjlemon};
39759765Sjlemon
398276079Sian
39959765Sjlemon%% strategy	vp	L L L
400298230Sallanjude%! strategy	pre	vop_strategy_pre
40159765Sjlemon
40259765Sjlemonvop_strategy {
40359765Sjlemon	IN struct vnode *vp;
40459765Sjlemon	IN struct buf *bp;
40559765Sjlemon};
40659765Sjlemon
40759765Sjlemon
40859765Sjlemon%% getwritemount vp	= = =
40959765Sjlemon
41059765Sjlemonvop_getwritemount {
41159765Sjlemon	IN struct vnode *vp;
41259765Sjlemon	OUT struct mount **mpp;
41359765Sjlemon};
41459765Sjlemon
41559765Sjlemon
41659765Sjlemon%% print	vp	- - -
41759765Sjlemon
41859765Sjlemonvop_print {
41959765Sjlemon	IN struct vnode *vp;
42059765Sjlemon};
42159765Sjlemon
42259765Sjlemon
42359765Sjlemon%% pathconf	vp	L L L
42459765Sjlemon
42559765Sjlemonvop_pathconf {
42659765Sjlemon	IN struct vnode *vp;
42759765Sjlemon	IN int name;
42859765Sjlemon	OUT register_t *retval;
42959765Sjlemon};
43059765Sjlemon
43159765Sjlemon
43259765Sjlemon%% advlock	vp	U U U
43359765Sjlemon
43459765Sjlemonvop_advlock {
43559765Sjlemon	IN struct vnode *vp;
43659765Sjlemon	IN void *id;
43759765Sjlemon	IN int op;
43859765Sjlemon	IN struct flock *fl;
43959765Sjlemon	IN int flags;
44059765Sjlemon};
44159765Sjlemon
44259765Sjlemon
44359765Sjlemon%% advlockasync	vp	U U U
44459765Sjlemon
44559765Sjlemonvop_advlockasync {
44659765Sjlemon	IN struct vnode *vp;
44759765Sjlemon	IN void *id;
44859765Sjlemon	IN int op;
44959765Sjlemon	IN struct flock *fl;
45059765Sjlemon	IN int flags;
45159765Sjlemon	IN struct task *task;	
45259765Sjlemon	INOUT void **cookiep;
45359765Sjlemon};
45459765Sjlemon
45559765Sjlemon
45659765Sjlemon%% advlockpurge	vp	E E E
45759765Sjlemon
45859765Sjlemonvop_advlockpurge {
45959765Sjlemon	IN struct vnode *vp;
46059765Sjlemon};
46159765Sjlemon
46259765Sjlemon
46359765Sjlemon%% reallocblks	vp	E E E
46459765Sjlemon
46559765Sjlemonvop_reallocblks {
46659765Sjlemon	IN struct vnode *vp;
46759765Sjlemon	IN struct cluster_save *buflist;
46859765Sjlemon};
46959765Sjlemon
47059765Sjlemon
47159765Sjlemon%% getpages	vp	L L L
47259765Sjlemon
47359765Sjlemonvop_getpages {
47459765Sjlemon	IN struct vnode *vp;
47559765Sjlemon	IN vm_page_t *m;
47659765Sjlemon	IN int count;
47759765Sjlemon	IN int reqpage;
47859765Sjlemon	IN vm_ooffset_t offset;
47959765Sjlemon};
48059765Sjlemon
48159765Sjlemon
48259765Sjlemon%% putpages	vp	E E E
48359765Sjlemon
48459765Sjlemonvop_putpages {
48559765Sjlemon	IN struct vnode *vp;
48659765Sjlemon	IN vm_page_t *m;
48759765Sjlemon	IN int count;
48859765Sjlemon	IN int sync;
48959765Sjlemon	IN int *rtvals;
49059765Sjlemon	IN vm_ooffset_t offset;
49159765Sjlemon};
49259765Sjlemon
49359765Sjlemon
49459765Sjlemon%% getacl	vp	L L L
49559765Sjlemon
49659765Sjlemonvop_getacl {
49759765Sjlemon	IN struct vnode *vp;
49859765Sjlemon	IN acl_type_t type;
49959765Sjlemon	OUT struct acl *aclp;
50059765Sjlemon	IN struct ucred *cred;
50159765Sjlemon	IN struct thread *td;
50259765Sjlemon};
50359765Sjlemon
50459765Sjlemon
50559765Sjlemon%% setacl	vp	E E E
50659765Sjlemon
50759765Sjlemonvop_setacl {
50859765Sjlemon	IN struct vnode *vp;
50959765Sjlemon	IN acl_type_t type;
510276079Sian	IN struct acl *aclp;
51159765Sjlemon	IN struct ucred *cred;
512298230Sallanjude	IN struct thread *td;
51359765Sjlemon};
51459765Sjlemon
51559765Sjlemon
51659765Sjlemon%% aclcheck	vp	= = =
51759765Sjlemon
51859765Sjlemonvop_aclcheck {
51959765Sjlemon	IN struct vnode *vp;
52059765Sjlemon	IN acl_type_t type;
52159765Sjlemon	IN struct acl *aclp;
52259765Sjlemon	IN struct ucred *cred;
52359765Sjlemon	IN struct thread *td;
52459765Sjlemon};
52559765Sjlemon
52659765Sjlemon
52759765Sjlemon%% closeextattr	vp	L L L
52859765Sjlemon
52959765Sjlemonvop_closeextattr {
53059765Sjlemon	IN struct vnode *vp;
53159765Sjlemon	IN int commit;
53259765Sjlemon	IN struct ucred *cred;
53359765Sjlemon	IN struct thread *td;
53459765Sjlemon};
53559765Sjlemon
53659765Sjlemon
53759765Sjlemon%% getextattr	vp	L L L
53859765Sjlemon
539251561Spfgvop_getextattr {
54059765Sjlemon	IN struct vnode *vp;
54159765Sjlemon	IN int attrnamespace;
54259765Sjlemon	IN const char *name;
54359765Sjlemon	INOUT struct uio *uio;
54459765Sjlemon	OUT size_t *size;
54559765Sjlemon	IN struct ucred *cred;
54659765Sjlemon	IN struct thread *td;
54759765Sjlemon};
54859765Sjlemon
54959765Sjlemon
55059765Sjlemon%% listextattr	vp	L L L
55159765Sjlemon
55259765Sjlemonvop_listextattr {
55359765Sjlemon	IN struct vnode *vp;
55459765Sjlemon	IN int attrnamespace;
55559765Sjlemon	INOUT struct uio *uio;
55659765Sjlemon	OUT size_t *size;
55759765Sjlemon	IN struct ucred *cred;
55859765Sjlemon	IN struct thread *td;
55959765Sjlemon};
56059765Sjlemon
56159765Sjlemon
56259765Sjlemon%% openextattr	vp	L L L
56359765Sjlemon
56459765Sjlemonvop_openextattr {
56559765Sjlemon	IN struct vnode *vp;
56659765Sjlemon	IN struct ucred *cred;
56759765Sjlemon	IN struct thread *td;
56859765Sjlemon};
56959765Sjlemon
57059765Sjlemon
571276079Sian%% deleteextattr	vp	E E E
57259765Sjlemon%! deleteextattr	post	vop_deleteextattr_post
573298230Sallanjude
57459765Sjlemonvop_deleteextattr {
57559765Sjlemon	IN struct vnode *vp;
57659765Sjlemon	IN int attrnamespace;
57759765Sjlemon	IN const char *name;
57859765Sjlemon	IN struct ucred *cred;
57959765Sjlemon	IN struct thread *td;
58059765Sjlemon};
58159765Sjlemon
58259765Sjlemon
58359765Sjlemon%% setextattr	vp	E E E
58459765Sjlemon%! setextattr	post	vop_setextattr_post
58559765Sjlemon
58659765Sjlemonvop_setextattr {
58759765Sjlemon	IN struct vnode *vp;
588251561Spfg	IN int attrnamespace;
58959765Sjlemon	IN const char *name;
59059765Sjlemon	INOUT struct uio *uio;
59159765Sjlemon	IN struct ucred *cred;
59259765Sjlemon	IN struct thread *td;
59359765Sjlemon};
59459765Sjlemon
59559765Sjlemon
59659765Sjlemon%% setlabel	vp	E E E
59759765Sjlemon
59859765Sjlemonvop_setlabel {
59959765Sjlemon	IN struct vnode *vp;
60059765Sjlemon	IN struct label *label;
60159765Sjlemon	IN struct ucred *cred;
60259765Sjlemon	IN struct thread *td;
60359765Sjlemon};
60459765Sjlemon
60596941Siedowse
60659765Sjlemon%% vptofh	vp	= = =
60759765Sjlemon
60859765Sjlemonvop_vptofh {
60959765Sjlemon	IN struct vnode *vp;
61059765Sjlemon	IN struct fid *fhp;
61159765Sjlemon};
61259765Sjlemon
61359765Sjlemon
61459765Sjlemon%% vptocnp		vp	L L L
61559765Sjlemon%% vptocnp		vpp	- U -
61659765Sjlemon
61759765Sjlemonvop_vptocnp {
61859765Sjlemon	IN struct vnode *vp;
61959765Sjlemon	OUT struct vnode **vpp;
62059765Sjlemon	IN struct ucred *cred;
62159765Sjlemon	INOUT char *buf;
62259765Sjlemon	INOUT int *buflen;
62359765Sjlemon};
62459765Sjlemon
62559765Sjlemon
62659765Sjlemon%% allocate	vp	E E E
62759765Sjlemon
62859765Sjlemonvop_allocate {
62959765Sjlemon	IN struct vnode *vp;
63059765Sjlemon	INOUT off_t *offset;
63159765Sjlemon	INOUT off_t *len;
63259765Sjlemon};
63359765Sjlemon
63459765Sjlemon%% advise	vp	U U U
63559765Sjlemon
63659765Sjlemonvop_advise {
63759765Sjlemon	IN struct vnode *vp;
63859765Sjlemon	IN off_t start;
63959765Sjlemon	IN off_t end;
64059765Sjlemon	IN int advice;
64159765Sjlemon};
64259765Sjlemon
64359765Sjlemon%% unp_bind	vp	E E E
64459765Sjlemon
64559765Sjlemonvop_unp_bind {
64659765Sjlemon	IN struct vnode *vp;
64759765Sjlemon	IN struct socket *socket;
64859765Sjlemon};
64959765Sjlemon
65059765Sjlemon%% unp_connect	vp	L L L
65159765Sjlemon
65259765Sjlemonvop_unp_connect {
65359765Sjlemon	IN struct vnode *vp;
65459765Sjlemon	OUT struct socket **socket;
65559765Sjlemon};
65659765Sjlemon
65759765Sjlemon%% unp_detach	vp	= = =
65859765Sjlemon
65959765Sjlemonvop_unp_detach {
66059765Sjlemon	IN struct vnode *vp;
66159765Sjlemon};
66259765Sjlemon
66359765Sjlemon%% is_text	vp	L L L
66459765Sjlemon
66559765Sjlemonvop_is_text {
66659765Sjlemon	IN struct vnode *vp;
66759765Sjlemon};
668276079Sian
66959765Sjlemon%% set_text	vp	E E E
670298230Sallanjude
67159765Sjlemonvop_set_text {
67259765Sjlemon	IN struct vnode *vp;
67359765Sjlemon};
67459765Sjlemon
67559765Sjlemon%% vop_unset_text	vp	E E E
67659765Sjlemon
67759765Sjlemonvop_unset_text {
67859765Sjlemon	IN struct vnode *vp;
67996941Siedowse};
68059765Sjlemon
68159765Sjlemon# The VOPs below are spares at the end of the table to allow new VOPs to be
68259765Sjlemon# added in stable branches without breaking the KBI.  New VOPs in HEAD should
68359765Sjlemon# be added above these spares.  When merging a new VOP to a stable branch,
68459765Sjlemon# the new VOP should replace one of the spares.
68559765Sjlemon
68659765Sjlemonvop_spare1 {
68759765Sjlemon	IN struct vnode *vp;
68859765Sjlemon};
68959765Sjlemon
69059765Sjlemonvop_spare2 {
69159765Sjlemon	IN struct vnode *vp;
69259765Sjlemon};
69359765Sjlemon
69459765Sjlemonvop_spare3 {
69559765Sjlemon	IN struct vnode *vp;
69659765Sjlemon};
69759765Sjlemon
69859765Sjlemonvop_spare4 {
69959765Sjlemon	IN struct vnode *vp;
70059765Sjlemon};
70159765Sjlemon
70259765Sjlemonvop_spare5 {
70359765Sjlemon	IN struct vnode *vp;
70459765Sjlemon};
70559765Sjlemon