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