vnode_if.src revision 65770
1130803Smarcel# 2130803Smarcel# Copyright (c) 1992, 1993 3130803Smarcel# The Regents of the University of California. All rights reserved. 4130803Smarcel# 5130803Smarcel# Redistribution and use in source and binary forms, with or without 6130803Smarcel# modification, are permitted provided that the following conditions 7130803Smarcel# are met: 8130803Smarcel# 1. Redistributions of source code must retain the above copyright 9130803Smarcel# notice, this list of conditions and the following disclaimer. 10130803Smarcel# 2. Redistributions in binary form must reproduce the above copyright 11130803Smarcel# notice, this list of conditions and the following disclaimer in the 12130803Smarcel# documentation and/or other materials provided with the distribution. 13130803Smarcel# 3. All advertising materials mentioning features or use of this software 14130803Smarcel# must display the following acknowledgement: 15130803Smarcel# This product includes software developed by the University of 16130803Smarcel# California, Berkeley and its contributors. 17130803Smarcel# 4. Neither the name of the University nor the names of its contributors 18130803Smarcel# may be used to endorse or promote products derived from this software 19130803Smarcel# without specific prior written permission. 20130803Smarcel# 21130803Smarcel# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22130803Smarcel# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23130803Smarcel# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24130803Smarcel# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25130803Smarcel# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26130803Smarcel# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27130803Smarcel# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28130803Smarcel# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29130803Smarcel# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30130803Smarcel# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31130803Smarcel# SUCH DAMAGE. 32130803Smarcel# 33130803Smarcel# @(#)vnode_if.src 8.12 (Berkeley) 5/14/95 34130803Smarcel# $FreeBSD: head/sys/kern/vnode_if.src 65770 2000-09-12 09:49:08Z bp $ 35130803Smarcel# 36130803Smarcel 37130803Smarcel# 38130803Smarcel# Above each of the vop descriptors is a specification of the locking 39130803Smarcel# protocol used by each vop call. The first column is the name of 40130803Smarcel# the variable, the remaining three columns are in, out and error 41130803Smarcel# respectively. The "in" column defines the lock state on input, 42130803Smarcel# the "out" column defines the state on succesful return, and the 43130803Smarcel# "error" column defines the locking state on error exit. 44130803Smarcel# 45130803Smarcel# The locking value can take the following values: 46130803Smarcel# L: locked; not converted to type of lock. 47130803Smarcel# A: any lock type. 48130803Smarcel# S: locked with shared lock. 49130803Smarcel# E: locked with exclusive lock for this process. 50130803Smarcel# O: locked with exclusive lock for other process. 51130803Smarcel# U: unlocked. 52130803Smarcel# -: not applicable. vnode does not yet (or no longer) exists. 53130803Smarcel# =: the same on input and output, may be either L or U. 54130803Smarcel# X: locked if not nil. 55130803Smarcel# 56130803Smarcel 57130803Smarcel# 58130803Smarcel#% islocked vp = = = 59130803Smarcel# 60130803Smarcelvop_islocked { 61130803Smarcel IN struct vnode *vp; 62130803Smarcel IN struct proc *p; 63130803Smarcel}; 64130803Smarcel 65130803Smarcel# 66130803Smarcel#% lookup dvp L ? ? 67130803Smarcel#% lookup vpp - L - 68130803Smarcel# 69130803Smarcel# XXX - the lookup locking protocol defies simple description and depends 70130803Smarcel# on the flags and operation fields in the (cnp) structure. Note 71130803Smarcel# especially that *vpp may equal dvp and both may be locked. 72130803Smarcel# 73130803Smarcelvop_lookup { 74130803Smarcel IN struct vnode *dvp; 75130803Smarcel INOUT struct vnode **vpp; 76130803Smarcel IN struct componentname *cnp; 77130803Smarcel}; 78130803Smarcel 79130803Smarcel# 80130803Smarcel#% cachedlookup dvp L ? ? 81130803Smarcel#% cachedlookup vpp - L - 82130803Smarcel# 83130803Smarcel# This must be an exact copy of lookup. See kern/vfs_cache.c for details. 84130803Smarcel# 85130803Smarcelvop_cachedlookup { 86130803Smarcel IN struct vnode *dvp; 87130803Smarcel INOUT struct vnode **vpp; 88130803Smarcel IN struct componentname *cnp; 89130803Smarcel}; 90130803Smarcel 91130803Smarcel# 92130803Smarcel#% create dvp L L L 93130803Smarcel#% create vpp - L - 94130803Smarcel# 95130803Smarcelvop_create { 96130803Smarcel IN struct vnode *dvp; 97130803Smarcel OUT struct vnode **vpp; 98130803Smarcel IN struct componentname *cnp; 99130803Smarcel IN struct vattr *vap; 100130803Smarcel}; 101130803Smarcel 102130803Smarcel# 103130803Smarcel#% whiteout dvp L L L 104130803Smarcel# 105130803Smarcelvop_whiteout { 106130803Smarcel IN struct vnode *dvp; 107130803Smarcel IN struct componentname *cnp; 108130803Smarcel IN int flags; 109130803Smarcel}; 110130803Smarcel 111130803Smarcel# 112130803Smarcel#% mknod dvp L L L 113130803Smarcel#% mknod vpp - X - 114130803Smarcel# 115130803Smarcelvop_mknod { 116130803Smarcel IN struct vnode *dvp; 117130803Smarcel OUT struct vnode **vpp; 118130803Smarcel IN struct componentname *cnp; 119130803Smarcel IN struct vattr *vap; 120130803Smarcel}; 121130803Smarcel 122130803Smarcel# 123130803Smarcel#% open vp L L L 124130803Smarcel# 125130803Smarcelvop_open { 126130803Smarcel IN struct vnode *vp; 127130803Smarcel IN int mode; 128130803Smarcel IN struct ucred *cred; 129130803Smarcel IN struct proc *p; 130130803Smarcel}; 131130803Smarcel 132130803Smarcel# 133130803Smarcel#% close vp U U U 134130803Smarcel# 135130803Smarcelvop_close { 136130803Smarcel IN struct vnode *vp; 137130803Smarcel IN int fflag; 138130803Smarcel IN struct ucred *cred; 139130803Smarcel IN struct proc *p; 140130803Smarcel}; 141130803Smarcel 142130803Smarcel# 143130803Smarcel#% access vp L L L 144130803Smarcel# 145130803Smarcelvop_access { 146130803Smarcel IN struct vnode *vp; 147130803Smarcel IN int mode; 148130803Smarcel IN struct ucred *cred; 149130803Smarcel IN struct proc *p; 150130803Smarcel}; 151130803Smarcel 152130803Smarcel# 153130803Smarcel#% getattr vp = = = 154130803Smarcel# 155130803Smarcelvop_getattr { 156130803Smarcel IN struct vnode *vp; 157130803Smarcel OUT struct vattr *vap; 158130803Smarcel IN struct ucred *cred; 159130803Smarcel IN struct proc *p; 160130803Smarcel}; 161130803Smarcel 162130803Smarcel# 163130803Smarcel#% setattr vp L L L 164130803Smarcel# 165130803Smarcelvop_setattr { 166130803Smarcel IN struct vnode *vp; 167130803Smarcel IN struct vattr *vap; 168130803Smarcel IN struct ucred *cred; 169130803Smarcel IN struct proc *p; 170130803Smarcel}; 171130803Smarcel 172130803Smarcel# 173130803Smarcel#% read vp L L L 174130803Smarcel# 175130803Smarcelvop_read { 176130803Smarcel IN struct vnode *vp; 177130803Smarcel INOUT struct uio *uio; 178130803Smarcel IN int ioflag; 179130803Smarcel IN struct ucred *cred; 180130803Smarcel}; 181130803Smarcel 182130803Smarcel# 183130803Smarcel#% write vp L L L 184130803Smarcel# 185130803Smarcelvop_write { 186130803Smarcel IN struct vnode *vp; 187130803Smarcel INOUT struct uio *uio; 188130803Smarcel IN int ioflag; 189130803Smarcel IN struct ucred *cred; 190130803Smarcel}; 191130803Smarcel 192130803Smarcel# 193130803Smarcel#% lease vp = = = 194130803Smarcel# 195130803Smarcelvop_lease { 196130803Smarcel IN struct vnode *vp; 197130803Smarcel IN struct proc *p; 198130803Smarcel IN struct ucred *cred; 199130803Smarcel IN int flag; 200130803Smarcel}; 201130803Smarcel 202130803Smarcel# 203130803Smarcel#% ioctl vp U U U 204130803Smarcel# 205130803Smarcelvop_ioctl { 206130803Smarcel IN struct vnode *vp; 207130803Smarcel IN u_long command; 208130803Smarcel IN caddr_t data; 209130803Smarcel IN int fflag; 210130803Smarcel IN struct ucred *cred; 211130803Smarcel IN struct proc *p; 212130803Smarcel}; 213130803Smarcel 214130803Smarcel# 215130803Smarcel#% poll vp U U U 216130803Smarcel# 217130803Smarcelvop_poll { 218130803Smarcel IN struct vnode *vp; 219130803Smarcel IN int events; 220130803Smarcel IN struct ucred *cred; 221130803Smarcel IN struct proc *p; 222130803Smarcel}; 223130803Smarcel 224130803Smarcel# 225130803Smarcel#% revoke vp U U U 226130803Smarcel# 227130803Smarcelvop_revoke { 228130803Smarcel IN struct vnode *vp; 229130803Smarcel IN int flags; 230130803Smarcel}; 231130803Smarcel 232130803Smarcel# 233130803Smarcel# XXX - not used 234130803Smarcel# 235130803Smarcelvop_mmap { 236130803Smarcel IN struct vnode *vp; 237130803Smarcel IN int fflags; 238130803Smarcel IN struct ucred *cred; 239130803Smarcel IN struct proc *p; 240130803Smarcel}; 241130803Smarcel 242130803Smarcel# 243130803Smarcel#% fsync vp L L L 244130803Smarcel# 245130803Smarcelvop_fsync { 246130803Smarcel IN struct vnode *vp; 247130803Smarcel IN struct ucred *cred; 248130803Smarcel IN int waitfor; 249130803Smarcel IN struct proc *p; 250130803Smarcel}; 251130803Smarcel 252130803Smarcel# 253130803Smarcel#% remove dvp L L L 254130803Smarcel#% remove vp L L L 255130803Smarcel# 256130803Smarcelvop_remove { 257130803Smarcel IN struct vnode *dvp; 258130803Smarcel IN struct vnode *vp; 259130803Smarcel IN struct componentname *cnp; 260130803Smarcel}; 261130803Smarcel 262130803Smarcel# 263130803Smarcel#% link tdvp L L L 264130803Smarcel#% link vp U U U 265130803Smarcel# 266130803Smarcelvop_link { 267130803Smarcel IN struct vnode *tdvp; 268130803Smarcel IN struct vnode *vp; 269130803Smarcel IN struct componentname *cnp; 270130803Smarcel}; 271130803Smarcel 272130803Smarcel# 273130803Smarcel#% rename fdvp U U U 274130803Smarcel#% rename fvp U U U 275130803Smarcel#% rename tdvp L U U 276130803Smarcel#% rename tvp X U U 277130803Smarcel# 278130803Smarcelvop_rename { 279130803Smarcel IN WILLRELE struct vnode *fdvp; 280130803Smarcel IN WILLRELE struct vnode *fvp; 281130803Smarcel IN struct componentname *fcnp; 282130803Smarcel IN WILLRELE struct vnode *tdvp; 283130803Smarcel IN WILLRELE struct vnode *tvp; 284130803Smarcel IN struct componentname *tcnp; 285130803Smarcel}; 286130803Smarcel 287130803Smarcel# 288130803Smarcel#% mkdir dvp L L L 289130803Smarcel#% mkdir vpp - L - 290130803Smarcel# 291130803Smarcelvop_mkdir { 292130803Smarcel IN struct vnode *dvp; 293130803Smarcel OUT struct vnode **vpp; 294130803Smarcel IN struct componentname *cnp; 295130803Smarcel IN struct vattr *vap; 296130803Smarcel}; 297130803Smarcel 298130803Smarcel# 299130803Smarcel#% rmdir dvp L L L 300130803Smarcel#% rmdir vp L L L 301130803Smarcel# 302130803Smarcelvop_rmdir { 303130803Smarcel IN struct vnode *dvp; 304130803Smarcel IN struct vnode *vp; 305130803Smarcel IN struct componentname *cnp; 306130803Smarcel}; 307130803Smarcel 308130803Smarcel# 309130803Smarcel#% symlink dvp L L L 310130803Smarcel#% symlink vpp - U - 311130803Smarcel# 312130803Smarcelvop_symlink { 313130803Smarcel IN struct vnode *dvp; 314130803Smarcel OUT struct vnode **vpp; 315130803Smarcel IN struct componentname *cnp; 316130803Smarcel IN struct vattr *vap; 317130803Smarcel IN char *target; 318130803Smarcel}; 319130803Smarcel 320130803Smarcel# 321130803Smarcel#% readdir vp L L L 322130803Smarcel# 323130803Smarcelvop_readdir { 324130803Smarcel IN struct vnode *vp; 325130803Smarcel INOUT struct uio *uio; 326130803Smarcel IN struct ucred *cred; 327130803Smarcel INOUT int *eofflag; 328130803Smarcel OUT int *ncookies; 329130803Smarcel INOUT u_long **cookies; 330130803Smarcel}; 331130803Smarcel 332130803Smarcel# 333130803Smarcel#% readlink vp L L L 334130803Smarcel# 335130803Smarcelvop_readlink { 336130803Smarcel IN struct vnode *vp; 337130803Smarcel INOUT struct uio *uio; 338130803Smarcel IN struct ucred *cred; 339130803Smarcel}; 340130803Smarcel 341130803Smarcel# 342130803Smarcel#% inactive vp L U U 343130803Smarcel# 344130803Smarcelvop_inactive { 345130803Smarcel IN struct vnode *vp; 346130803Smarcel IN struct proc *p; 347130803Smarcel}; 348130803Smarcel 349130803Smarcel# 350130803Smarcel#% reclaim vp U U U 351130803Smarcel# 352130803Smarcelvop_reclaim { 353130803Smarcel IN struct vnode *vp; 354130803Smarcel IN struct proc *p; 355130803Smarcel}; 356130803Smarcel 357130803Smarcel# 358130803Smarcel#% lock vp ? ? ? 359130803Smarcel# 360130803Smarcelvop_lock { 361130803Smarcel IN struct vnode *vp; 362130803Smarcel IN int flags; 363130803Smarcel IN struct proc *p; 364130803Smarcel}; 365130803Smarcel 366130803Smarcel# 367130803Smarcel#% unlock vp L U L 368130803Smarcel# 369130803Smarcelvop_unlock { 370130803Smarcel IN struct vnode *vp; 371130803Smarcel IN int flags; 372130803Smarcel IN struct proc *p; 373130803Smarcel}; 374130803Smarcel 375130803Smarcel# 376130803Smarcel#% bmap vp L L L 377130803Smarcel#% bmap vpp - U - 378130803Smarcel# 379130803Smarcelvop_bmap { 380130803Smarcel IN struct vnode *vp; 381130803Smarcel IN daddr_t bn; 382130803Smarcel OUT struct vnode **vpp; 383130803Smarcel IN daddr_t *bnp; 384130803Smarcel OUT int *runp; 385130803Smarcel OUT int *runb; 386130803Smarcel}; 387130803Smarcel 388130803Smarcel# 389130803Smarcel#% strategy vp L L L 390130803Smarcel# 391130803Smarcelvop_strategy { 392130803Smarcel IN struct vnode *vp; 393130803Smarcel IN struct buf *bp; 394130803Smarcel}; 395130803Smarcel 396130803Smarcel# 397130803Smarcel#% getwritemount vp = = = 398130803Smarcel# 399130803Smarcelvop_getwritemount { 400130803Smarcel IN struct vnode *vp; 401130803Smarcel OUT struct mount **mpp; 402130803Smarcel}; 403130803Smarcel 404130803Smarcel# 405130803Smarcel#% copyonwrite vp L L L 406130803Smarcel# 407130803Smarcelvop_copyonwrite { 408130803Smarcel IN struct vnode *vp; 409130803Smarcel IN struct buf *bp; 410130803Smarcel}; 411130803Smarcel 412130803Smarcel# 413130803Smarcel#% print vp = = = 414130803Smarcel# 415130803Smarcelvop_print { 416130803Smarcel IN struct vnode *vp; 417130803Smarcel}; 418130803Smarcel 419130803Smarcel# 420130803Smarcel#% pathconf vp L L L 421130803Smarcel# 422130803Smarcelvop_pathconf { 423130803Smarcel IN struct vnode *vp; 424130803Smarcel IN int name; 425130803Smarcel OUT register_t *retval; 426130803Smarcel}; 427130803Smarcel 428130803Smarcel# 429130803Smarcel#% advlock vp U U U 430130803Smarcel# 431130803Smarcelvop_advlock { 432130803Smarcel IN struct vnode *vp; 433130803Smarcel IN caddr_t id; 434130803Smarcel IN int op; 435130803Smarcel IN struct flock *fl; 436130803Smarcel IN int flags; 437130803Smarcel}; 438130803Smarcel 439130803Smarcel# 440130803Smarcel#% balloc vp L L L 441130803Smarcel# 442130803Smarcelvop_balloc { 443130803Smarcel IN struct vnode *vp; 444130803Smarcel IN off_t startoffset; 445130803Smarcel IN int size; 446130803Smarcel IN struct ucred *cred; 447130803Smarcel IN int flags; 448130803Smarcel OUT struct buf **bpp; 449130803Smarcel}; 450130803Smarcel 451130803Smarcel# 452130803Smarcel#% reallocblks vp L L L 453130803Smarcel# 454130803Smarcelvop_reallocblks { 455130803Smarcel IN struct vnode *vp; 456130803Smarcel IN struct cluster_save *buflist; 457130803Smarcel}; 458130803Smarcel 459130803Smarcel# 460130803Smarcel#% getpages vp L L L 461130803Smarcel# 462130803Smarcelvop_getpages { 463130803Smarcel IN struct vnode *vp; 464130803Smarcel IN vm_page_t *m; 465130803Smarcel IN int count; 466130803Smarcel IN int reqpage; 467130803Smarcel IN vm_ooffset_t offset; 468130803Smarcel}; 469130803Smarcel 470130803Smarcel# 471130803Smarcel#% putpages vp L L L 472130803Smarcel# 473130803Smarcelvop_putpages { 474130803Smarcel IN struct vnode *vp; 475130803Smarcel IN vm_page_t *m; 476130803Smarcel IN int count; 477130803Smarcel IN int sync; 478130803Smarcel IN int *rtvals; 479130803Smarcel IN vm_ooffset_t offset; 480130803Smarcel}; 481130803Smarcel 482130803Smarcel# 483130803Smarcel#% freeblks vp - - - 484130803Smarcel# 485130803Smarcel# This call is used by the filesystem to release blocks back to 486130803Smarcel# device-driver. This is useful if the driver has a lengthy 487130803Smarcel# erase handling or similar. 488130803Smarcel# 489130803Smarcel 490130803Smarcelvop_freeblks { 491130803Smarcel IN struct vnode *vp; 492130803Smarcel IN daddr_t addr; 493130803Smarcel IN daddr_t length; 494130803Smarcel}; 495130803Smarcel 496130803Smarcel# 497130803Smarcel#% bwrite vp L L L 498130803Smarcel# 499130803Smarcelvop_bwrite { 500130803Smarcel IN struct vnode *vp; 501130803Smarcel IN struct buf *bp; 502130803Smarcel}; 503130803Smarcel 504130803Smarcel# 505130803Smarcel#% getacl vp = = = 506130803Smarcel# 507130803Smarcelvop_getacl { 508130803Smarcel IN struct vnode *vp; 509130803Smarcel IN acl_type_t type; 510130803Smarcel OUT struct acl *aclp; 511130803Smarcel IN struct ucred *cred; 512130803Smarcel IN struct proc *p; 513130803Smarcel}; 514130803Smarcel 515130803Smarcel# 516130803Smarcel#% setacl vp L L L 517130803Smarcel# 518130803Smarcelvop_setacl { 519130803Smarcel IN struct vnode *vp; 520130803Smarcel IN acl_type_t type; 521130803Smarcel IN struct acl *aclp; 522130803Smarcel IN struct ucred *cred; 523130803Smarcel IN struct proc *p; 524130803Smarcel}; 525130803Smarcel 526130803Smarcel# 527130803Smarcel#% aclcheck vp = = = 528130803Smarcel# 529130803Smarcelvop_aclcheck { 530130803Smarcel IN struct vnode *vp; 531130803Smarcel IN acl_type_t type; 532130803Smarcel IN struct acl *aclp; 533130803Smarcel IN struct ucred *cred; 534130803Smarcel IN struct proc *p; 535130803Smarcel}; 536130803Smarcel 537130803Smarcel# 538130803Smarcel#% getextattr vp L L L 539130803Smarcel# 540130803Smarcelvop_getextattr { 541130803Smarcel IN struct vnode *vp; 542130803Smarcel IN const char *name; 543130803Smarcel INOUT struct uio *uio; 544130803Smarcel IN struct ucred *cred; 545130803Smarcel IN struct proc *p; 546130803Smarcel}; 547130803Smarcel 548130803Smarcel# 549130803Smarcel#% setextattr vp L L L 550130803Smarcel# 551130803Smarcelvop_setextattr { 552130803Smarcel IN struct vnode *vp; 553130803Smarcel IN const char *name; 554130803Smarcel INOUT struct uio *uio; 555130803Smarcel IN struct ucred *cred; 556130803Smarcel IN struct proc *p; 557130803Smarcel}; 558130803Smarcel 559130803Smarcel# 560130803Smarcel#% createvobject vp L L L 561130803Smarcel# 562130803Smarcelvop_createvobject { 563130803Smarcel IN struct vnode *vp; 564130803Smarcel IN struct ucred *cred; 565130803Smarcel IN struct proc *p; 566130803Smarcel}; 567130803Smarcel 568130803Smarcel# 569130803Smarcel#% destroyvobject vp L L L 570130803Smarcel# 571130803Smarcelvop_destroyvobject { 572130803Smarcel IN struct vnode *vp; 573130803Smarcel}; 574130803Smarcel 575130803Smarcel# 576130803Smarcel#% getvobject vp L L L 577130803Smarcel# 578130803Smarcelvop_getvobject { 579130803Smarcel IN struct vnode *vp; 580130803Smarcel OUT struct vm_object **objpp; 581130803Smarcel}; 582130803Smarcel