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