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# 3. All advertising materials mentioning features or use of this software 14# must display the following acknowledgement: 15# This product includes software developed by the University of 16# California, Berkeley and its contributors. 17# 4. Neither the name of the University nor the names of its contributors 18# may be used to endorse or promote products derived from this software 19# without specific prior written permission. 20# 21# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31# SUCH DAMAGE. 32# 33# @(#)vnode_if.src 8.12 (Berkeley) 5/14/95 34# $Id: vnode_if.src,v 1.18 1998/07/04 20:45:32 julian Exp $ 35# 36 37# 38# Above each of the vop descriptors is a specification of the locking 39# protocol used by each vop call. The first column is the name of 40# the variable, the remaining three columns are in, out and error 41# respectively. The "in" column defines the lock state on input, 42# the "out" column defines the state on succesful return, and the 43# "error" column defines the locking state on error exit. 44# 45# The locking value can take the following values: 46# L: locked. 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 53# 54#% lookup dvp L ? ? 55#% lookup vpp - L - 56# 57# XXX - the lookup locking protocol defies simple description and depends 58# on the flags and operation fields in the (cnp) structure. Note 59# especially that *vpp may equal dvp and both may be locked. 60# 61vop_lookup { 62 IN struct vnode *dvp; 63 INOUT struct vnode **vpp; 64 IN struct componentname *cnp; 65}; 66 67# 68#% cachedlookup dvp L ? ? 69#% cachedlookup vpp - L - 70# 71# This must be an exact copy of lookup. See kern/vfs_cache.c for details. 72# 73vop_cachedlookup { 74 IN struct vnode *dvp; 75 INOUT struct vnode **vpp; 76 IN struct componentname *cnp; 77}; 78 79# 80#% create dvp L L L 81#% create vpp - L - 82# 83vop_create { 84 IN struct vnode *dvp; 85 OUT struct vnode **vpp; 86 IN struct componentname *cnp; 87 IN struct vattr *vap; 88}; 89 90# 91#% whiteout dvp L L L 92#% whiteout cnp - - - 93#% whiteout flag - - - 94# 95vop_whiteout { 96 IN struct vnode *dvp; 97 IN struct componentname *cnp; 98 IN int flags; 99}; 100 101# 102#% mknod dvp L L L 103#% mknod vpp - X - 104# 105vop_mknod { 106 IN struct vnode *dvp; 107 OUT WILLRELE 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 struct vnode *vp; 117 IN int mode; 118 IN struct ucred *cred; 119 IN struct proc *p; 120}; 121 122# 123#% close vp U U U 124# 125vop_close { 126 IN struct vnode *vp; 127 IN int fflag; 128 IN struct ucred *cred; 129 IN struct proc *p; 130}; 131 132# 133#% access vp L L L 134# 135vop_access { 136 IN struct vnode *vp; 137 IN int mode; 138 IN struct ucred *cred; 139 IN struct proc *p; 140}; 141 142# 143#% getattr vp = = = 144# 145vop_getattr { 146 IN struct vnode *vp; 147 IN struct vattr *vap; 148 IN struct ucred *cred; 149 IN struct proc *p; 150}; 151 152# 153#% setattr vp L L L 154# 155vop_setattr { 156 IN struct vnode *vp; 157 IN struct vattr *vap; 158 IN struct ucred *cred; 159 IN struct proc *p; 160}; 161 162# 163#% read vp L L L 164# 165vop_read { 166 IN struct vnode *vp; 167 INOUT struct uio *uio; 168 IN int ioflag; 169 IN struct ucred *cred; 170}; 171 172# 173#% write vp L L L 174# 175vop_write { 176 IN struct vnode *vp; 177 INOUT struct uio *uio; 178 IN int ioflag; 179 IN struct ucred *cred; 180}; 181 182# 183#% lease vp = = = 184# 185vop_lease { 186 IN struct vnode *vp; 187 IN struct proc *p; 188 IN struct ucred *cred; 189 IN int flag; 190}; 191 192# 193#% ioctl vp U U U 194# 195vop_ioctl { 196 IN struct vnode *vp; 197 IN u_long command; 198 IN caddr_t data; 199 IN int fflag; 200 IN struct ucred *cred; 201 IN struct proc *p; 202}; 203 204# 205#% poll vp U U U 206# 207vop_poll { 208 IN struct vnode *vp; 209 IN int events; 210 IN struct ucred *cred; 211 IN struct proc *p; 212}; 213 214# 215#% revoke vp U U U 216# 217vop_revoke { 218 IN struct vnode *vp; 219 IN int flags; 220}; 221 222# 223# XXX - not used 224# 225vop_mmap { 226 IN struct vnode *vp; 227 IN int fflags; 228 IN struct ucred *cred; 229 IN struct proc *p; 230}; 231 232# 233#% fsync vp L L L 234# 235vop_fsync { 236 IN struct vnode *vp; 237 IN struct ucred *cred; 238 IN int waitfor; 239 IN struct proc *p; 240}; 241 242# 243#% remove dvp L L L 244#% remove vp L L L 245# 246vop_remove { 247 IN struct vnode *dvp; 248 IN struct vnode *vp; 249 IN struct componentname *cnp; 250}; 251 252# 253#% link tdvp L L L 254#% link vp U U U 255# 256vop_link { 257 IN struct vnode *tdvp; 258 IN struct vnode *vp; 259 IN struct componentname *cnp; 260}; 261 262# 263#% rename fdvp U U U 264#% rename fvp U U U 265#% rename tdvp L U U 266#% rename tvp X U U 267# 268vop_rename { 269 IN WILLRELE struct vnode *fdvp; 270 IN WILLRELE struct vnode *fvp; 271 IN struct componentname *fcnp; 272 IN WILLRELE struct vnode *tdvp; 273 IN WILLRELE struct vnode *tvp; 274 IN struct componentname *tcnp; 275}; 276 277# 278#% mkdir dvp L L L 279#% mkdir vpp - L - 280# 281vop_mkdir { 282 IN struct vnode *dvp; 283 OUT struct vnode **vpp; 284 IN struct componentname *cnp; 285 IN struct vattr *vap; 286}; 287 288# 289#% rmdir dvp L L L 290#% rmdir vp L L L 291# 292vop_rmdir { 293 IN struct vnode *dvp; 294 IN struct vnode *vp; 295 IN struct componentname *cnp; 296}; 297 298# 299#% symlink dvp L L L 300#% symlink vpp - U - 301# 302# XXX - note that the return vnode has already been VRELE'ed 303# by the filesystem layer. To use it you must use vget, 304# possibly with a further namei. 305# 306vop_symlink { 307 IN struct vnode *dvp; 308 OUT WILLRELE struct vnode **vpp; 309 IN struct componentname *cnp; 310 IN struct vattr *vap; 311 IN char *target; 312}; 313 314# 315#% readdir vp L L L 316# 317vop_readdir { 318 IN struct vnode *vp; 319 INOUT struct uio *uio; 320 IN struct ucred *cred; 321 INOUT int *eofflag; 322 OUT int *ncookies; 323 INOUT u_long **cookies; 324}; 325 326# 327#% readlink vp L L L 328# 329vop_readlink { 330 IN struct vnode *vp; 331 INOUT struct uio *uio; 332 IN struct ucred *cred; 333}; 334 335# 336#% abortop dvp = = = 337# 338vop_abortop { 339 IN struct vnode *dvp; 340 IN struct componentname *cnp; 341}; 342 343# 344#% inactive vp L U U 345# 346vop_inactive { 347 IN struct vnode *vp; 348 IN struct proc *p; 349}; 350 351# 352#% reclaim vp U U U 353# 354vop_reclaim { 355 IN struct vnode *vp; 356 IN struct proc *p; 357}; 358 359# 360#% lock vp U L U 361# 362vop_lock { 363 IN struct vnode *vp; 364 IN int flags; 365 IN struct proc *p; 366}; 367 368# 369#% unlock vp L U L 370# 371vop_unlock { 372 IN struct vnode *vp; 373 IN int flags; 374 IN struct proc *p; 375}; 376 377# 378#% bmap vp L L L 379#% bmap vpp - U - 380# 381vop_bmap { 382 IN struct vnode *vp; 383 IN daddr_t bn; 384 OUT struct vnode **vpp; 385 IN daddr_t *bnp; 386 OUT int *runp; 387 OUT int *runb; 388}; 389 390# 391# Needs work: no vp? 392# 393vop_strategy { 394 IN struct vnode *vp; 395 IN struct buf *bp; 396}; 397 398# 399#% print vp = = = 400# 401vop_print { 402 IN struct vnode *vp; 403}; 404 405# 406#% islocked vp = = = 407# 408vop_islocked { 409 IN struct vnode *vp; 410}; 411 412# 413#% pathconf vp L L L 414# 415vop_pathconf { 416 IN struct vnode *vp; 417 IN int name; 418 OUT register_t *retval; 419}; 420 421# 422#% advlock vp U U U 423# 424vop_advlock { 425 IN struct vnode *vp; 426 IN caddr_t id; 427 IN int op; 428 IN struct flock *fl; 429 IN int flags; 430}; 431 432# 433#% balloc vp L L L 434# 435vop_balloc { 436 IN struct vnode *vp; 437 IN off_t startoffset; 438 IN int size; 439 IN struct ucred *cred; 440 IN int flags; 441 OUT struct buf **bpp; 442}; 443 444# 445#% reallocblks vp L L L 446# 447vop_reallocblks { 448 IN struct vnode *vp; 449 IN struct cluster_save *buflist; 450}; 451 452vop_getpages { 453 IN struct vnode *vp; 454 IN vm_page_t *m; 455 IN int count; 456 IN int reqpage; 457 IN vm_ooffset_t offset; 458}; 459 460vop_putpages { 461 IN struct vnode *vp; 462 IN vm_page_t *m; 463 IN int count; 464 IN int sync; 465 IN int *rtvals; 466 IN vm_ooffset_t offset; 467}; 468 469# 470#% freeblks vp - - - 471# 472# This call is used by the filesystem to release blocks back to 473# device-driver. This is useful if the driver has a lengthy 474# erase handling or similar. 475# 476 477vop_freeblks { 478 IN struct vnode *vp; 479 IN daddr_t addr; 480 IN daddr_t length; 481}; 482 483# 484# Needs work: no vp? 485# 486#vop_bwrite { 487# IN struct buf *bp; 488#}; 489