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