1# 2# Copyright (c) 1992, 1993 3# The Regents of the University of California. All rights reserved. 4# 5# Redistribution and use in source and binary forms, with or without 6# modification, are permitted provided that the following conditions 7# are met: 8# 1. Redistributions of source code must retain the above copyright 9# notice, this list of conditions and the following disclaimer. 10# 2. Redistributions in binary form must reproduce the above copyright 11# notice, this list of conditions and the following disclaimer in the 12# documentation and/or other materials provided with the distribution. 13# 3. All advertising materials mentioning features or use of this software 14# must display the following acknowledgement: 15# This product includes software developed by the University of 16# California, Berkeley and its contributors. 17# 4. Neither the name of the University nor the names of its contributors 18# may be used to endorse or promote products derived from this software 19# without specific prior written permission. 20# 21# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31# SUCH DAMAGE. 32# 33# @(#)vnode_if.src 8.12 (Berkeley) 5/14/95 34# $FreeBSD$ 35# 36 37# 38# Above each of the vop descriptors is a specification of the locking 39# protocol used by each vop call. The first column is the name of 40# the variable, the remaining three columns are in, out and error 41# respectively. The "in" column defines the lock state on input, 42# the "out" column defines the state on succesful return, and the 43# "error" column defines the locking state on error exit. 44# 45# The locking value can take the following values: 46# L: locked; not converted to type of lock. 47# A: any lock type. 48# S: locked with shared lock. 49# E: locked with exclusive lock for this process. 50# O: locked with exclusive lock for other process. 51# U: unlocked. 52# -: not applicable. vnode does not yet (or no longer) exists. 53# =: the same on input and output, may be either L or U. 54# X: locked if not nil. 55# 56 57# 58#% islocked vp = = = 59# 60vop_islocked { 61 IN struct vnode *vp; 62 IN struct proc *p; 63}; 64 65# 66#% lookup dvp L ? ? 67#% lookup vpp - L - 68# 69# XXX - the lookup locking protocol defies simple description and depends 70# on the flags and operation fields in the (cnp) structure. Note 71# especially that *vpp may equal dvp and both may be locked. 72# 73vop_lookup { 74 IN struct vnode *dvp; 75 INOUT struct vnode **vpp; 76 IN struct componentname *cnp; 77}; 78 79# 80#% cachedlookup dvp L ? ? 81#% cachedlookup vpp - L - 82# 83# This must be an exact copy of lookup. See kern/vfs_cache.c for details. 84# 85vop_cachedlookup { 86 IN struct vnode *dvp; 87 INOUT struct vnode **vpp; 88 IN struct componentname *cnp; 89}; 90 91# 92#% create dvp L L L 93#% create vpp - L - 94# 95vop_create { 96 IN struct vnode *dvp; 97 OUT struct vnode **vpp; 98 IN struct componentname *cnp; 99 IN struct vattr *vap; 100}; 101 102# 103#% whiteout dvp L L L 104# 105vop_whiteout { 106 IN struct vnode *dvp; 107 IN struct componentname *cnp; 108 IN int flags; 109}; 110 111# 112#% mknod dvp L L L 113#% mknod vpp - X - 114# 115vop_mknod { 116 IN struct vnode *dvp; 117 OUT struct vnode **vpp; 118 IN struct componentname *cnp; 119 IN struct vattr *vap; 120}; 121 122# 123#% open vp L L L 124# 125vop_open { 126 IN struct vnode *vp; 127 IN int mode; 128 IN struct ucred *cred; 129 IN struct proc *p; 130}; 131 132# 133#% close vp U U U 134# 135vop_close { 136 IN struct vnode *vp; 137 IN int fflag; 138 IN struct ucred *cred; 139 IN struct proc *p; 140}; 141 142# 143#% access vp L L L 144# 145vop_access { 146 IN struct vnode *vp; 147 IN int mode; 148 IN struct ucred *cred; 149 IN struct proc *p; 150}; 151 152# 153#% getattr vp = = = 154# 155vop_getattr { 156 IN struct vnode *vp; 157 OUT struct vattr *vap; 158 IN struct ucred *cred; 159 IN struct proc *p; 160}; 161 162# 163#% setattr vp L L L 164# 165vop_setattr { 166 IN struct vnode *vp; 167 IN struct vattr *vap; 168 IN struct ucred *cred; 169 IN struct proc *p; 170}; 171 172# 173#% read vp L L L 174# 175vop_read { 176 IN struct vnode *vp; 177 INOUT struct uio *uio; 178 IN int ioflag; 179 IN struct ucred *cred; 180}; 181 182# 183#% write vp L L L 184# 185vop_write { 186 IN struct vnode *vp; 187 INOUT struct uio *uio; 188 IN int ioflag; 189 IN struct ucred *cred; 190}; 191 192# 193#% lease vp = = = 194# 195vop_lease { 196 IN struct vnode *vp; 197 IN struct proc *p; 198 IN struct ucred *cred; 199 IN int flag; 200}; 201 202# 203#% ioctl vp U U U 204# 205vop_ioctl { 206 IN struct vnode *vp; 207 IN u_long command; 208 IN caddr_t data; 209 IN int fflag; 210 IN struct ucred *cred; 211 IN struct proc *p; 212}; 213 214# 215#% poll vp U U U 216# 217vop_poll { 218 IN struct vnode *vp; 219 IN int events; 220 IN struct ucred *cred; 221 IN struct proc *p; 222}; 223 224# 225#% revoke vp U U U 226# 227vop_revoke { 228 IN struct vnode *vp; 229 IN int flags; 230}; 231 232# 233# XXX - not used 234# 235vop_mmap { 236 IN struct vnode *vp; 237 IN int fflags; 238 IN struct ucred *cred; 239 IN struct proc *p; 240}; 241 242# 243#% fsync vp L L L 244# 245vop_fsync { 246 IN struct vnode *vp; 247 IN struct ucred *cred; 248 IN int waitfor; 249 IN struct proc *p; 250}; 251 252# 253#% remove dvp L L L 254#% remove vp L L L 255# 256vop_remove { 257 IN struct vnode *dvp; 258 IN struct vnode *vp; 259 IN struct componentname *cnp; 260}; 261 262# 263#% link tdvp L L L 264#% link vp U U U 265# 266vop_link { 267 IN struct vnode *tdvp; 268 IN struct vnode *vp; 269 IN struct componentname *cnp; 270}; 271 272# 273#% rename fdvp U U U 274#% rename fvp U U U 275#% rename tdvp L U U 276#% rename tvp X U U 277# 278vop_rename { 279 IN WILLRELE struct vnode *fdvp; 280 IN WILLRELE struct vnode *fvp; 281 IN struct componentname *fcnp; 282 IN WILLRELE struct vnode *tdvp; 283 IN WILLRELE struct vnode *tvp; 284 IN struct componentname *tcnp; 285}; 286 287# 288#% mkdir dvp L L L 289#% mkdir vpp - L - 290# 291vop_mkdir { 292 IN struct vnode *dvp; 293 OUT struct vnode **vpp; 294 IN struct componentname *cnp; 295 IN struct vattr *vap; 296}; 297 298# 299#% rmdir dvp L L L 300#% rmdir vp L L L 301# 302vop_rmdir { 303 IN struct vnode *dvp; 304 IN struct vnode *vp; 305 IN struct componentname *cnp; 306}; 307 308# 309#% symlink dvp L L L 310#% symlink vpp - U - 311# 312vop_symlink { 313 IN struct vnode *dvp; 314 OUT struct vnode **vpp; 315 IN struct componentname *cnp; 316 IN struct vattr *vap; 317 IN char *target; 318}; 319 320# 321#% readdir vp L L L 322# 323vop_readdir { 324 IN struct vnode *vp; 325 INOUT struct uio *uio; 326 IN struct ucred *cred; 327 INOUT int *eofflag; 328 OUT int *ncookies; 329 INOUT u_long **cookies; 330}; 331 332# 333#% readlink vp L L L 334# 335vop_readlink { 336 IN struct vnode *vp; 337 INOUT struct uio *uio; 338 IN struct ucred *cred; 339}; 340 341# 342#% inactive vp L U U 343# 344vop_inactive { 345 IN struct vnode *vp; 346 IN struct proc *p; 347}; 348 349# 350#% reclaim vp U U U 351# 352vop_reclaim { 353 IN struct vnode *vp; 354 IN struct proc *p; 355}; 356 357# 358#% lock vp ? ? ? 359# 360vop_lock { 361 IN struct vnode *vp; 362 IN int flags; 363 IN struct proc *p; 364}; 365 366# 367#% unlock vp L U L 368# 369vop_unlock { 370 IN struct vnode *vp; 371 IN int flags; 372 IN struct proc *p; 373}; 374 375# 376#% bmap vp L L L 377#% bmap vpp - U - 378# 379vop_bmap { 380 IN struct vnode *vp; 381 IN daddr_t bn; 382 OUT struct vnode **vpp; 383 IN daddr_t *bnp; 384 OUT int *runp; 385 OUT int *runb; 386}; 387 388# 389#% strategy vp L L L 390# 391vop_strategy { 392 IN struct vnode *vp; 393 IN struct buf *bp; 394}; 395 396# 397#% getwritemount vp = = = 398# 399vop_getwritemount { 400 IN struct vnode *vp; 401 OUT struct mount **mpp; 402}; 403 404# 405#% copyonwrite vp L L L 406# 407vop_copyonwrite { 408 IN struct vnode *vp; 409 IN struct buf *bp; 410}; 411 412# 413#% print vp = = = 414# 415vop_print { 416 IN struct vnode *vp; 417}; 418 419# 420#% pathconf vp L L L 421# 422vop_pathconf { 423 IN struct vnode *vp; 424 IN int name; 425 OUT register_t *retval; 426}; 427 428# 429#% advlock vp U U U 430# 431vop_advlock { 432 IN struct vnode *vp; 433 IN caddr_t id; 434 IN int op; 435 IN struct flock *fl; 436 IN int flags; 437}; 438 439# 440#% balloc vp L L L 441# 442vop_balloc { 443 IN struct vnode *vp; 444 IN off_t startoffset; 445 IN int size; 446 IN struct ucred *cred; 447 IN int flags; 448 OUT struct buf **bpp; 449}; 450 451# 452#% reallocblks vp L L L 453# 454vop_reallocblks { 455 IN struct vnode *vp; 456 IN struct cluster_save *buflist; 457}; 458 459# 460#% getpages vp L L L 461# 462vop_getpages { 463 IN struct vnode *vp; 464 IN vm_page_t *m; 465 IN int count; 466 IN int reqpage; 467 IN vm_ooffset_t offset; 468}; 469 470# 471#% putpages vp L L L 472# 473vop_putpages { 474 IN struct vnode *vp; 475 IN vm_page_t *m; 476 IN int count; 477 IN int sync; 478 IN int *rtvals; 479 IN vm_ooffset_t offset; 480}; 481 482# 483#% freeblks vp - - - 484# 485# This call is used by the filesystem to release blocks back to 486# device-driver. This is useful if the driver has a lengthy 487# erase handling or similar. 488# 489 490vop_freeblks { 491 IN struct vnode *vp; 492 IN daddr_t addr; 493 IN daddr_t length; 494}; 495 496# 497#% bwrite vp L L L 498# 499vop_bwrite { 500 IN struct vnode *vp; 501 IN struct buf *bp; 502}; 503 504# 505#% getacl vp = = = 506# 507vop_getacl { 508 IN struct vnode *vp; 509 IN acl_type_t type; 510 OUT struct acl *aclp; 511 IN struct ucred *cred; 512 IN struct proc *p; 513}; 514 515# 516#% setacl vp L L L 517# 518vop_setacl { 519 IN struct vnode *vp; 520 IN acl_type_t type; 521 IN struct acl *aclp; 522 IN struct ucred *cred; 523 IN struct proc *p; 524}; 525 526# 527#% aclcheck vp = = = 528# 529vop_aclcheck { 530 IN struct vnode *vp; 531 IN acl_type_t type; 532 IN struct acl *aclp; 533 IN struct ucred *cred; 534 IN struct proc *p; 535}; 536 537# 538#% getextattr vp = = = 539# 540vop_getextattr { 541 IN struct vnode *vp; 542 IN char *name; 543 INOUT struct uio *uio; 544 IN struct ucred *cred; 545 IN struct proc *p; 546}; 547 548# 549#% setextattr vp L L L 550# 551vop_setextattr { 552 IN struct vnode *vp; 553 IN char *name; 554 INOUT struct uio *uio; 555 IN struct ucred *cred; 556 IN struct proc *p; 557}; 558