xref: /f-stack/freebsd/kern/vnode_if.src (revision 22ce4aff)
1a9643ea8Slogwang#-
2a9643ea8Slogwang# Copyright (c) 1992, 1993
3a9643ea8Slogwang#	The Regents of the University of California.  All rights reserved.
4a9643ea8Slogwang#
5a9643ea8Slogwang# Redistribution and use in source and binary forms, with or without
6a9643ea8Slogwang# modification, are permitted provided that the following conditions
7a9643ea8Slogwang# are met:
8a9643ea8Slogwang# 1. Redistributions of source code must retain the above copyright
9a9643ea8Slogwang#    notice, this list of conditions and the following disclaimer.
10a9643ea8Slogwang# 2. Redistributions in binary form must reproduce the above copyright
11a9643ea8Slogwang#    notice, this list of conditions and the following disclaimer in the
12a9643ea8Slogwang#    documentation and/or other materials provided with the distribution.
13*22ce4affSfengbojiang# 3. Neither the name of the University nor the names of its contributors
14a9643ea8Slogwang#    may be used to endorse or promote products derived from this software
15a9643ea8Slogwang#    without specific prior written permission.
16a9643ea8Slogwang#
17a9643ea8Slogwang# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18a9643ea8Slogwang# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19a9643ea8Slogwang# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20a9643ea8Slogwang# ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21a9643ea8Slogwang# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22a9643ea8Slogwang# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23a9643ea8Slogwang# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24a9643ea8Slogwang# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25a9643ea8Slogwang# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26a9643ea8Slogwang# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27a9643ea8Slogwang# SUCH DAMAGE.
28a9643ea8Slogwang#
29a9643ea8Slogwang#	@(#)vnode_if.src	8.12 (Berkeley) 5/14/95
30a9643ea8Slogwang# $FreeBSD$
31a9643ea8Slogwang#
32a9643ea8Slogwang
33a9643ea8Slogwang#
34a9643ea8Slogwang# Above each of the vop descriptors in lines starting with %%
35a9643ea8Slogwang# is a specification of the locking protocol used by each vop call.
36a9643ea8Slogwang# The first column is the name of the variable, the remaining three
37a9643ea8Slogwang# columns are in, out and error respectively.  The "in" column defines
38a9643ea8Slogwang# the lock state on input, the "out" column defines the state on successful
39a9643ea8Slogwang# return, and the "error" column defines the locking state on error exit.
40a9643ea8Slogwang#
41a9643ea8Slogwang# The locking value can take the following values:
42a9643ea8Slogwang# L: locked; not converted to type of lock.
43a9643ea8Slogwang# E: locked with exclusive lock for this process.
44a9643ea8Slogwang# U: unlocked.
45a9643ea8Slogwang# -: not applicable.  vnode does not yet (or no longer) exists.
46a9643ea8Slogwang# =: the same on input and output, may be either L or U.
47a9643ea8Slogwang#
48a9643ea8Slogwang# The paramater named "vpp" is assumed to be always used with double
49a9643ea8Slogwang# indirection (**vpp) and that name is hard-coded in vnode_if.awk !
50a9643ea8Slogwang#
51a9643ea8Slogwang# Lines starting with %! specify a pre or post-condition function
52a9643ea8Slogwang# to call before/after the vop call.
53a9643ea8Slogwang#
54a9643ea8Slogwang# If other such parameters are introduced, they have to be added to
55a9643ea8Slogwang# the AWK script at the head of the definition of "add_debug_code()".
56a9643ea8Slogwang#
57a9643ea8Slogwang
58a9643ea8Slogwangvop_islocked {
59a9643ea8Slogwang	IN struct vnode *vp;
60a9643ea8Slogwang};
61a9643ea8Slogwang
62*22ce4affSfengbojiang
63a9643ea8Slogwang%% lookup	dvp	L L L
64a9643ea8Slogwang%% lookup	vpp	- L -
65a9643ea8Slogwang
66a9643ea8Slogwang# XXX - the lookup locking protocol defies simple description and depends
67a9643ea8Slogwang#	on the flags and operation fields in the (cnp) structure.  Note
68a9643ea8Slogwang#	especially that *vpp may equal dvp and both may be locked.
69a9643ea8Slogwang
70a9643ea8Slogwangvop_lookup {
71a9643ea8Slogwang	IN struct vnode *dvp;
72a9643ea8Slogwang	INOUT struct vnode **vpp;
73a9643ea8Slogwang	IN struct componentname *cnp;
74a9643ea8Slogwang};
75a9643ea8Slogwang
76*22ce4affSfengbojiang
77a9643ea8Slogwang%% cachedlookup	dvp	L L L
78a9643ea8Slogwang%% cachedlookup	vpp	- L -
79a9643ea8Slogwang
80a9643ea8Slogwang# This must be an exact copy of lookup.  See kern/vfs_cache.c for details.
81a9643ea8Slogwang
82a9643ea8Slogwangvop_cachedlookup {
83a9643ea8Slogwang	IN struct vnode *dvp;
84a9643ea8Slogwang	INOUT struct vnode **vpp;
85a9643ea8Slogwang	IN struct componentname *cnp;
86a9643ea8Slogwang};
87a9643ea8Slogwang
88*22ce4affSfengbojiang
89a9643ea8Slogwang%% create	dvp	E E E
90a9643ea8Slogwang%% create	vpp	- L -
91*22ce4affSfengbojiang%! create	pre	vop_create_pre
92a9643ea8Slogwang%! create	post	vop_create_post
93a9643ea8Slogwang
94a9643ea8Slogwangvop_create {
95a9643ea8Slogwang	IN struct vnode *dvp;
96a9643ea8Slogwang	OUT struct vnode **vpp;
97a9643ea8Slogwang	IN struct componentname *cnp;
98a9643ea8Slogwang	IN struct vattr *vap;
99a9643ea8Slogwang};
100a9643ea8Slogwang
101a9643ea8Slogwang
102a9643ea8Slogwang%% whiteout	dvp	E E E
103*22ce4affSfengbojiang%! whiteout	pre	vop_whiteout_pre
104*22ce4affSfengbojiang%! whiteout	post	vop_whiteout_post
105a9643ea8Slogwang
106a9643ea8Slogwangvop_whiteout {
107a9643ea8Slogwang	IN struct vnode *dvp;
108a9643ea8Slogwang	IN struct componentname *cnp;
109a9643ea8Slogwang	IN int flags;
110a9643ea8Slogwang};
111a9643ea8Slogwang
112a9643ea8Slogwang
113a9643ea8Slogwang%% mknod	dvp	E E E
114a9643ea8Slogwang%% mknod	vpp	- L -
115*22ce4affSfengbojiang%! mknod	pre	vop_mknod_pre
116a9643ea8Slogwang%! mknod	post	vop_mknod_post
117a9643ea8Slogwang
118a9643ea8Slogwangvop_mknod {
119a9643ea8Slogwang	IN struct vnode *dvp;
120a9643ea8Slogwang	OUT struct vnode **vpp;
121a9643ea8Slogwang	IN struct componentname *cnp;
122a9643ea8Slogwang	IN struct vattr *vap;
123a9643ea8Slogwang};
124a9643ea8Slogwang
125a9643ea8Slogwang
126a9643ea8Slogwang%% open		vp	L L L
127a9643ea8Slogwang%! open		post	vop_open_post
128a9643ea8Slogwang
129a9643ea8Slogwangvop_open {
130a9643ea8Slogwang	IN struct vnode *vp;
131a9643ea8Slogwang	IN int mode;
132a9643ea8Slogwang	IN struct ucred *cred;
133a9643ea8Slogwang	IN struct thread *td;
134a9643ea8Slogwang	IN struct file *fp;
135a9643ea8Slogwang};
136a9643ea8Slogwang
137a9643ea8Slogwang
138a9643ea8Slogwang%% close	vp	L L L
139a9643ea8Slogwang%! close	post	vop_close_post
140a9643ea8Slogwang
141a9643ea8Slogwangvop_close {
142a9643ea8Slogwang	IN struct vnode *vp;
143a9643ea8Slogwang	IN int fflag;
144a9643ea8Slogwang	IN struct ucred *cred;
145a9643ea8Slogwang	IN struct thread *td;
146a9643ea8Slogwang};
147a9643ea8Slogwang
148a9643ea8Slogwang
149*22ce4affSfengbojiang%% fplookup_vexec	vp	- - -
150*22ce4affSfengbojiang%! fplookup_vexec	debugpre	vop_fplookup_vexec_debugpre
151*22ce4affSfengbojiang%! fplookup_vexec	debugpost	vop_fplookup_vexec_debugpost
152*22ce4affSfengbojiang
153*22ce4affSfengbojiangvop_fplookup_vexec {
154*22ce4affSfengbojiang	IN struct vnode *vp;
155*22ce4affSfengbojiang	IN struct ucred *cred;
156*22ce4affSfengbojiang};
157*22ce4affSfengbojiang
158*22ce4affSfengbojiang
159*22ce4affSfengbojiang%% fplookup_symlink	vp	- - -
160*22ce4affSfengbojiang%! fplookup_symlink	debugpre	vop_fplookup_symlink_debugpre
161*22ce4affSfengbojiang%! fplookup_symlink	debugpost	vop_fplookup_symlink_debugpost
162*22ce4affSfengbojiang
163*22ce4affSfengbojiangvop_fplookup_symlink {
164*22ce4affSfengbojiang	IN struct vnode *vp;
165*22ce4affSfengbojiang	IN struct cache_fpl *fpl;
166*22ce4affSfengbojiang};
167*22ce4affSfengbojiang
168*22ce4affSfengbojiang
169a9643ea8Slogwang%% access	vp	L L L
170a9643ea8Slogwang
171a9643ea8Slogwangvop_access {
172a9643ea8Slogwang	IN struct vnode *vp;
173a9643ea8Slogwang	IN accmode_t accmode;
174a9643ea8Slogwang	IN struct ucred *cred;
175a9643ea8Slogwang	IN struct thread *td;
176a9643ea8Slogwang};
177a9643ea8Slogwang
178a9643ea8Slogwang
179a9643ea8Slogwang%% accessx	vp	L L L
180a9643ea8Slogwang
181a9643ea8Slogwangvop_accessx {
182a9643ea8Slogwang	IN struct vnode *vp;
183a9643ea8Slogwang	IN accmode_t accmode;
184a9643ea8Slogwang	IN struct ucred *cred;
185a9643ea8Slogwang	IN struct thread *td;
186a9643ea8Slogwang};
187a9643ea8Slogwang
188a9643ea8Slogwang
189*22ce4affSfengbojiang%% stat	vp	L L L
190*22ce4affSfengbojiang
191*22ce4affSfengbojiangvop_stat {
192*22ce4affSfengbojiang	IN struct vnode *vp;
193*22ce4affSfengbojiang	OUT struct stat *sb;
194*22ce4affSfengbojiang	IN struct ucred *active_cred;
195*22ce4affSfengbojiang	IN struct ucred *file_cred;
196*22ce4affSfengbojiang	IN struct thread *td;
197*22ce4affSfengbojiang};
198*22ce4affSfengbojiang
199*22ce4affSfengbojiang
200a9643ea8Slogwang%% getattr	vp	L L L
201a9643ea8Slogwang
202a9643ea8Slogwangvop_getattr {
203a9643ea8Slogwang	IN struct vnode *vp;
204a9643ea8Slogwang	OUT struct vattr *vap;
205a9643ea8Slogwang	IN struct ucred *cred;
206a9643ea8Slogwang};
207a9643ea8Slogwang
208a9643ea8Slogwang
209a9643ea8Slogwang%% setattr	vp	E E E
210*22ce4affSfengbojiang%! setattr	pre	vop_setattr_pre
211a9643ea8Slogwang%! setattr	post	vop_setattr_post
212a9643ea8Slogwang
213a9643ea8Slogwangvop_setattr {
214a9643ea8Slogwang	IN struct vnode *vp;
215a9643ea8Slogwang	IN struct vattr *vap;
216a9643ea8Slogwang	IN struct ucred *cred;
217a9643ea8Slogwang};
218a9643ea8Slogwang
219a9643ea8Slogwang
220*22ce4affSfengbojiang%% mmapped	vp	L L L
221*22ce4affSfengbojiang
222*22ce4affSfengbojiangvop_mmapped {
223a9643ea8Slogwang	IN struct vnode *vp;
224a9643ea8Slogwang};
225a9643ea8Slogwang
226*22ce4affSfengbojiang
227a9643ea8Slogwang%% read		vp	L L L
228a9643ea8Slogwang%! read		post	vop_read_post
229a9643ea8Slogwang
230a9643ea8Slogwangvop_read {
231a9643ea8Slogwang	IN struct vnode *vp;
232a9643ea8Slogwang	INOUT struct uio *uio;
233a9643ea8Slogwang	IN int ioflag;
234a9643ea8Slogwang	IN struct ucred *cred;
235a9643ea8Slogwang};
236a9643ea8Slogwang
237a9643ea8Slogwang
238*22ce4affSfengbojiang%% read_pgcache	vp	- - -
239*22ce4affSfengbojiang%! read_pgcache	post	vop_read_pgcache_post
240*22ce4affSfengbojiang
241*22ce4affSfengbojiangvop_read_pgcache {
242*22ce4affSfengbojiang	IN struct vnode *vp;
243*22ce4affSfengbojiang	INOUT struct uio *uio;
244*22ce4affSfengbojiang	IN int ioflag;
245*22ce4affSfengbojiang	IN struct ucred *cred;
246*22ce4affSfengbojiang};
247*22ce4affSfengbojiang
248*22ce4affSfengbojiang
249a9643ea8Slogwang%% write	vp	L L L
250a9643ea8Slogwang%! write	pre	VOP_WRITE_PRE
251a9643ea8Slogwang%! write	post	VOP_WRITE_POST
252a9643ea8Slogwang
253a9643ea8Slogwangvop_write {
254a9643ea8Slogwang	IN struct vnode *vp;
255a9643ea8Slogwang	INOUT struct uio *uio;
256a9643ea8Slogwang	IN int ioflag;
257a9643ea8Slogwang	IN struct ucred *cred;
258a9643ea8Slogwang};
259a9643ea8Slogwang
260a9643ea8Slogwang
261a9643ea8Slogwang%% ioctl	vp	U U U
262a9643ea8Slogwang
263a9643ea8Slogwangvop_ioctl {
264a9643ea8Slogwang	IN struct vnode *vp;
265a9643ea8Slogwang	IN u_long command;
266a9643ea8Slogwang	IN void *data;
267a9643ea8Slogwang	IN int fflag;
268a9643ea8Slogwang	IN struct ucred *cred;
269a9643ea8Slogwang	IN struct thread *td;
270a9643ea8Slogwang};
271a9643ea8Slogwang
272a9643ea8Slogwang
273a9643ea8Slogwang%% poll		vp	U U U
274a9643ea8Slogwang
275a9643ea8Slogwangvop_poll {
276a9643ea8Slogwang	IN struct vnode *vp;
277a9643ea8Slogwang	IN int events;
278a9643ea8Slogwang	IN struct ucred *cred;
279a9643ea8Slogwang	IN struct thread *td;
280a9643ea8Slogwang};
281a9643ea8Slogwang
282a9643ea8Slogwang
283a9643ea8Slogwang%% kqfilter	vp	U U U
284a9643ea8Slogwang
285a9643ea8Slogwangvop_kqfilter {
286a9643ea8Slogwang	IN struct vnode *vp;
287a9643ea8Slogwang	IN struct knote *kn;
288a9643ea8Slogwang};
289a9643ea8Slogwang
290a9643ea8Slogwang
291a9643ea8Slogwang%% revoke	vp	L L L
292a9643ea8Slogwang
293a9643ea8Slogwangvop_revoke {
294a9643ea8Slogwang	IN struct vnode *vp;
295a9643ea8Slogwang	IN int flags;
296a9643ea8Slogwang};
297a9643ea8Slogwang
298a9643ea8Slogwang
299a9643ea8Slogwang%% fsync	vp	L L L
300a9643ea8Slogwang
301a9643ea8Slogwangvop_fsync {
302a9643ea8Slogwang	IN struct vnode *vp;
303a9643ea8Slogwang	IN int waitfor;
304a9643ea8Slogwang	IN struct thread *td;
305a9643ea8Slogwang};
306a9643ea8Slogwang
307a9643ea8Slogwang
308a9643ea8Slogwang%% remove	dvp	E E E
309a9643ea8Slogwang%% remove	vp	E E E
310*22ce4affSfengbojiang%! remove	pre	vop_remove_pre
311a9643ea8Slogwang%! remove	post	vop_remove_post
312a9643ea8Slogwang
313a9643ea8Slogwangvop_remove {
314a9643ea8Slogwang	IN struct vnode *dvp;
315a9643ea8Slogwang	IN struct vnode *vp;
316a9643ea8Slogwang	IN struct componentname *cnp;
317a9643ea8Slogwang};
318a9643ea8Slogwang
319a9643ea8Slogwang
320a9643ea8Slogwang%% link		tdvp	E E E
321a9643ea8Slogwang%% link		vp	E E E
322*22ce4affSfengbojiang%! link		pre	vop_link_pre
323a9643ea8Slogwang%! link		post	vop_link_post
324a9643ea8Slogwang
325a9643ea8Slogwangvop_link {
326a9643ea8Slogwang	IN struct vnode *tdvp;
327a9643ea8Slogwang	IN struct vnode *vp;
328a9643ea8Slogwang	IN struct componentname *cnp;
329a9643ea8Slogwang};
330a9643ea8Slogwang
331a9643ea8Slogwang
332a9643ea8Slogwang%! rename	pre	vop_rename_pre
333a9643ea8Slogwang%! rename	post	vop_rename_post
334a9643ea8Slogwang
335a9643ea8Slogwangvop_rename {
336a9643ea8Slogwang	IN WILLRELE struct vnode *fdvp;
337a9643ea8Slogwang	IN WILLRELE struct vnode *fvp;
338a9643ea8Slogwang	IN struct componentname *fcnp;
339a9643ea8Slogwang	IN WILLRELE struct vnode *tdvp;
340a9643ea8Slogwang	IN WILLRELE struct vnode *tvp;
341a9643ea8Slogwang	IN struct componentname *tcnp;
342a9643ea8Slogwang};
343a9643ea8Slogwang
344a9643ea8Slogwang
345a9643ea8Slogwang%% mkdir	dvp	E E E
346a9643ea8Slogwang%% mkdir	vpp	- E -
347*22ce4affSfengbojiang%! mkdir	pre	vop_mkdir_pre
348a9643ea8Slogwang%! mkdir	post	vop_mkdir_post
349*22ce4affSfengbojiang%! mkdir	debugpost vop_mkdir_debugpost
350a9643ea8Slogwang
351a9643ea8Slogwangvop_mkdir {
352a9643ea8Slogwang	IN struct vnode *dvp;
353a9643ea8Slogwang	OUT struct vnode **vpp;
354a9643ea8Slogwang	IN struct componentname *cnp;
355a9643ea8Slogwang	IN struct vattr *vap;
356a9643ea8Slogwang};
357a9643ea8Slogwang
358a9643ea8Slogwang
359a9643ea8Slogwang%% rmdir	dvp	E E E
360a9643ea8Slogwang%% rmdir	vp	E E E
361*22ce4affSfengbojiang%! rmdir	pre	vop_rmdir_pre
362a9643ea8Slogwang%! rmdir	post	vop_rmdir_post
363a9643ea8Slogwang
364a9643ea8Slogwangvop_rmdir {
365a9643ea8Slogwang	IN struct vnode *dvp;
366a9643ea8Slogwang	IN struct vnode *vp;
367a9643ea8Slogwang	IN struct componentname *cnp;
368a9643ea8Slogwang};
369a9643ea8Slogwang
370a9643ea8Slogwang
371a9643ea8Slogwang%% symlink	dvp	E E E
372a9643ea8Slogwang%% symlink	vpp	- E -
373*22ce4affSfengbojiang%! symlink	pre	vop_symlink_pre
374a9643ea8Slogwang%! symlink	post	vop_symlink_post
375a9643ea8Slogwang
376a9643ea8Slogwangvop_symlink {
377a9643ea8Slogwang	IN struct vnode *dvp;
378a9643ea8Slogwang	OUT struct vnode **vpp;
379a9643ea8Slogwang	IN struct componentname *cnp;
380a9643ea8Slogwang	IN struct vattr *vap;
381*22ce4affSfengbojiang	IN const char *target;
382a9643ea8Slogwang};
383a9643ea8Slogwang
384a9643ea8Slogwang
385a9643ea8Slogwang%% readdir	vp	L L L
386a9643ea8Slogwang%! readdir	post	vop_readdir_post
387a9643ea8Slogwang
388a9643ea8Slogwangvop_readdir {
389a9643ea8Slogwang	IN struct vnode *vp;
390a9643ea8Slogwang	INOUT struct uio *uio;
391a9643ea8Slogwang	IN struct ucred *cred;
392a9643ea8Slogwang	INOUT int *eofflag;
393a9643ea8Slogwang	OUT int *ncookies;
394a9643ea8Slogwang	INOUT u_long **cookies;
395a9643ea8Slogwang};
396a9643ea8Slogwang
397a9643ea8Slogwang
398a9643ea8Slogwang%% readlink	vp	L L L
399a9643ea8Slogwang
400a9643ea8Slogwangvop_readlink {
401a9643ea8Slogwang	IN struct vnode *vp;
402a9643ea8Slogwang	INOUT struct uio *uio;
403a9643ea8Slogwang	IN struct ucred *cred;
404a9643ea8Slogwang};
405a9643ea8Slogwang
406a9643ea8Slogwang
407a9643ea8Slogwang%% inactive	vp	E E E
408a9643ea8Slogwang
409a9643ea8Slogwangvop_inactive {
410a9643ea8Slogwang	IN struct vnode *vp;
411a9643ea8Slogwang};
412a9643ea8Slogwang
413*22ce4affSfengbojiang%! need_inactive	debugpre	vop_need_inactive_debugpre
414*22ce4affSfengbojiang%! need_inactive	debugpost	vop_need_inactive_debugpost
415*22ce4affSfengbojiang
416*22ce4affSfengbojiangvop_need_inactive {
417*22ce4affSfengbojiang        IN struct vnode *vp;
418*22ce4affSfengbojiang};
419a9643ea8Slogwang
420a9643ea8Slogwang%% reclaim	vp	E E E
421a9643ea8Slogwang%! reclaim	post	vop_reclaim_post
422a9643ea8Slogwang
423a9643ea8Slogwangvop_reclaim {
424a9643ea8Slogwang	IN struct vnode *vp;
425a9643ea8Slogwang};
426a9643ea8Slogwang
427a9643ea8Slogwang
428*22ce4affSfengbojiang%! lock1	debugpre	vop_lock_debugpre
429*22ce4affSfengbojiang%! lock1	debugpost	vop_lock_debugpost
430a9643ea8Slogwang
431a9643ea8Slogwangvop_lock1 {
432a9643ea8Slogwang	IN struct vnode *vp;
433a9643ea8Slogwang	IN int flags;
434*22ce4affSfengbojiang	IN const char *file;
435a9643ea8Slogwang	IN int line;
436a9643ea8Slogwang};
437a9643ea8Slogwang
438a9643ea8Slogwang
439*22ce4affSfengbojiang%! unlock	debugpre	vop_unlock_debugpre
440a9643ea8Slogwang
441a9643ea8Slogwangvop_unlock {
442a9643ea8Slogwang	IN struct vnode *vp;
443a9643ea8Slogwang};
444a9643ea8Slogwang
445a9643ea8Slogwang
446a9643ea8Slogwang%% bmap		vp	L L L
447a9643ea8Slogwang
448a9643ea8Slogwangvop_bmap {
449a9643ea8Slogwang	IN struct vnode *vp;
450a9643ea8Slogwang	IN daddr_t bn;
451a9643ea8Slogwang	OUT struct bufobj **bop;
452a9643ea8Slogwang	IN daddr_t *bnp;
453a9643ea8Slogwang	OUT int *runp;
454a9643ea8Slogwang	OUT int *runb;
455a9643ea8Slogwang};
456a9643ea8Slogwang
457a9643ea8Slogwang
458a9643ea8Slogwang%% strategy	vp	L L L
459*22ce4affSfengbojiang%! strategy	debugpre	vop_strategy_debugpre
460a9643ea8Slogwang
461a9643ea8Slogwangvop_strategy {
462a9643ea8Slogwang	IN struct vnode *vp;
463a9643ea8Slogwang	IN struct buf *bp;
464a9643ea8Slogwang};
465a9643ea8Slogwang
466a9643ea8Slogwang
467a9643ea8Slogwang%% getwritemount vp	= = =
468a9643ea8Slogwang
469a9643ea8Slogwangvop_getwritemount {
470a9643ea8Slogwang	IN struct vnode *vp;
471a9643ea8Slogwang	OUT struct mount **mpp;
472a9643ea8Slogwang};
473a9643ea8Slogwang
474a9643ea8Slogwang
475a9643ea8Slogwang%% print	vp	- - -
476a9643ea8Slogwang
477a9643ea8Slogwangvop_print {
478a9643ea8Slogwang	IN struct vnode *vp;
479a9643ea8Slogwang};
480a9643ea8Slogwang
481a9643ea8Slogwang
482a9643ea8Slogwang%% pathconf	vp	L L L
483a9643ea8Slogwang
484a9643ea8Slogwangvop_pathconf {
485a9643ea8Slogwang	IN struct vnode *vp;
486a9643ea8Slogwang	IN int name;
487*22ce4affSfengbojiang	OUT long *retval;
488a9643ea8Slogwang};
489a9643ea8Slogwang
490a9643ea8Slogwang
491a9643ea8Slogwang%% advlock	vp	U U U
492a9643ea8Slogwang
493a9643ea8Slogwangvop_advlock {
494a9643ea8Slogwang	IN struct vnode *vp;
495a9643ea8Slogwang	IN void *id;
496a9643ea8Slogwang	IN int op;
497a9643ea8Slogwang	IN struct flock *fl;
498a9643ea8Slogwang	IN int flags;
499a9643ea8Slogwang};
500a9643ea8Slogwang
501a9643ea8Slogwang
502a9643ea8Slogwang%% advlockasync	vp	U U U
503a9643ea8Slogwang
504a9643ea8Slogwangvop_advlockasync {
505a9643ea8Slogwang	IN struct vnode *vp;
506a9643ea8Slogwang	IN void *id;
507a9643ea8Slogwang	IN int op;
508a9643ea8Slogwang	IN struct flock *fl;
509a9643ea8Slogwang	IN int flags;
510a9643ea8Slogwang	IN struct task *task;
511a9643ea8Slogwang	INOUT void **cookiep;
512a9643ea8Slogwang};
513a9643ea8Slogwang
514a9643ea8Slogwang
515a9643ea8Slogwang%% advlockpurge	vp	E E E
516a9643ea8Slogwang
517a9643ea8Slogwangvop_advlockpurge {
518a9643ea8Slogwang	IN struct vnode *vp;
519a9643ea8Slogwang};
520a9643ea8Slogwang
521a9643ea8Slogwang
522a9643ea8Slogwang%% reallocblks	vp	E E E
523a9643ea8Slogwang
524a9643ea8Slogwangvop_reallocblks {
525a9643ea8Slogwang	IN struct vnode *vp;
526a9643ea8Slogwang	IN struct cluster_save *buflist;
527a9643ea8Slogwang};
528a9643ea8Slogwang
529a9643ea8Slogwang
530a9643ea8Slogwang%% getpages	vp	L L L
531a9643ea8Slogwang
532a9643ea8Slogwangvop_getpages {
533a9643ea8Slogwang	IN struct vnode *vp;
534a9643ea8Slogwang	IN vm_page_t *m;
535a9643ea8Slogwang	IN int count;
536a9643ea8Slogwang	IN int *rbehind;
537a9643ea8Slogwang	IN int *rahead;
538a9643ea8Slogwang};
539a9643ea8Slogwang
540a9643ea8Slogwang
541a9643ea8Slogwang%% getpages_async	vp	L L L
542a9643ea8Slogwang
543a9643ea8Slogwangvop_getpages_async {
544a9643ea8Slogwang	IN struct vnode *vp;
545a9643ea8Slogwang	IN vm_page_t *m;
546a9643ea8Slogwang	IN int count;
547a9643ea8Slogwang	IN int *rbehind;
548a9643ea8Slogwang	IN int *rahead;
549a9643ea8Slogwang	IN vop_getpages_iodone_t *iodone;
550a9643ea8Slogwang	IN void *arg;
551a9643ea8Slogwang};
552a9643ea8Slogwang
553a9643ea8Slogwang
554a9643ea8Slogwang%% putpages	vp	L L L
555a9643ea8Slogwang
556a9643ea8Slogwangvop_putpages {
557a9643ea8Slogwang	IN struct vnode *vp;
558a9643ea8Slogwang	IN vm_page_t *m;
559a9643ea8Slogwang	IN int count;
560a9643ea8Slogwang	IN int sync;
561a9643ea8Slogwang	IN int *rtvals;
562a9643ea8Slogwang};
563a9643ea8Slogwang
564a9643ea8Slogwang
565a9643ea8Slogwang%% getacl	vp	L L L
566a9643ea8Slogwang
567a9643ea8Slogwangvop_getacl {
568a9643ea8Slogwang	IN struct vnode *vp;
569a9643ea8Slogwang	IN acl_type_t type;
570a9643ea8Slogwang	OUT struct acl *aclp;
571a9643ea8Slogwang	IN struct ucred *cred;
572a9643ea8Slogwang	IN struct thread *td;
573a9643ea8Slogwang};
574a9643ea8Slogwang
575a9643ea8Slogwang
576a9643ea8Slogwang%% setacl	vp	E E E
577*22ce4affSfengbojiang%! setacl	pre	vop_setacl_pre
578*22ce4affSfengbojiang%! setacl	post	vop_setacl_post
579a9643ea8Slogwang
580a9643ea8Slogwangvop_setacl {
581a9643ea8Slogwang	IN struct vnode *vp;
582a9643ea8Slogwang	IN acl_type_t type;
583a9643ea8Slogwang	IN struct acl *aclp;
584a9643ea8Slogwang	IN struct ucred *cred;
585a9643ea8Slogwang	IN struct thread *td;
586a9643ea8Slogwang};
587a9643ea8Slogwang
588a9643ea8Slogwang
589a9643ea8Slogwang%% aclcheck	vp	= = =
590a9643ea8Slogwang
591a9643ea8Slogwangvop_aclcheck {
592a9643ea8Slogwang	IN struct vnode *vp;
593a9643ea8Slogwang	IN acl_type_t type;
594a9643ea8Slogwang	IN struct acl *aclp;
595a9643ea8Slogwang	IN struct ucred *cred;
596a9643ea8Slogwang	IN struct thread *td;
597a9643ea8Slogwang};
598a9643ea8Slogwang
599a9643ea8Slogwang
600a9643ea8Slogwang%% closeextattr	vp	L L L
601a9643ea8Slogwang
602a9643ea8Slogwangvop_closeextattr {
603a9643ea8Slogwang	IN struct vnode *vp;
604a9643ea8Slogwang	IN int commit;
605a9643ea8Slogwang	IN struct ucred *cred;
606a9643ea8Slogwang	IN struct thread *td;
607a9643ea8Slogwang};
608a9643ea8Slogwang
609a9643ea8Slogwang
610a9643ea8Slogwang%% getextattr	vp	L L L
611a9643ea8Slogwang
612a9643ea8Slogwangvop_getextattr {
613a9643ea8Slogwang	IN struct vnode *vp;
614a9643ea8Slogwang	IN int attrnamespace;
615a9643ea8Slogwang	IN const char *name;
616a9643ea8Slogwang	INOUT struct uio *uio;
617a9643ea8Slogwang	OUT size_t *size;
618a9643ea8Slogwang	IN struct ucred *cred;
619a9643ea8Slogwang	IN struct thread *td;
620a9643ea8Slogwang};
621a9643ea8Slogwang
622a9643ea8Slogwang
623a9643ea8Slogwang%% listextattr	vp	L L L
624a9643ea8Slogwang
625a9643ea8Slogwangvop_listextattr {
626a9643ea8Slogwang	IN struct vnode *vp;
627a9643ea8Slogwang	IN int attrnamespace;
628a9643ea8Slogwang	INOUT struct uio *uio;
629a9643ea8Slogwang	OUT size_t *size;
630a9643ea8Slogwang	IN struct ucred *cred;
631a9643ea8Slogwang	IN struct thread *td;
632a9643ea8Slogwang};
633a9643ea8Slogwang
634a9643ea8Slogwang
635a9643ea8Slogwang%% openextattr	vp	L L L
636a9643ea8Slogwang
637a9643ea8Slogwangvop_openextattr {
638a9643ea8Slogwang	IN struct vnode *vp;
639a9643ea8Slogwang	IN struct ucred *cred;
640a9643ea8Slogwang	IN struct thread *td;
641a9643ea8Slogwang};
642a9643ea8Slogwang
643a9643ea8Slogwang
644a9643ea8Slogwang%% deleteextattr	vp	E E E
645*22ce4affSfengbojiang%! deleteextattr	pre	vop_deleteextattr_pre
646a9643ea8Slogwang%! deleteextattr	post	vop_deleteextattr_post
647a9643ea8Slogwang
648a9643ea8Slogwangvop_deleteextattr {
649a9643ea8Slogwang	IN struct vnode *vp;
650a9643ea8Slogwang	IN int attrnamespace;
651a9643ea8Slogwang	IN const char *name;
652a9643ea8Slogwang	IN struct ucred *cred;
653a9643ea8Slogwang	IN struct thread *td;
654a9643ea8Slogwang};
655a9643ea8Slogwang
656a9643ea8Slogwang
657a9643ea8Slogwang%% setextattr	vp	E E E
658*22ce4affSfengbojiang%! setextattr	pre	vop_setextattr_pre
659a9643ea8Slogwang%! setextattr	post	vop_setextattr_post
660a9643ea8Slogwang
661a9643ea8Slogwangvop_setextattr {
662a9643ea8Slogwang	IN struct vnode *vp;
663a9643ea8Slogwang	IN int attrnamespace;
664a9643ea8Slogwang	IN const char *name;
665a9643ea8Slogwang	INOUT struct uio *uio;
666a9643ea8Slogwang	IN struct ucred *cred;
667a9643ea8Slogwang	IN struct thread *td;
668a9643ea8Slogwang};
669a9643ea8Slogwang
670a9643ea8Slogwang
671a9643ea8Slogwang%% setlabel	vp	E E E
672a9643ea8Slogwang
673a9643ea8Slogwangvop_setlabel {
674a9643ea8Slogwang	IN struct vnode *vp;
675a9643ea8Slogwang	IN struct label *label;
676a9643ea8Slogwang	IN struct ucred *cred;
677a9643ea8Slogwang	IN struct thread *td;
678a9643ea8Slogwang};
679a9643ea8Slogwang
680a9643ea8Slogwang
681a9643ea8Slogwang%% vptofh	vp	= = =
682a9643ea8Slogwang
683a9643ea8Slogwangvop_vptofh {
684a9643ea8Slogwang	IN struct vnode *vp;
685a9643ea8Slogwang	IN struct fid *fhp;
686a9643ea8Slogwang};
687a9643ea8Slogwang
688a9643ea8Slogwang
689a9643ea8Slogwang%% vptocnp		vp	L L L
690a9643ea8Slogwang%% vptocnp		vpp	- U -
691a9643ea8Slogwang
692a9643ea8Slogwangvop_vptocnp {
693a9643ea8Slogwang	IN struct vnode *vp;
694a9643ea8Slogwang	OUT struct vnode **vpp;
695a9643ea8Slogwang	INOUT char *buf;
696*22ce4affSfengbojiang	INOUT size_t *buflen;
697a9643ea8Slogwang};
698a9643ea8Slogwang
699a9643ea8Slogwang
700a9643ea8Slogwang%% allocate	vp	E E E
701a9643ea8Slogwang
702a9643ea8Slogwangvop_allocate {
703a9643ea8Slogwang	IN struct vnode *vp;
704a9643ea8Slogwang	INOUT off_t *offset;
705a9643ea8Slogwang	INOUT off_t *len;
706a9643ea8Slogwang};
707a9643ea8Slogwang
708*22ce4affSfengbojiang
709a9643ea8Slogwang%% advise	vp	U U U
710a9643ea8Slogwang
711a9643ea8Slogwangvop_advise {
712a9643ea8Slogwang	IN struct vnode *vp;
713a9643ea8Slogwang	IN off_t start;
714a9643ea8Slogwang	IN off_t end;
715a9643ea8Slogwang	IN int advice;
716a9643ea8Slogwang};
717a9643ea8Slogwang
718*22ce4affSfengbojiang
719a9643ea8Slogwang%% unp_bind	vp	E E E
720a9643ea8Slogwang
721a9643ea8Slogwangvop_unp_bind {
722a9643ea8Slogwang	IN struct vnode *vp;
723*22ce4affSfengbojiang	IN struct unpcb *unpcb;
724a9643ea8Slogwang};
725a9643ea8Slogwang
726*22ce4affSfengbojiang
727a9643ea8Slogwang%% unp_connect	vp	L L L
728a9643ea8Slogwang
729a9643ea8Slogwangvop_unp_connect {
730a9643ea8Slogwang	IN struct vnode *vp;
731*22ce4affSfengbojiang	OUT struct unpcb **unpcb;
732a9643ea8Slogwang};
733a9643ea8Slogwang
734*22ce4affSfengbojiang
735a9643ea8Slogwang%% unp_detach	vp	= = =
736a9643ea8Slogwang
737a9643ea8Slogwangvop_unp_detach {
738a9643ea8Slogwang	IN struct vnode *vp;
739a9643ea8Slogwang};
740a9643ea8Slogwang
741*22ce4affSfengbojiang
742a9643ea8Slogwang%% is_text	vp	L L L
743a9643ea8Slogwang
744a9643ea8Slogwangvop_is_text {
745a9643ea8Slogwang	IN struct vnode *vp;
746a9643ea8Slogwang};
747a9643ea8Slogwang
748*22ce4affSfengbojiang
749*22ce4affSfengbojiang%% set_text	vp	= = =
750a9643ea8Slogwang
751a9643ea8Slogwangvop_set_text {
752a9643ea8Slogwang	IN struct vnode *vp;
753a9643ea8Slogwang};
754a9643ea8Slogwang
755*22ce4affSfengbojiang
756*22ce4affSfengbojiang%% vop_unset_text	vp	L L L
757a9643ea8Slogwang
758a9643ea8Slogwangvop_unset_text {
759a9643ea8Slogwang	IN struct vnode *vp;
760a9643ea8Slogwang};
761a9643ea8Slogwang
762a9643ea8Slogwang
763*22ce4affSfengbojiang%% add_writecount	vp	L L L
764a9643ea8Slogwang
765a9643ea8Slogwangvop_add_writecount {
766a9643ea8Slogwang	IN struct vnode *vp;
767a9643ea8Slogwang	IN int inc;
768a9643ea8Slogwang};
769a9643ea8Slogwang
770*22ce4affSfengbojiang
771*22ce4affSfengbojiang%% fdatasync	vp	L L L
772*22ce4affSfengbojiang
773*22ce4affSfengbojiangvop_fdatasync {
774*22ce4affSfengbojiang	IN struct vnode *vp;
775*22ce4affSfengbojiang	IN struct thread *td;
776*22ce4affSfengbojiang};
777*22ce4affSfengbojiang
778*22ce4affSfengbojiang
779*22ce4affSfengbojiang%% copy_file_range	invp	U U U
780*22ce4affSfengbojiang%% copy_file_range	outvp	U U U
781*22ce4affSfengbojiang
782*22ce4affSfengbojiangvop_copy_file_range {
783*22ce4affSfengbojiang	IN struct vnode *invp;
784*22ce4affSfengbojiang	INOUT off_t *inoffp;
785*22ce4affSfengbojiang	IN struct vnode *outvp;
786*22ce4affSfengbojiang	INOUT off_t *outoffp;
787*22ce4affSfengbojiang	INOUT size_t *lenp;
788*22ce4affSfengbojiang	IN unsigned int flags;
789*22ce4affSfengbojiang	IN struct ucred *incred;
790*22ce4affSfengbojiang	IN struct ucred *outcred;
791*22ce4affSfengbojiang	IN struct thread *fsizetd;
792*22ce4affSfengbojiang};
793*22ce4affSfengbojiang
794*22ce4affSfengbojiang
795*22ce4affSfengbojiang%% vput_pair	dvp	E - -
796*22ce4affSfengbojiang
797*22ce4affSfengbojiangvop_vput_pair {
798*22ce4affSfengbojiang	IN struct vnode *dvp;
799*22ce4affSfengbojiang	INOUT struct vnode **vpp;
800*22ce4affSfengbojiang	IN bool unlock_vp;
801*22ce4affSfengbojiang};
802*22ce4affSfengbojiang
803*22ce4affSfengbojiang
804a9643ea8Slogwang# The VOPs below are spares at the end of the table to allow new VOPs to be
805a9643ea8Slogwang# added in stable branches without breaking the KBI.  New VOPs in HEAD should
806a9643ea8Slogwang# be added above these spares.  When merging a new VOP to a stable branch,
807a9643ea8Slogwang# the new VOP should replace one of the spares.
808a9643ea8Slogwang
809a9643ea8Slogwangvop_spare1 {
810a9643ea8Slogwang	IN struct vnode *vp;
811a9643ea8Slogwang};
812a9643ea8Slogwang
813a9643ea8Slogwangvop_spare2 {
814a9643ea8Slogwang	IN struct vnode *vp;
815a9643ea8Slogwang};
816a9643ea8Slogwang
817a9643ea8Slogwangvop_spare3 {
818a9643ea8Slogwang	IN struct vnode *vp;
819a9643ea8Slogwang};
820a9643ea8Slogwang
821a9643ea8Slogwangvop_spare4 {
822a9643ea8Slogwang	IN struct vnode *vp;
823a9643ea8Slogwang};
824a9643ea8Slogwang
825a9643ea8Slogwangvop_spare5 {
826a9643ea8Slogwang	IN struct vnode *vp;
827a9643ea8Slogwang};
828