vnode_if.src revision 259296
155714Skris#- 255714Skris# Copyright (c) 1992, 1993 355714Skris# The Regents of the University of California. All rights reserved. 455714Skris# 555714Skris# Redistribution and use in source and binary forms, with or without 655714Skris# modification, are permitted provided that the following conditions 755714Skris# are met: 8280304Sjkim# 1. Redistributions of source code must retain the above copyright 955714Skris# notice, this list of conditions and the following disclaimer. 1055714Skris# 2. Redistributions in binary form must reproduce the above copyright 1155714Skris# notice, this list of conditions and the following disclaimer in the 1255714Skris# documentation and/or other materials provided with the distribution. 1355714Skris# 4. Neither the name of the University nor the names of its contributors 1455714Skris# may be used to endorse or promote products derived from this software 15280304Sjkim# without specific prior written permission. 1655714Skris# 1755714Skris# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 1855714Skris# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1955714Skris# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2055714Skris# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2155714Skris# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22280304Sjkim# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2355714Skris# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2455714Skris# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2555714Skris# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2655714Skris# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2755714Skris# SUCH DAMAGE. 2855714Skris# 2955714Skris# @(#)vnode_if.src 8.12 (Berkeley) 5/14/95 3055714Skris# $FreeBSD: stable/10/sys/kern/vnode_if.src 259296 2013-12-13 06:12:21Z kib $ 3155714Skris# 3255714Skris 3355714Skris# 3455714Skris# Above each of the vop descriptors in lines starting with %% 3555714Skris# is a specification of the locking protocol used by each vop call. 3655714Skris# The first column is the name of the variable, the remaining three 37280304Sjkim# columns are in, out and error respectively. The "in" column defines 3855714Skris# the lock state on input, the "out" column defines the state on succesful 3955714Skris# return, and the "error" column defines the locking state on error exit. 40280304Sjkim# 4155714Skris# The locking value can take the following values: 4255714Skris# L: locked; not converted to type of lock. 4355714Skris# A: any lock type. 4455714Skris# S: locked with shared lock. 4555714Skris# E: locked with exclusive lock for this process. 4655714Skris# O: locked with exclusive lock for other process. 4755714Skris# U: unlocked. 4855714Skris# -: not applicable. vnode does not yet (or no longer) exists. 4955714Skris# =: the same on input and output, may be either L or U. 5055714Skris# X: locked if not nil. 5155714Skris# 52280304Sjkim# The paramater named "vpp" is assumed to be always used with double 5355714Skris# indirection (**vpp) and that name is hard-coded in vnode_if.awk ! 5455714Skris# 5555714Skris# Lines starting with %! specify a pre or post-condition function 5655714Skris# to call before/after the vop call. 5755714Skris# 58109998Smarkm# If other such parameters are introduced, they have to be added to 59109998Smarkm# the AWK script at the head of the definition of "add_debug_code()". 60109998Smarkm# 61109998Smarkm 62109998Smarkmvop_islocked { 63109998Smarkm IN struct vnode *vp; 64109998Smarkm}; 65109998Smarkm 66280304Sjkim%% lookup dvp L L L 67109998Smarkm%% lookup vpp - L - 68109998Smarkm 69109998Smarkm# XXX - the lookup locking protocol defies simple description and depends 70109998Smarkm# on the flags and operation fields in the (cnp) structure. Note 71109998Smarkm# especially that *vpp may equal dvp and both may be locked. 72109998Smarkm 73109998Smarkmvop_lookup { 74109998Smarkm IN struct vnode *dvp; 75109998Smarkm INOUT struct vnode **vpp; 76109998Smarkm IN struct componentname *cnp; 77109998Smarkm}; 78109998Smarkm 79109998Smarkm%% cachedlookup dvp L L L 80109998Smarkm%% cachedlookup vpp - L - 81109998Smarkm 82109998Smarkm# This must be an exact copy of lookup. See kern/vfs_cache.c for details. 83109998Smarkm 84109998Smarkmvop_cachedlookup { 85109998Smarkm IN struct vnode *dvp; 86109998Smarkm INOUT struct vnode **vpp; 87109998Smarkm IN struct componentname *cnp; 88109998Smarkm}; 89109998Smarkm 90109998Smarkm%% create dvp E E E 91109998Smarkm%% create vpp - L - 92109998Smarkm%! create post vop_create_post 93109998Smarkm 94109998Smarkmvop_create { 95109998Smarkm IN struct vnode *dvp; 96109998Smarkm OUT struct vnode **vpp; 97109998Smarkm IN struct componentname *cnp; 98109998Smarkm IN struct vattr *vap; 99109998Smarkm}; 100109998Smarkm 101109998Smarkm 102109998Smarkm%% whiteout dvp E E E 103109998Smarkm 104109998Smarkmvop_whiteout { 105109998Smarkm IN struct vnode *dvp; 106109998Smarkm IN struct componentname *cnp; 107109998Smarkm IN int flags; 108109998Smarkm}; 109109998Smarkm 110109998Smarkm 11155714Skris%% mknod dvp E E E 11255714Skris%% mknod vpp - L - 11355714Skris%! mknod post vop_mknod_post 11455714Skris 11555714Skrisvop_mknod { 116111147Snectar IN struct vnode *dvp; 117280304Sjkim OUT struct vnode **vpp; 118111147Snectar IN struct componentname *cnp; 11955714Skris IN struct vattr *vap; 120238405Sjkim}; 121280304Sjkim 122238405Sjkim 123238405Sjkim%% open vp L L L 124109998Smarkm 125280304Sjkimvop_open { 126280304Sjkim IN struct vnode *vp; 127280304Sjkim IN int mode; 12855714Skris IN struct ucred *cred; 129109998Smarkm IN struct thread *td; 130280304Sjkim IN struct file *fp; 131280304Sjkim}; 132109998Smarkm 133280304Sjkim 134280304Sjkim%% close vp L L L 135109998Smarkm 136280304Sjkimvop_close { 137280304Sjkim IN struct vnode *vp; 138109998Smarkm IN int fflag; 139109998Smarkm IN struct ucred *cred; 140280304Sjkim IN struct thread *td; 141280304Sjkim}; 142280304Sjkim 143280304Sjkim 144109998Smarkm%% access vp L L L 145238405Sjkim 146280304Sjkimvop_access { 147280304Sjkim IN struct vnode *vp; 148111147Snectar IN accmode_t accmode; 149280304Sjkim IN struct ucred *cred; 150280304Sjkim IN struct thread *td; 151280304Sjkim}; 152280304Sjkim 153280304Sjkim 154280304Sjkim%% accessx vp L L L 155280304Sjkim 156280304Sjkimvop_accessx { 157280304Sjkim IN struct vnode *vp; 158280304Sjkim IN accmode_t accmode; 159280304Sjkim IN struct ucred *cred; 160280304Sjkim IN struct thread *td; 161280304Sjkim}; 162280304Sjkim 163280304Sjkim 164280304Sjkim%% getattr vp L L L 165280304Sjkim 166280304Sjkimvop_getattr { 167280304Sjkim IN struct vnode *vp; 168280304Sjkim OUT struct vattr *vap; 169280304Sjkim IN struct ucred *cred; 170280304Sjkim}; 171280304Sjkim 172280304Sjkim 173280304Sjkim%% setattr vp E E E 174280304Sjkim%! setattr post vop_setattr_post 175280304Sjkim 176280304Sjkimvop_setattr { 177280304Sjkim IN struct vnode *vp; 178280304Sjkim IN struct vattr *vap; 179280304Sjkim IN struct ucred *cred; 180280304Sjkim}; 181280304Sjkim 182280304Sjkim%% markatime vp L L L 183280304Sjkim 184280304Sjkimvop_markatime { 185280304Sjkim IN struct vnode *vp; 186280304Sjkim}; 187280304Sjkim 188280304Sjkim%% read vp L L L 189280304Sjkim 190280304Sjkimvop_read { 191280304Sjkim IN struct vnode *vp; 192280304Sjkim INOUT struct uio *uio; 193280304Sjkim IN int ioflag; 194280304Sjkim IN struct ucred *cred; 195280304Sjkim}; 196280304Sjkim 197280304Sjkim 198280304Sjkim%% write vp L L L 199280304Sjkim%! write pre VOP_WRITE_PRE 200280304Sjkim%! write post VOP_WRITE_POST 201120631Snectar 202280304Sjkimvop_write { 203298999Sjkim IN struct vnode *vp; 204280304Sjkim INOUT struct uio *uio; 205298999Sjkim IN int ioflag; 206298999Sjkim IN struct ucred *cred; 207280304Sjkim}; 208280304Sjkim 209280304Sjkim 210280304Sjkim%% ioctl vp U U U 211280304Sjkim 212280304Sjkimvop_ioctl { 213280304Sjkim IN struct vnode *vp; 214280304Sjkim IN u_long command; 215280304Sjkim IN void *data; 216280304Sjkim IN int fflag; 217111147Snectar IN struct ucred *cred; 218280304Sjkim IN struct thread *td; 219111147Snectar}; 220280304Sjkim 221280304Sjkim 222280304Sjkim%% poll vp U U U 223280304Sjkim 224280304Sjkimvop_poll { 225280304Sjkim IN struct vnode *vp; 226280304Sjkim IN int events; 227280304Sjkim IN struct ucred *cred; 228280304Sjkim IN struct thread *td; 229238405Sjkim}; 230280304Sjkim 231280304Sjkim 232280304Sjkim%% kqfilter vp U U U 233280304Sjkim 234280304Sjkimvop_kqfilter { 235280304Sjkim IN struct vnode *vp; 236280304Sjkim IN struct knote *kn; 237238405Sjkim}; 238280304Sjkim 239280304Sjkim 240109998Smarkm%% revoke vp L L L 241238405Sjkim 242280304Sjkimvop_revoke { 243194206Ssimon IN struct vnode *vp; 244306196Sjkim IN int flags; 245306196Sjkim}; 246306196Sjkim 247280304Sjkim 248280304Sjkim%% fsync vp L L L 24955714Skris 250109998Smarkmvop_fsync { 251109998Smarkm IN struct vnode *vp; 252280304Sjkim IN int waitfor; 253280304Sjkim IN struct thread *td; 254280304Sjkim}; 255280304Sjkim 256280304Sjkim 257280304Sjkim%% remove dvp E E E 258109998Smarkm%% remove vp E E E 259109998Smarkm%! remove post vop_remove_post 260109998Smarkm 261280304Sjkimvop_remove { 262306196Sjkim IN struct vnode *dvp; 263238405Sjkim IN struct vnode *vp; 264306196Sjkim IN struct componentname *cnp; 265306196Sjkim}; 266306196Sjkim 267246772Sjkim 268280304Sjkim%% link tdvp E E E 269280304Sjkim%% link vp E E E 270280304Sjkim%! link post vop_link_post 271280304Sjkim 272280304Sjkimvop_link { 273280304Sjkim IN struct vnode *tdvp; 274280304Sjkim IN struct vnode *vp; 275280304Sjkim IN struct componentname *cnp; 276306196Sjkim}; 277280304Sjkim 278280304Sjkim 27955714Skris%! rename pre vop_rename_pre 280109998Smarkm%! rename post vop_rename_post 281280304Sjkim 282280304Sjkimvop_rename { 283280304Sjkim IN WILLRELE struct vnode *fdvp; 284280304Sjkim IN WILLRELE struct vnode *fvp; 285109998Smarkm IN struct componentname *fcnp; 286109998Smarkm IN WILLRELE struct vnode *tdvp; 287280304Sjkim IN WILLRELE struct vnode *tvp; 288280304Sjkim IN struct componentname *tcnp; 289280304Sjkim}; 290280304Sjkim 291280304Sjkim 292280304Sjkim%% mkdir dvp E E E 293111147Snectar%% mkdir vpp - E - 294280304Sjkim%! mkdir post vop_mkdir_post 295280304Sjkim 296280304Sjkimvop_mkdir { 297280304Sjkim IN struct vnode *dvp; 298280304Sjkim OUT struct vnode **vpp; 299111147Snectar IN struct componentname *cnp; 300109998Smarkm IN struct vattr *vap; 301280304Sjkim}; 302280304Sjkim 303280304Sjkim 304280304Sjkim%% rmdir dvp E E E 305280304Sjkim%% rmdir vp E E E 306280304Sjkim%! rmdir post vop_rmdir_post 307280304Sjkim 308109998Smarkmvop_rmdir { 309280304Sjkim IN struct vnode *dvp; 310280304Sjkim IN struct vnode *vp; 311280304Sjkim IN struct componentname *cnp; 312280304Sjkim}; 313280304Sjkim 314280304Sjkim 315280304Sjkim%% symlink dvp E E E 316280304Sjkim%% symlink vpp - E - 317280304Sjkim%! symlink post vop_symlink_post 318280304Sjkim 319280304Sjkimvop_symlink { 320280304Sjkim IN struct vnode *dvp; 321127128Snectar OUT struct vnode **vpp; 322280304Sjkim IN struct componentname *cnp; 323238405Sjkim IN struct vattr *vap; 324280304Sjkim IN char *target; 325280304Sjkim}; 326280304Sjkim 327280304Sjkim 328280304Sjkim%% readdir vp L L L 329280304Sjkim 330280304Sjkimvop_readdir { 331238405Sjkim IN struct vnode *vp; 332280304Sjkim INOUT struct uio *uio; 333280304Sjkim IN struct ucred *cred; 334109998Smarkm INOUT int *eofflag; 335280304Sjkim OUT int *ncookies; 336280304Sjkim INOUT u_long **cookies; 337280304Sjkim}; 338160814Ssimon 339280304Sjkim 340280304Sjkim%% readlink vp L L L 341280304Sjkim 342280304Sjkimvop_readlink { 343280304Sjkim IN struct vnode *vp; 344109998Smarkm INOUT struct uio *uio; 345280304Sjkim IN struct ucred *cred; 346280304Sjkim}; 347280304Sjkim 348280304Sjkim 349280304Sjkim%% inactive vp E E E 350280304Sjkim 351109998Smarkmvop_inactive { 352280304Sjkim IN struct vnode *vp; 353280304Sjkim IN struct thread *td; 354109998Smarkm}; 355109998Smarkm 356280304Sjkim 357280304Sjkim%% reclaim vp E E E 358280304Sjkim 359280304Sjkimvop_reclaim { 360280304Sjkim IN struct vnode *vp; 361280304Sjkim IN struct thread *td; 362109998Smarkm}; 363109998Smarkm 364109998Smarkm 365280304Sjkim%! lock1 pre vop_lock_pre 366238405Sjkim%! lock1 post vop_lock_post 367280304Sjkim 368280304Sjkimvop_lock1 { 369280304Sjkim IN struct vnode *vp; 370280304Sjkim IN int flags; 371280304Sjkim IN char *file; 372280304Sjkim IN int line; 373280304Sjkim}; 374280304Sjkim 375280304Sjkim 376280304Sjkim%! unlock pre vop_unlock_pre 377280304Sjkim%! unlock post vop_unlock_post 378280304Sjkim 379238405Sjkimvop_unlock { 380280304Sjkim IN struct vnode *vp; 381280304Sjkim IN int flags; 382111147Snectar}; 383280304Sjkim 384280304Sjkim 385280304Sjkim%% bmap vp L L L 386280304Sjkim 387280304Sjkimvop_bmap { 388280304Sjkim IN struct vnode *vp; 389111147Snectar IN daddr_t bn; 390238405Sjkim OUT struct bufobj **bop; 391280304Sjkim IN daddr_t *bnp; 392238405Sjkim OUT int *runp; 393280304Sjkim OUT int *runb; 394109998Smarkm}; 395280304Sjkim 396280304Sjkim 397%% strategy vp L L L 398%! strategy pre vop_strategy_pre 399 400vop_strategy { 401 IN struct vnode *vp; 402 IN struct buf *bp; 403}; 404 405 406%% getwritemount vp = = = 407 408vop_getwritemount { 409 IN struct vnode *vp; 410 OUT struct mount **mpp; 411}; 412 413 414%% print vp - - - 415 416vop_print { 417 IN struct vnode *vp; 418}; 419 420 421%% pathconf vp L L L 422 423vop_pathconf { 424 IN struct vnode *vp; 425 IN int name; 426 OUT register_t *retval; 427}; 428 429 430%% advlock vp U U U 431 432vop_advlock { 433 IN struct vnode *vp; 434 IN void *id; 435 IN int op; 436 IN struct flock *fl; 437 IN int flags; 438}; 439 440 441%% advlockasync vp U U U 442 443vop_advlockasync { 444 IN struct vnode *vp; 445 IN void *id; 446 IN int op; 447 IN struct flock *fl; 448 IN int flags; 449 IN struct task *task; 450 INOUT void **cookiep; 451}; 452 453 454%% advlockpurge vp E E E 455 456vop_advlockpurge { 457 IN struct vnode *vp; 458}; 459 460 461%% reallocblks vp E E E 462 463vop_reallocblks { 464 IN struct vnode *vp; 465 IN struct cluster_save *buflist; 466}; 467 468 469%% getpages vp L L L 470 471vop_getpages { 472 IN struct vnode *vp; 473 IN vm_page_t *m; 474 IN int count; 475 IN int reqpage; 476 IN vm_ooffset_t offset; 477}; 478 479 480%% putpages vp L L L 481 482vop_putpages { 483 IN struct vnode *vp; 484 IN vm_page_t *m; 485 IN int count; 486 IN int sync; 487 IN int *rtvals; 488 IN vm_ooffset_t offset; 489}; 490 491 492%% getacl vp L L L 493 494vop_getacl { 495 IN struct vnode *vp; 496 IN acl_type_t type; 497 OUT struct acl *aclp; 498 IN struct ucred *cred; 499 IN struct thread *td; 500}; 501 502 503%% setacl vp E E E 504 505vop_setacl { 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%% aclcheck vp = = = 515 516vop_aclcheck { 517 IN struct vnode *vp; 518 IN acl_type_t type; 519 IN struct acl *aclp; 520 IN struct ucred *cred; 521 IN struct thread *td; 522}; 523 524 525%% closeextattr vp L L L 526 527vop_closeextattr { 528 IN struct vnode *vp; 529 IN int commit; 530 IN struct ucred *cred; 531 IN struct thread *td; 532}; 533 534 535%% getextattr vp L L L 536 537vop_getextattr { 538 IN struct vnode *vp; 539 IN int attrnamespace; 540 IN const char *name; 541 INOUT struct uio *uio; 542 OUT size_t *size; 543 IN struct ucred *cred; 544 IN struct thread *td; 545}; 546 547 548%% listextattr vp L L L 549 550vop_listextattr { 551 IN struct vnode *vp; 552 IN int attrnamespace; 553 INOUT struct uio *uio; 554 OUT size_t *size; 555 IN struct ucred *cred; 556 IN struct thread *td; 557}; 558 559 560%% openextattr vp L L L 561 562vop_openextattr { 563 IN struct vnode *vp; 564 IN struct ucred *cred; 565 IN struct thread *td; 566}; 567 568 569%% deleteextattr vp E E E 570%! deleteextattr post vop_deleteextattr_post 571 572vop_deleteextattr { 573 IN struct vnode *vp; 574 IN int attrnamespace; 575 IN const char *name; 576 IN struct ucred *cred; 577 IN struct thread *td; 578}; 579 580 581%% setextattr vp E E E 582%! setextattr post vop_setextattr_post 583 584vop_setextattr { 585 IN struct vnode *vp; 586 IN int attrnamespace; 587 IN const char *name; 588 INOUT struct uio *uio; 589 IN struct ucred *cred; 590 IN struct thread *td; 591}; 592 593 594%% setlabel vp E E E 595 596vop_setlabel { 597 IN struct vnode *vp; 598 IN struct label *label; 599 IN struct ucred *cred; 600 IN struct thread *td; 601}; 602 603 604%% vptofh vp = = = 605 606vop_vptofh { 607 IN struct vnode *vp; 608 IN struct fid *fhp; 609}; 610 611 612%% vptocnp vp L L L 613%% vptocnp vpp - U - 614 615vop_vptocnp { 616 IN struct vnode *vp; 617 OUT struct vnode **vpp; 618 IN struct ucred *cred; 619 INOUT char *buf; 620 INOUT int *buflen; 621}; 622 623 624%% allocate vp E E E 625 626vop_allocate { 627 IN struct vnode *vp; 628 INOUT off_t *offset; 629 INOUT off_t *len; 630}; 631 632%% advise vp U U U 633 634vop_advise { 635 IN struct vnode *vp; 636 IN off_t start; 637 IN off_t end; 638 IN int advice; 639}; 640 641%% unp_bind vp E E E 642 643vop_unp_bind { 644 IN struct vnode *vp; 645 IN struct socket *socket; 646}; 647 648%% unp_connect vp L L L 649 650vop_unp_connect { 651 IN struct vnode *vp; 652 OUT struct socket **socket; 653}; 654 655%% unp_detach vp = = = 656 657vop_unp_detach { 658 IN struct vnode *vp; 659}; 660 661%% is_text vp L L L 662 663vop_is_text { 664 IN struct vnode *vp; 665}; 666 667%% set_text vp E E E 668 669vop_set_text { 670 IN struct vnode *vp; 671}; 672 673%% vop_unset_text vp E E E 674 675vop_unset_text { 676 IN struct vnode *vp; 677}; 678 679%% get_writecount vp L L L 680 681vop_get_writecount { 682 IN struct vnode *vp; 683 OUT int *writecount; 684}; 685 686%% add_writecount vp E E E 687 688vop_add_writecount { 689 IN struct vnode *vp; 690 IN int inc; 691}; 692 693# The VOPs below are spares at the end of the table to allow new VOPs to be 694# added in stable branches without breaking the KBI. New VOPs in HEAD should 695# be added above these spares. When merging a new VOP to a stable branch, 696# the new VOP should replace one of the spares. 697 698vop_spare1 { 699 IN struct vnode *vp; 700}; 701 702vop_spare2 { 703 IN struct vnode *vp; 704}; 705 706vop_spare3 { 707 IN struct vnode *vp; 708}; 709 710vop_spare4 { 711 IN struct vnode *vp; 712}; 713 714vop_spare5 { 715 IN struct vnode *vp; 716}; 717