1# $NetBSD: vnode_if.src,v 1.85 2023/06/15 09:13:36 hannken Exp $ 2# 3# Copyright (c) 1992, 1993 4# The Regents of the University of California. All rights reserved. 5# 6# Redistribution and use in source and binary forms, with or without 7# modification, are permitted provided that the following conditions 8# are met: 9# 1. Redistributions of source code must retain the above copyright 10# notice, this list of conditions and the following disclaimer. 11# 2. Redistributions in binary form must reproduce the above copyright 12# notice, this list of conditions and the following disclaimer in the 13# documentation and/or other materials provided with the distribution. 14# 3. Neither the name of the University nor the names of its contributors 15# may be used to endorse or promote products derived from this software 16# without specific prior written permission. 17# 18# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 19# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 22# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28# SUCH DAMAGE. 29# 30# @(#)vnode_if.src 8.14 (Berkeley) 8/6/95 31# 32# 33 34# 35# Above each of the vop descriptors is a specification of the locking 36# protocol used by each vop call. The first column is the name of 37# the variable, the remaining three columns are in, out and error 38# respectively. The "in" column defines the lock state on input, 39# the "out" column defines the state on successful return, and the 40# "error" column defines the locking state on error exit. 41# 42# The locking value can take the following values: 43# L: locked. 44# U: unlocked. 45# -: not applicable. vnode does not yet (or no longer) exists. 46# =: the same on input and output, may be either L or U. 47# X: locked if not nil. 48# 49# For operations other than VOP_LOOKUP which require a component name 50# parameter, the flags required for the initial namei() call are listed. 51# Additional flags may be added to the namei() call, but these are required. 52# 53 54# 55#% bwrite vp = = = 56# 57vop_bwrite { 58 IN struct vnode *vp; 59 IN struct buf *bp; 60}; 61 62# 63#% parsepath dvp = = = 64# 65vop_parsepath { 66 FSTRANS=NO 67 IN struct vnode *dvp; 68 IN const char *name; 69 OUT size_t *retval; 70}; 71 72# 73#% lookup dvp L L L 74#% lookup vpp - U - 75# 76# Note especially that *vpp may equal dvp. 77# 78# More details: 79# All lookups find the named node (creating the vnode if needed) and 80# return it, referenced and unlocked, in *vpp. 81# On failure, *vpp is NULL, and *dvp is left locked. 82# 83vop_lookup { 84 VERSION 2 85 IN LOCKED=YES struct vnode *dvp; 86 OUT WILLMAKE struct vnode **vpp; 87 IN struct componentname *cnp; 88}; 89 90# 91#% create dvp L L L 92#% create vpp - U - 93# 94#! create cnp CREATE, LOCKPARENT 95# 96vop_create { 97 VERSION 3 98 POST=vop_create_post 99 IN LOCKED=EXCL struct vnode *dvp; 100 OUT WILLMAKE struct vnode **vpp; 101 IN struct componentname *cnp; 102 IN struct vattr *vap; 103}; 104 105# 106#% mknod dvp L L L 107#% mknod vpp - U - 108# 109#! mknod cnp CREATE, LOCKPARENT 110# 111vop_mknod { 112 VERSION 3 113 POST=vop_mknod_post 114 IN LOCKED=EXCL struct vnode *dvp; 115 OUT WILLMAKE struct vnode **vpp; 116 IN struct componentname *cnp; 117 IN struct vattr *vap; 118}; 119 120# 121#% open vp L L L 122# 123vop_open { 124 POST=vop_open_post 125 IN LOCKED=YES struct vnode *vp; 126 IN int mode; 127 IN kauth_cred_t cred; 128}; 129 130# 131#% close vp L L L 132# 133vop_close { 134 POST=vop_close_post 135 IN LOCKED=YES struct vnode *vp; 136 IN int fflag; 137 IN kauth_cred_t cred; 138}; 139 140# 141#% access vp L L L 142# 143vop_access { 144 IN LOCKED=YES struct vnode *vp; 145 IN accmode_t accmode; 146 IN kauth_cred_t cred; 147}; 148 149# 150#% accessx vp L L L 151# 152vop_accessx { 153 IN LOCKED=YES struct vnode *vp; 154 IN accmode_t accmode; 155 IN kauth_cred_t cred; 156}; 157 158# 159#% getattr vp L L L 160# 161vop_getattr { 162 IN LOCKED=YES struct vnode *vp; 163 IN struct vattr *vap; 164 IN kauth_cred_t cred; 165}; 166 167# 168#% setattr vp L L L 169# 170vop_setattr { 171 PRE=vop_setattr_pre 172 POST=vop_setattr_post 173 IN LOCKED=EXCL struct vnode *vp; 174 IN struct vattr *vap; 175 IN kauth_cred_t cred; 176}; 177 178# 179#% read vp L L L 180# 181vop_read { 182 POST=vop_read_post 183 IN LOCKED=YES struct vnode *vp; 184 INOUT struct uio *uio; 185 IN int ioflag; 186 IN kauth_cred_t cred; 187}; 188 189# 190#% write vp L L L 191# 192vop_write { 193 PRE=vop_write_pre 194 POST=vop_write_post 195 IN LOCKED=YES struct vnode *vp; 196 INOUT struct uio *uio; 197 IN int ioflag; 198 IN kauth_cred_t cred; 199}; 200 201# 202#% fallocate vp L L L 203# 204vop_fallocate { 205 IN LOCKED=YES struct vnode *vp; 206 IN off_t pos; 207 IN off_t len; 208}; 209 210# 211#% fdiscard vp L L L 212# 213vop_fdiscard { 214 IN LOCKED=YES struct vnode *vp; 215 IN off_t pos; 216 IN off_t len; 217}; 218 219# 220#% ioctl vp = = = 221# 222vop_ioctl { 223 FSTRANS=NO 224 IN struct vnode *vp; 225 IN u_long command; 226 IN void *data; 227 IN int fflag; 228 IN kauth_cred_t cred; 229}; 230 231# 232#% fcntl vp U U U 233# 234vop_fcntl { 235 FSTRANS=NO 236 IN LOCKED=NO struct vnode *vp; 237 IN u_int command; 238 IN void *data; 239 IN int fflag; 240 IN kauth_cred_t cred; 241}; 242 243# 244#% poll vp U U U 245# 246vop_poll { 247 IN LOCKED=NO struct vnode *vp; 248 IN int events; 249}; 250 251# 252#% kqfilter vp U U U 253# 254vop_kqfilter { 255 IN LOCKED=NO struct vnode *vp; 256 IN struct knote *kn; 257}; 258 259# 260#% revoke vp U U U 261# 262vop_revoke { 263 FSTRANS=NO 264 IN LOCKED=NO struct vnode *vp; 265 IN int flags; 266}; 267 268# 269#% mmap vp = = = 270# 271vop_mmap { 272 IN struct vnode *vp; 273 IN vm_prot_t prot; 274 IN kauth_cred_t cred; 275}; 276 277# 278#% fsync vp L L L 279# 280vop_fsync { 281 IN LOCKED=YES struct vnode *vp; 282 IN kauth_cred_t cred; 283 IN int flags; 284 IN off_t offlo; 285 IN off_t offhi; 286}; 287 288# 289# Needs work: Is newoff right? What's it mean? 290# XXX Locking protocol? 291# 292vop_seek { 293 IN struct vnode *vp; 294 IN off_t oldoff; 295 IN off_t newoff; 296 IN kauth_cred_t cred; 297}; 298 299# 300#% remove dvp L L L 301#% remove vp L U U 302# 303#! remove cnp DELETE, LOCKPARENT | LOCKLEAF 304# 305vop_remove { 306 VERSION 3 307 PRE=vop_remove_pre 308 POST=vop_remove_post 309 IN LOCKED=EXCL struct vnode *dvp; 310 IN LOCKED=YES WILLPUT struct vnode *vp; 311 IN struct componentname *cnp; 312 CONTEXT nlink_t vp_new_nlink; 313}; 314 315# 316#% link dvp L L L 317#% link vp U U U 318# 319#! link cnp CREATE, LOCKPARENT 320# 321vop_link { 322 VERSION 2 323 POST=vop_link_post 324 IN LOCKED=EXCL struct vnode *dvp; 325 IN LOCKED=NO struct vnode *vp; 326 IN struct componentname *cnp; 327}; 328 329# 330#% rename fdvp U U U 331#% rename fvp U U U 332#% rename tdvp L U U 333#% rename tvp X U U 334# 335#! rename fcnp DELETE, LOCKPARENT 336#! rename tcnp RENAME, LOCKPARENT | LOCKLEAF | NOCACHE 337# 338vop_rename { 339 IN WILLRELE struct vnode *fdvp; 340 IN WILLRELE struct vnode *fvp; 341 IN struct componentname *fcnp; 342 IN LOCKED=YES WILLPUT struct vnode *tdvp; 343 IN WILLPUT struct vnode *tvp; 344 IN struct componentname *tcnp; 345}; 346 347# 348#% mkdir dvp L L L 349#% mkdir vpp - U - 350# 351#! mkdir cnp CREATE, LOCKPARENT 352# 353vop_mkdir { 354 VERSION 3 355 POST=vop_mkdir_post 356 IN LOCKED=EXCL struct vnode *dvp; 357 OUT WILLMAKE struct vnode **vpp; 358 IN struct componentname *cnp; 359 IN struct vattr *vap; 360}; 361 362# 363#% rmdir dvp L L L 364#% rmdir vp L U U 365# 366#! rmdir cnp DELETE, LOCKPARENT | LOCKLEAF 367# 368vop_rmdir { 369 VERSION 2 370 PRE=vop_rmdir_pre 371 POST=vop_rmdir_post 372 IN LOCKED=EXCL struct vnode *dvp; 373 IN LOCKED=EXCL WILLPUT struct vnode *vp; 374 IN struct componentname *cnp; 375}; 376 377# 378#% symlink dvp L L L 379#% symlink vpp - U - 380# 381#! symlink cnp CREATE, LOCKPARENT 382# 383vop_symlink { 384 VERSION 3 385 POST=vop_symlink_post 386 IN LOCKED=EXCL struct vnode *dvp; 387 OUT WILLMAKE struct vnode **vpp; 388 IN struct componentname *cnp; 389 IN struct vattr *vap; 390 IN char *target; 391}; 392 393# 394#% readdir vp L L L 395# 396vop_readdir { 397 IN LOCKED=YES struct vnode *vp; 398 INOUT struct uio *uio; 399 IN kauth_cred_t cred; 400 OUT int *eofflag; 401 OUT off_t **cookies; 402 IN int *ncookies; 403}; 404 405# 406#% readlink vp L L L 407# 408vop_readlink { 409 IN LOCKED=YES struct vnode *vp; 410 INOUT struct uio *uio; 411 IN kauth_cred_t cred; 412}; 413 414# 415#% abortop dvp = = = 416# 417#! abortop cnp as appropriate. 418# 419vop_abortop { 420 IN struct vnode *dvp; 421 IN struct componentname *cnp; 422}; 423 424# 425#% inactive vp L L L 426# 427vop_inactive { 428 VERSION 2 429 IN LOCKED=EXCL struct vnode *vp; 430 INOUT bool *recycle; 431}; 432 433# 434#% reclaim vp L U U 435# 436vop_reclaim { 437 VERSION 2 438 FSTRANS=NO 439 IN LOCKED=EXCL struct vnode *vp; 440}; 441 442# 443#% lock vp U L U 444# 445vop_lock { 446 FSTRANS=LOCK 447 IN struct vnode *vp; 448 IN int flags; 449}; 450 451# 452#% unlock vp L U L 453# 454vop_unlock { 455 FSTRANS=UNLOCK 456 IN LOCKED=YES struct vnode *vp; 457}; 458 459# 460#% bmap vp = = = 461#% bmap vpp - U - 462# 463vop_bmap { 464 IN struct vnode *vp; 465 IN daddr_t bn; 466 OUT struct vnode **vpp; 467 IN daddr_t *bnp; 468 OUT int *runp; 469}; 470 471# 472#% strategy vp = = = 473# 474vop_strategy { 475 FSTRANS=NO 476 IN struct vnode *vp; 477 IN struct buf *bp; 478}; 479 480# 481#% print vp = = = 482# 483vop_print { 484 IN struct vnode *vp; 485}; 486 487# 488#% islocked vp = = = 489# 490vop_islocked { 491 FSTRANS=NO 492 IN struct vnode *vp; 493}; 494 495# 496#% pathconf vp L L L 497# 498vop_pathconf { 499 IN LOCKED=YES struct vnode *vp; 500 IN int name; 501 OUT register_t *retval; 502}; 503 504# 505#% advlock vp U U U 506# 507vop_advlock { 508 FSTRANS=NO 509 IN LOCKED=NO struct vnode *vp; 510 IN void *id; 511 IN int op; 512 IN struct flock *fl; 513 IN int flags; 514}; 515 516# 517#% whiteout dvp L L L 518#% whiteout cnp - - - 519#% whiteout flag - - - 520# 521#! whiteout cnp CREATE, LOCKPARENT 522# 523vop_whiteout { 524 IN LOCKED=EXCL struct vnode *dvp; 525 IN struct componentname *cnp; 526 IN int flags; 527}; 528 529# 530#% getpages vp = = = 531# 532vop_getpages { 533 FSTRANS=NO 534 IN struct vnode *vp; 535 IN voff_t offset; 536 IN struct vm_page **m; 537 IN int *count; 538 IN int centeridx; 539 IN vm_prot_t access_type; 540 IN int advice; 541 IN int flags; 542}; 543 544# 545#% putpages vp = = = 546# 547vop_putpages { 548 FSTRANS=NO 549 IN struct vnode *vp; 550 IN voff_t offlo; 551 IN voff_t offhi; 552 IN int flags; 553}; 554 555# 556#% getacl vp L L L 557# 558vop_getacl { 559 IN struct vnode *vp; 560 IN acl_type_t type; 561 OUT struct acl *aclp; 562 IN kauth_cred_t cred; 563}; 564 565# 566#% setacl vp L L L 567# 568vop_setacl { 569 POST=vop_setacl_post 570 IN LOCKED=EXCL struct vnode *vp; 571 IN acl_type_t type; 572 IN struct acl *aclp; 573 IN kauth_cred_t cred; 574}; 575 576# 577#% aclcheck vp = = = 578# 579vop_aclcheck { 580 IN struct vnode *vp; 581 IN acl_type_t type; 582 IN struct acl *aclp; 583 IN kauth_cred_t cred; 584}; 585 586# 587#% closeextattr vp L L L 588# 589vop_closeextattr { 590 IN LOCKED=YES struct vnode *vp; 591 IN int commit; 592 IN kauth_cred_t cred; 593}; 594 595# 596#% getextattr vp L L L 597# 598vop_getextattr { 599 IN LOCKED=YES struct vnode *vp; 600 IN int attrnamespace; 601 IN const char *name; 602 INOUT struct uio *uio; 603 OUT size_t *size; 604 IN kauth_cred_t cred; 605}; 606 607# 608#% listextattr vp L L L 609# 610vop_listextattr { 611 IN LOCKED=YES struct vnode *vp; 612 IN int attrnamespace; 613 INOUT struct uio *uio; 614 OUT size_t *size; 615 IN int flag; 616 IN kauth_cred_t cred; 617}; 618 619# 620#% openextattr vp L L L 621# 622vop_openextattr { 623 IN LOCKED=YES struct vnode *vp; 624 IN kauth_cred_t cred; 625}; 626 627# 628#% deleteextattr vp L L L 629# 630vop_deleteextattr { 631 IN LOCKED=EXCL struct vnode *vp; 632 IN int attrnamespace; 633 IN const char *name; 634 IN kauth_cred_t cred; 635}; 636 637# 638#% setextattr vp L L L 639# 640vop_setextattr { 641 IN LOCKED=EXCL struct vnode *vp; 642 IN int attrnamespace; 643 IN const char *name; 644 INOUT struct uio *uio; 645 IN kauth_cred_t cred; 646}; 647