1# $NetBSD: vnode_if.src,v 1.60 2011/01/02 06:58:45 dholland 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 L L 60#% lookup vpp - L - 61# 62# XXX - the lookup locking protocol defies simple description. 63# Note especially that *vpp may equal dvp. 64# 65# More details: 66# There are three types of lookups: ".", ".." (ISDOTDOT), and other. 67# On successful lookup of ".", a reference is added to dvp, and it 68# is returned in *vpp. 69# To look up ISDOTDOT, dvp is unlocked, the ".." node is locked, and 70# then dvp is relocked. This preserves the protocol of always 71# locking nodes from root ("/") downward and prevents deadlock. 72# Other lookups find the named node (creating the vnode if needed) and 73# return it, locked, in *vpp. 74# On failure, *vpp is NULL, and *dvp is left locked. 75# 76# *vpp is always locked on return if the operation succeeds. 77# Typically, if *vpp == dvp, you need to release twice, but 78# unlock only once. 79# 80vop_lookup { 81 IN struct vnode *dvp; 82 OUT WILLMAKE struct vnode **vpp; 83 IN struct componentname *cnp; 84}; 85 86# 87#% create dvp L U U 88#% create vpp - L - 89# 90#! create cnp CREATE, LOCKPARENT 91# 92vop_create { 93 IN LOCKED=YES WILLPUT struct vnode *dvp; 94 OUT WILLMAKE struct vnode **vpp; 95 IN struct componentname *cnp; 96 IN struct vattr *vap; 97}; 98 99# 100#% mknod dvp L U U 101#% mknod vpp - L - 102# 103#! mknod cnp CREATE, LOCKPARENT 104# 105vop_mknod { 106 IN LOCKED=YES WILLPUT struct vnode *dvp; 107 OUT WILLMAKE struct vnode **vpp; 108 IN struct componentname *cnp; 109 IN struct vattr *vap; 110}; 111 112# 113#% open vp L L L 114# 115vop_open { 116 IN LOCKED=YES struct vnode *vp; 117 IN int mode; 118 IN kauth_cred_t cred; 119}; 120 121# 122#% close vp L L L 123# 124vop_close { 125 IN LOCKED=YES struct vnode *vp; 126 IN int fflag; 127 IN kauth_cred_t cred; 128}; 129 130# 131#% access vp L L L 132# 133vop_access { 134 IN LOCKED=YES struct vnode *vp; 135 IN int mode; 136 IN kauth_cred_t cred; 137}; 138 139# 140#% getattr vp = = = 141# 142vop_getattr { 143 IN struct vnode *vp; 144 IN struct vattr *vap; 145 IN kauth_cred_t cred; 146}; 147 148# 149#% setattr vp L L L 150# 151vop_setattr { 152 IN LOCKED=YES struct vnode *vp; 153 IN struct vattr *vap; 154 IN kauth_cred_t cred; 155}; 156 157# 158#% read vp L L L 159# 160vop_read { 161 IN LOCKED=YES struct vnode *vp; 162 INOUT struct uio *uio; 163 IN int ioflag; 164 IN kauth_cred_t cred; 165}; 166 167# 168#% write vp L L L 169# 170vop_write { 171 IN LOCKED=YES struct vnode *vp; 172 INOUT struct uio *uio; 173 IN int ioflag; 174 IN kauth_cred_t cred; 175}; 176 177# 178#% ioctl vp U U U 179# 180vop_ioctl { 181 IN LOCKED=NO struct vnode *vp; 182 IN u_long command; 183 IN void *data; 184 IN int fflag; 185 IN kauth_cred_t cred; 186}; 187 188# 189#% fcntl vp U U U 190# 191vop_fcntl { 192 IN LOCKED=NO struct vnode *vp; 193 IN u_int command; 194 IN void *data; 195 IN int fflag; 196 IN kauth_cred_t cred; 197}; 198 199# 200#% poll vp U U U 201# 202vop_poll { 203 IN LOCKED=NO struct vnode *vp; 204 IN int events; 205}; 206 207# 208#% kqfilter vp U U U 209# 210vop_kqfilter { 211 IN LOCKED=NO struct vnode *vp; 212 IN struct knote *kn; 213}; 214 215# 216#% revoke vp U U U 217# 218vop_revoke { 219 IN LOCKED=NO struct vnode *vp; 220 IN int flags; 221}; 222 223# 224#% mmap vp = = = 225# 226vop_mmap { 227 IN struct vnode *vp; 228 IN vm_prot_t prot; 229 IN kauth_cred_t cred; 230}; 231 232# 233#% fsync vp L L L 234# 235vop_fsync { 236 IN LOCKED=YES struct vnode *vp; 237 IN kauth_cred_t cred; 238 IN int flags; 239 IN off_t offlo; 240 IN off_t offhi; 241}; 242 243# 244# Needs work: Is newoff right? What's it mean? 245# XXX Locking protocol? 246# 247vop_seek { 248 IN struct vnode *vp; 249 IN off_t oldoff; 250 IN off_t newoff; 251 IN kauth_cred_t cred; 252}; 253 254# 255#% remove dvp L U U 256#% remove vp L U U 257# 258#! remove cnp DELETE, LOCKPARENT | LOCKLEAF 259# 260vop_remove { 261 IN LOCKED=YES WILLPUT struct vnode *dvp; 262 IN LOCKED=YES WILLPUT struct vnode *vp; 263 IN struct componentname *cnp; 264}; 265 266# 267#% link dvp L U U 268#% link vp U U U 269# 270#! link cnp CREATE, LOCKPARENT 271# 272vop_link { 273 IN LOCKED=YES WILLPUT struct vnode *dvp; 274 IN LOCKED=NO struct vnode *vp; 275 IN struct componentname *cnp; 276}; 277 278# 279#% rename fdvp U U U 280#% rename fvp U U U 281#% rename tdvp L U U 282#% rename tvp X U U 283# 284#! rename fcnp DELETE, LOCKPARENT 285#! rename tcnp RENAME, LOCKPARENT | LOCKLEAF | NOCACHE 286# 287vop_rename { 288 IN LOCKED=NO WILLRELE struct vnode *fdvp; 289 IN LOCKED=NO WILLRELE struct vnode *fvp; 290 IN struct componentname *fcnp; 291 IN LOCKED=YES WILLPUT struct vnode *tdvp; 292 IN WILLPUT struct vnode *tvp; 293 IN struct componentname *tcnp; 294}; 295 296# 297#% mkdir dvp L U U 298#% mkdir vpp - L - 299# 300#! mkdir cnp CREATE, LOCKPARENT 301# 302vop_mkdir { 303 IN LOCKED=YES WILLPUT struct vnode *dvp; 304 OUT WILLMAKE struct vnode **vpp; 305 IN struct componentname *cnp; 306 IN struct vattr *vap; 307}; 308 309# 310#% rmdir dvp L U U 311#% rmdir vp L U U 312# 313#! rmdir cnp DELETE, LOCKPARENT | LOCKLEAF 314# 315vop_rmdir { 316 IN LOCKED=YES WILLPUT struct vnode *dvp; 317 IN LOCKED=YES WILLPUT struct vnode *vp; 318 IN struct componentname *cnp; 319}; 320 321# 322#% symlink dvp L U U 323#% symlink vpp - L - 324# 325#! symlink cnp CREATE, LOCKPARENT 326# 327vop_symlink { 328 IN LOCKED=YES WILLPUT struct vnode *dvp; 329 OUT WILLMAKE struct vnode **vpp; 330 IN struct componentname *cnp; 331 IN struct vattr *vap; 332 IN char *target; 333}; 334 335# 336#% readdir vp L L L 337# 338vop_readdir { 339 IN LOCKED=YES struct vnode *vp; 340 INOUT struct uio *uio; 341 IN kauth_cred_t cred; 342 OUT int *eofflag; 343 OUT off_t **cookies; 344 IN int *ncookies; 345}; 346 347# 348#% readlink vp L L L 349# 350vop_readlink { 351 IN LOCKED=YES struct vnode *vp; 352 INOUT struct uio *uio; 353 IN kauth_cred_t cred; 354}; 355 356# 357#% abortop dvp = = = 358# 359#! abortop cnp as appropriate. 360# 361vop_abortop { 362 IN struct vnode *dvp; 363 IN struct componentname *cnp; 364}; 365 366# 367#% inactive vp L U U 368# 369vop_inactive { 370 IN LOCKED=YES WILLUNLOCK struct vnode *vp; 371 INOUT bool *recycle; 372}; 373 374# 375#% reclaim vp U U U 376# 377vop_reclaim { 378 IN LOCKED=NO struct vnode *vp; 379}; 380 381# 382#% lock vp U L U 383# 384vop_lock { 385 IN LOCKED=NO struct vnode *vp; 386 IN int flags; 387}; 388 389# 390#% unlock vp L U L 391# 392vop_unlock { 393 IN LOCKED=YES struct vnode *vp; 394}; 395 396# 397#% bmap vp = = = 398#% bmap vpp - U - 399# 400vop_bmap { 401 IN struct vnode *vp; 402 IN daddr_t bn; 403 OUT struct vnode **vpp; 404 IN daddr_t *bnp; 405 OUT int *runp; 406}; 407 408# 409#% strategy vp = = = 410# 411vop_strategy { 412 IN struct vnode *vp; 413 IN struct buf *bp; 414}; 415 416# 417#% print vp = = = 418# 419vop_print { 420 IN struct vnode *vp; 421}; 422 423# 424#% islocked vp = = = 425# 426vop_islocked { 427 IN struct vnode *vp; 428}; 429 430# 431#% pathconf vp L L L 432# 433vop_pathconf { 434 IN LOCKED=YES struct vnode *vp; 435 IN int name; 436 OUT register_t *retval; 437}; 438 439# 440#% advlock vp U U U 441# 442vop_advlock { 443 IN LOCKED=NO struct vnode *vp; 444 IN void *id; 445 IN int op; 446 IN struct flock *fl; 447 IN int flags; 448}; 449 450# 451#% whiteout dvp L L L 452#% whiteout cnp - - - 453#% whiteout flag - - - 454# 455#! whiteout cnp CREATE, LOCKPARENT 456# 457vop_whiteout { 458 IN LOCKED=YES struct vnode *dvp; 459 IN struct componentname *cnp; 460 IN int flags; 461}; 462 463# 464# Needs work: no vp? 465# 466#vop_bwrite { 467# IN struct buf *bp; 468#}; 469 470# 471#% getpages vp = = = 472# 473vop_getpages { 474 IN struct vnode *vp; 475 IN voff_t offset; 476 IN struct vm_page **m; 477 IN int *count; 478 IN int centeridx; 479 IN vm_prot_t access_type; 480 IN int advice; 481 IN int flags; 482}; 483 484# 485#% putpages vp = = = 486# 487vop_putpages { 488 IN struct vnode *vp; 489 IN voff_t offlo; 490 IN voff_t offhi; 491 IN int flags; 492}; 493 494# 495#% closeextattr vp L L L 496# 497vop_closeextattr { 498 IN LOCKED=YES struct vnode *vp; 499 IN int commit; 500 IN kauth_cred_t cred; 501}; 502 503# 504#% getextattr vp L L L 505# 506vop_getextattr { 507 IN LOCKED=YES struct vnode *vp; 508 IN int attrnamespace; 509 IN const char *name; 510 INOUT struct uio *uio; 511 OUT size_t *size; 512 IN kauth_cred_t cred; 513}; 514 515# 516#% listextattr vp L L L 517# 518vop_listextattr { 519 IN LOCKED=YES struct vnode *vp; 520 IN int attrnamespace; 521 INOUT struct uio *uio; 522 OUT size_t *size; 523 IN kauth_cred_t cred; 524}; 525 526# 527#% openextattr vp L L L 528# 529vop_openextattr { 530 IN LOCKED=YES struct vnode *vp; 531 IN kauth_cred_t cred; 532}; 533 534# 535#% deleteextattr vp L L L 536# 537vop_deleteextattr { 538 IN LOCKED=YES struct vnode *vp; 539 IN int attrnamespace; 540 IN const char *name; 541 IN kauth_cred_t cred; 542}; 543 544# 545#% setextattr vp L L L 546# 547vop_setextattr { 548 IN LOCKED=YES struct vnode *vp; 549 IN int attrnamespace; 550 IN const char *name; 551 INOUT struct uio *uio; 552 IN kauth_cred_t cred; 553}; 554