vnode_if.src revision 54795
123833Speter# 223833Speter# Copyright (c) 1992, 1993 323833Speter# The Regents of the University of California. All rights reserved. 423833Speter# 523833Speter# Redistribution and use in source and binary forms, with or without 623833Speter# modification, are permitted provided that the following conditions 723833Speter# are met: 823833Speter# 1. Redistributions of source code must retain the above copyright 923833Speter# notice, this list of conditions and the following disclaimer. 1023833Speter# 2. Redistributions in binary form must reproduce the above copyright 1123833Speter# notice, this list of conditions and the following disclaimer in the 1223833Speter# documentation and/or other materials provided with the distribution. 1323833Speter# 3. All advertising materials mentioning features or use of this software 1423833Speter# must display the following acknowledgement: 1523833Speter# This product includes software developed by the University of 1623833Speter# California, Berkeley and its contributors. 1723833Speter# 4. Neither the name of the University nor the names of its contributors 1823833Speter# may be used to endorse or promote products derived from this software 1923833Speter# without specific prior written permission. 2023833Speter# 2123833Speter# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 2223833Speter# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 2323833Speter# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 2423833Speter# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 2523833Speter# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2623833Speter# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2723833Speter# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2823833Speter# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2923833Speter# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 3023833Speter# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 3123833Speter# SUCH DAMAGE. 3223833Speter# 3323833Speter# @(#)vnode_if.src 8.12 (Berkeley) 5/14/95 3423833Speter# $FreeBSD: head/sys/kern/vnode_if.src 54795 1999-12-18 23:01:52Z eivind $ 3523833Speter# 3623833Speter 3723833Speter# 3823833Speter# Above each of the vop descriptors is a specification of the locking 3923833Speter# protocol used by each vop call. The first column is the name of 4092986Sobrien# the variable, the remaining three columns are in, out and error 4192986Sobrien# respectively. The "in" column defines the lock state on input, 4223833Speter# the "out" column defines the state on succesful return, and the 4371579Sdeischen# "error" column defines the locking state on error exit. 4423833Speter# 4523833Speter# The locking value can take the following values: 4623833Speter# L: locked; not converted to type of lock. 4723833Speter# A: any lock type. 4823833Speter# S: locked with shared lock. 4923833Speter# E: locked with exclusive lock for this process. 5023833Speter# O: locked with exclusive lock for other process. 5123833Speter# U: unlocked. 5271579Sdeischen# -: not applicable. vnode does not yet (or no longer) exists. 5323833Speter# =: the same on input and output, may be either L or U. 5423833Speter# X: locked if not nil. 5523833Speter# 5623833Speter 5723833Speter# 5823833Speter#% islocked vp = = = 5923833Speter# 6023833Spetervop_islocked { 6123833Speter IN struct vnode *vp; 6223833Speter IN struct proc *p; 6323833Speter}; 6423833Speter 6523833Speter# 6623833Speter#% lookup dvp L ? ? 6723833Speter#% lookup vpp - L - 6823833Speter# 6943937Sache# XXX - the lookup locking protocol defies simple description and depends 7023833Speter# on the flags and operation fields in the (cnp) structure. Note 7123833Speter# especially that *vpp may equal dvp and both may be locked. 7256698Sjasone# 7323833Spetervop_lookup { 7423833Speter IN struct vnode *dvp; 7523833Speter INOUT struct vnode **vpp; 7623833Speter IN struct componentname *cnp; 7723833Speter}; 7823833Speter 7923833Speter# 8023833Speter#% cachedlookup dvp L ? ? 8123833Speter#% cachedlookup vpp - L - 8223833Speter# 8323833Speter# This must be an exact copy of lookup. See kern/vfs_cache.c for details. 8423833Speter# 8523833Spetervop_cachedlookup { 8623833Speter IN struct vnode *dvp; 8723833Speter INOUT struct vnode **vpp; 8823833Speter IN struct componentname *cnp; 8923833Speter}; 9023833Speter 9123833Speter# 9223833Speter#% create dvp L L L 9323833Speter#% create vpp - L - 9423833Speter# 9523833Spetervop_create { 9623833Speter IN struct vnode *dvp; 9723833Speter OUT struct vnode **vpp; 9823833Speter IN struct componentname *cnp; 9923833Speter IN struct vattr *vap; 10023833Speter}; 10123833Speter 10223833Speter# 10323833Speter#% whiteout dvp L L L 10423833Speter# 10523833Spetervop_whiteout { 10623833Speter IN struct vnode *dvp; 10723833Speter IN struct componentname *cnp; 10843937Sache IN int flags; 10943937Sache}; 11043937Sache 11143937Sache# 11239327Simp#% mknod dvp L L L 11323833Speter#% mknod vpp - X - 11423833Speter# 11523833Spetervop_mknod { 11623833Speter IN struct vnode *dvp; 11723833Speter OUT struct vnode **vpp; 11823833Speter IN struct componentname *cnp; 11923833Speter IN struct vattr *vap; 12023833Speter}; 12123833Speter 12223833Speter# 12323833Speter#% open vp L L L 12423833Speter# 12523833Spetervop_open { 12623833Speter IN struct vnode *vp; 12723833Speter IN int mode; 12823833Speter IN struct ucred *cred; 12923833Speter IN struct proc *p; 13023833Speter}; 13123833Speter 13223833Speter# 13323833Speter#% close vp U U U 13423833Speter# 13523833Spetervop_close { 13623833Speter IN struct vnode *vp; 13723833Speter IN int fflag; 13823833Speter IN struct ucred *cred; 13923833Speter IN struct proc *p; 14023833Speter}; 14123833Speter 14223833Speter# 14323833Speter#% access vp L L L 14423833Speter# 14523833Spetervop_access { 14623833Speter IN struct vnode *vp; 14723833Speter IN int mode; 14823833Speter IN struct ucred *cred; 14923833Speter IN struct proc *p; 15023833Speter}; 15123833Speter 15223833Speter# 15323833Speter#% getattr vp = = = 15423833Speter# 15523833Spetervop_getattr { 15623833Speter IN struct vnode *vp; 15723833Speter IN struct vattr *vap; 15823833Speter IN struct ucred *cred; 15956698Sjasone IN struct proc *p; 16023833Speter}; 16123833Speter 16223833Speter# 16323833Speter#% setattr vp L L L 16456698Sjasone# 16523833Spetervop_setattr { 16623833Speter IN struct vnode *vp; 16723833Speter IN struct vattr *vap; 168 IN struct ucred *cred; 169 IN struct proc *p; 170}; 171 172# 173#% read vp L L L 174# 175vop_read { 176 IN struct vnode *vp; 177 INOUT struct uio *uio; 178 IN int ioflag; 179 IN struct ucred *cred; 180}; 181 182# 183#% write vp L L L 184# 185vop_write { 186 IN struct vnode *vp; 187 INOUT struct uio *uio; 188 IN int ioflag; 189 IN struct ucred *cred; 190}; 191 192# 193#% lease vp = = = 194# 195vop_lease { 196 IN struct vnode *vp; 197 IN struct proc *p; 198 IN struct ucred *cred; 199 IN int flag; 200}; 201 202# 203#% ioctl vp U U U 204# 205vop_ioctl { 206 IN struct vnode *vp; 207 IN u_long command; 208 IN caddr_t data; 209 IN int fflag; 210 IN struct ucred *cred; 211 IN struct proc *p; 212}; 213 214# 215#% poll vp U U U 216# 217vop_poll { 218 IN struct vnode *vp; 219 IN int events; 220 IN struct ucred *cred; 221 IN struct proc *p; 222}; 223 224# 225#% revoke vp U U U 226# 227vop_revoke { 228 IN struct vnode *vp; 229 IN int flags; 230}; 231 232# 233# XXX - not used 234# 235vop_mmap { 236 IN struct vnode *vp; 237 IN int fflags; 238 IN struct ucred *cred; 239 IN struct proc *p; 240}; 241 242# 243#% fsync vp L L L 244# 245vop_fsync { 246 IN struct vnode *vp; 247 IN struct ucred *cred; 248 IN int waitfor; 249 IN struct proc *p; 250}; 251 252# 253#% remove dvp L L L 254#% remove vp L L L 255# 256vop_remove { 257 IN struct vnode *dvp; 258 IN struct vnode *vp; 259 IN struct componentname *cnp; 260}; 261 262# 263#% link tdvp L L L 264#% link vp U U U 265# 266vop_link { 267 IN struct vnode *tdvp; 268 IN struct vnode *vp; 269 IN struct componentname *cnp; 270}; 271 272# 273#% rename fdvp U U U 274#% rename fvp U U U 275#% rename tdvp L U U 276#% rename tvp X U U 277# 278vop_rename { 279 IN WILLRELE struct vnode *fdvp; 280 IN WILLRELE struct vnode *fvp; 281 IN struct componentname *fcnp; 282 IN WILLRELE struct vnode *tdvp; 283 IN WILLRELE struct vnode *tvp; 284 IN struct componentname *tcnp; 285}; 286 287# 288#% mkdir dvp L L L 289#% mkdir vpp - L - 290# 291vop_mkdir { 292 IN struct vnode *dvp; 293 OUT struct vnode **vpp; 294 IN struct componentname *cnp; 295 IN struct vattr *vap; 296}; 297 298# 299#% rmdir dvp L L L 300#% rmdir vp L L L 301# 302vop_rmdir { 303 IN struct vnode *dvp; 304 IN struct vnode *vp; 305 IN struct componentname *cnp; 306}; 307 308# 309#% symlink dvp L L L 310#% symlink vpp - U - 311# 312vop_symlink { 313 IN struct vnode *dvp; 314 OUT struct vnode **vpp; 315 IN struct componentname *cnp; 316 IN struct vattr *vap; 317 IN char *target; 318}; 319 320# 321#% readdir vp L L L 322# 323vop_readdir { 324 IN struct vnode *vp; 325 INOUT struct uio *uio; 326 IN struct ucred *cred; 327 INOUT int *eofflag; 328 OUT int *ncookies; 329 INOUT u_long **cookies; 330}; 331 332# 333#% readlink vp L L L 334# 335vop_readlink { 336 IN struct vnode *vp; 337 INOUT struct uio *uio; 338 IN struct ucred *cred; 339}; 340 341# 342#% inactive vp L U U 343# 344vop_inactive { 345 IN struct vnode *vp; 346 IN struct proc *p; 347}; 348 349# 350#% reclaim vp U U U 351# 352vop_reclaim { 353 IN struct vnode *vp; 354 IN struct proc *p; 355}; 356 357# 358#% lock vp ? ? ? 359# 360vop_lock { 361 IN struct vnode *vp; 362 IN int flags; 363 IN struct proc *p; 364}; 365 366# 367#% unlock vp L U L 368# 369vop_unlock { 370 IN struct vnode *vp; 371 IN int flags; 372 IN struct proc *p; 373}; 374 375# 376#% bmap vp L L L 377#% bmap vpp - U - 378# 379vop_bmap { 380 IN struct vnode *vp; 381 IN daddr_t bn; 382 OUT struct vnode **vpp; 383 IN daddr_t *bnp; 384 OUT int *runp; 385 OUT int *runb; 386}; 387 388# 389#% strategy vp L L L 390# 391vop_strategy { 392 IN struct vnode *vp; 393 IN struct buf *bp; 394}; 395 396# 397#% print vp = = = 398# 399vop_print { 400 IN struct vnode *vp; 401}; 402 403# 404#% pathconf vp L L L 405# 406vop_pathconf { 407 IN struct vnode *vp; 408 IN int name; 409 OUT register_t *retval; 410}; 411 412# 413#% advlock vp U U U 414# 415vop_advlock { 416 IN struct vnode *vp; 417 IN caddr_t id; 418 IN int op; 419 IN struct flock *fl; 420 IN int flags; 421}; 422 423# 424#% balloc vp L L L 425# 426vop_balloc { 427 IN struct vnode *vp; 428 IN off_t startoffset; 429 IN int size; 430 IN struct ucred *cred; 431 IN int flags; 432 OUT struct buf **bpp; 433}; 434 435# 436#% reallocblks vp L L L 437# 438vop_reallocblks { 439 IN struct vnode *vp; 440 IN struct cluster_save *buflist; 441}; 442 443# 444#% getpages vp L L L 445# 446vop_getpages { 447 IN struct vnode *vp; 448 IN vm_page_t *m; 449 IN int count; 450 IN int reqpage; 451 IN vm_ooffset_t offset; 452}; 453 454# 455#% putpages vp L L L 456# 457vop_putpages { 458 IN struct vnode *vp; 459 IN vm_page_t *m; 460 IN int count; 461 IN int sync; 462 IN int *rtvals; 463 IN vm_ooffset_t offset; 464}; 465 466# 467#% freeblks vp - - - 468# 469# This call is used by the filesystem to release blocks back to 470# device-driver. This is useful if the driver has a lengthy 471# erase handling or similar. 472# 473 474vop_freeblks { 475 IN struct vnode *vp; 476 IN daddr_t addr; 477 IN daddr_t length; 478}; 479 480# 481#% bwrite vp L L L 482# 483vop_bwrite { 484 IN struct vnode *vp; 485 IN struct buf *bp; 486}; 487