154647Smckusick# 263183Sbostic# Copyright (c) 1992, 1993 363183Sbostic# The Regents of the University of California. All rights reserved. 454647Smckusick# 554647Smckusick# %sccs.include.redist.sh% 654647Smckusick# 7*67113Spendry# @(#)vnode_if.src 8.4 (Berkeley) 05/09/94 854647Smckusick# 9*67113Spendry 10*67113Spendry# 11*67113Spendry# Above each of the vop descriptors is a specification of the locking 12*67113Spendry# protocol used by each vop call. The first column is the name of 13*67113Spendry# the variable, the remaining three columns are in, out and error 14*67113Spendry# respectively. The "in" column defines the lock state on input, 15*67113Spendry# the "out" column defines the state on succesful return, and the 16*67113Spendry# "error" column defines the locking state on error exit. 17*67113Spendry# 18*67113Spendry# The locking value can take the following values: 19*67113Spendry# L: locked. 20*67113Spendry# U: unlocked/ 21*67113Spendry# -: not applicable. vnode does not yet (or no longer) exists. 22*67113Spendry# =: the same on input and output, may be either L or U. 23*67113Spendry# X: locked if not nil. 24*67113Spendry# 25*67113Spendry 26*67113Spendry# 27*67113Spendry#% lookup dvp L ? ? 28*67113Spendry#% lookup vpp - L - 29*67113Spendry# 30*67113Spendry# XXX - the lookup locking protocol defies simple description and depends 31*67113Spendry# on the flags and operation fields in the (cnp) structure. Note 32*67113Spendry# especially that *vpp may equal dvp and both may be locked. 33*67113Spendry# 3454647Smckusickvop_lookup { 3554647Smckusick IN struct vnode *dvp; 3655087Spendry INOUT struct vnode **vpp; 3754647Smckusick IN struct componentname *cnp; 3854647Smckusick}; 3954647Smckusick 40*67113Spendry# 41*67113Spendry#% create dvp L U U 42*67113Spendry#% create vpp - L - 43*67113Spendry# 4454647Smckusickvop_create { 4554991Sheideman IN WILLRELE struct vnode *dvp; 4654647Smckusick OUT struct vnode **vpp; 4754647Smckusick IN struct componentname *cnp; 4854647Smckusick IN struct vattr *vap; 4954647Smckusick}; 5054647Smckusick 51*67113Spendry# 52*67113Spendry#% mknod dvp L U U 53*67113Spendry#% mknod vpp - X - 54*67113Spendry# 5554647Smckusickvop_mknod { 5654991Sheideman IN WILLRELE struct vnode *dvp; 5754991Sheideman OUT WILLRELE struct vnode **vpp; 5854647Smckusick IN struct componentname *cnp; 5954647Smckusick IN struct vattr *vap; 6054647Smckusick}; 6154647Smckusick 62*67113Spendry# 63*67113Spendry#% open vp L L L 64*67113Spendry# 6554647Smckusickvop_open { 6654647Smckusick IN struct vnode *vp; 6754647Smckusick IN int mode; 6854647Smckusick IN struct ucred *cred; 6954647Smckusick IN struct proc *p; 7054647Smckusick}; 7154647Smckusick 72*67113Spendry# 73*67113Spendry#% close vp U U U 74*67113Spendry# 7554647Smckusickvop_close { 7654647Smckusick IN struct vnode *vp; 7754647Smckusick IN int fflag; 7854647Smckusick IN struct ucred *cred; 7954647Smckusick IN struct proc *p; 8054647Smckusick}; 8154647Smckusick 82*67113Spendry# 83*67113Spendry#% access vp L L L 84*67113Spendry# 8554647Smckusickvop_access { 8654647Smckusick IN struct vnode *vp; 8754647Smckusick IN int mode; 8854647Smckusick IN struct ucred *cred; 8954647Smckusick IN struct proc *p; 9054647Smckusick}; 9154647Smckusick 92*67113Spendry# 93*67113Spendry#% getattr vp = = = 94*67113Spendry# 9554647Smckusickvop_getattr { 9654647Smckusick IN struct vnode *vp; 9754647Smckusick IN struct vattr *vap; 9854647Smckusick IN struct ucred *cred; 9954647Smckusick IN struct proc *p; 10054647Smckusick}; 10154647Smckusick 102*67113Spendry# 103*67113Spendry#% setattr vp L L L 104*67113Spendry# 10554647Smckusickvop_setattr { 10654647Smckusick IN struct vnode *vp; 10754647Smckusick IN struct vattr *vap; 10854647Smckusick IN struct ucred *cred; 10954647Smckusick IN struct proc *p; 11054647Smckusick}; 11154647Smckusick 112*67113Spendry# 113*67113Spendry#% read vp L L L 114*67113Spendry# 11554647Smckusickvop_read { 11654647Smckusick IN struct vnode *vp; 11754647Smckusick INOUT struct uio *uio; 11854647Smckusick IN int ioflag; 11954647Smckusick IN struct ucred *cred; 12054647Smckusick}; 12154647Smckusick 122*67113Spendry# 123*67113Spendry#% write vp L L L 124*67113Spendry# 12554647Smckusickvop_write { 12654647Smckusick IN struct vnode *vp; 12754647Smckusick INOUT struct uio *uio; 12854647Smckusick IN int ioflag; 12954647Smckusick IN struct ucred *cred; 13054647Smckusick}; 13154647Smckusick 132*67113Spendry# 133*67113Spendry#% ioctl vp U U U 134*67113Spendry# 13554647Smckusickvop_ioctl { 13654647Smckusick IN struct vnode *vp; 13754647Smckusick IN int command; 13854647Smckusick IN caddr_t data; 13954647Smckusick IN int fflag; 14054647Smckusick IN struct ucred *cred; 14154647Smckusick IN struct proc *p; 14254647Smckusick}; 14354647Smckusick 144*67113Spendry# 145*67113Spendry#% select vp U U U 146*67113Spendry# 14754647Smckusick# Needs work? (fflags) 14854647Smckusickvop_select { 14954647Smckusick IN struct vnode *vp; 15054647Smckusick IN int which; 15154647Smckusick IN int fflags; 15254647Smckusick IN struct ucred *cred; 15354647Smckusick IN struct proc *p; 15454647Smckusick}; 15554647Smckusick 156*67113Spendry# XXX - not used 15754647Smckusickvop_mmap { 15854647Smckusick IN struct vnode *vp; 15954647Smckusick IN int fflags; 16054647Smckusick IN struct ucred *cred; 16154647Smckusick IN struct proc *p; 16254647Smckusick}; 16354647Smckusick 164*67113Spendry# 165*67113Spendry#% fsync vp L L L 166*67113Spendry# 16754647Smckusickvop_fsync { 16854647Smckusick IN struct vnode *vp; 16954647Smckusick IN struct ucred *cred; 17054647Smckusick IN int waitfor; 17154647Smckusick IN struct proc *p; 17254647Smckusick}; 17354647Smckusick 174*67113Spendry# XXX - not used 17554647Smckusick# Needs word: Is newoff right? What's it mean? 17654647Smckusickvop_seek { 17754647Smckusick IN struct vnode *vp; 17854647Smckusick IN off_t oldoff; 17954647Smckusick IN off_t newoff; 18054647Smckusick IN struct ucred *cred; 18154647Smckusick}; 18254647Smckusick 183*67113Spendry# 184*67113Spendry#% remove dvp L U U 185*67113Spendry#% remove vp L U U 186*67113Spendry# 18754647Smckusickvop_remove { 18854991Sheideman IN WILLRELE struct vnode *dvp; 18954991Sheideman IN WILLRELE struct vnode *vp; 19054647Smckusick IN struct componentname *cnp; 19154647Smckusick}; 19254647Smckusick 193*67113Spendry# 194*67113Spendry#% link vp L U U 195*67113Spendry#% link tdvp U U U 196*67113Spendry# 19754647Smckusickvop_link { 19854991Sheideman IN WILLRELE struct vnode *vp; 19954647Smckusick IN struct vnode *tdvp; 20054647Smckusick IN struct componentname *cnp; 20154647Smckusick}; 20254647Smckusick 203*67113Spendry# 204*67113Spendry#% rename fdvp U U U 205*67113Spendry#% rename fvp U U U 206*67113Spendry#% rename tdvp L U U 207*67113Spendry#% rename tvp X U U 208*67113Spendry# 20954647Smckusickvop_rename { 21054991Sheideman IN WILLRELE struct vnode *fdvp; 21154991Sheideman IN WILLRELE struct vnode *fvp; 21254647Smckusick IN struct componentname *fcnp; 21354991Sheideman IN WILLRELE struct vnode *tdvp; 21454991Sheideman IN WILLRELE struct vnode *tvp; 21554647Smckusick IN struct componentname *tcnp; 21654647Smckusick}; 21754647Smckusick 218*67113Spendry# 219*67113Spendry#% mkdir dvp L U U 220*67113Spendry#% mkdir vpp - L - 221*67113Spendry# 22254647Smckusickvop_mkdir { 22354991Sheideman IN WILLRELE struct vnode *dvp; 22454647Smckusick OUT struct vnode **vpp; 22554647Smckusick IN struct componentname *cnp; 22654647Smckusick IN struct vattr *vap; 22754647Smckusick}; 22854647Smckusick 229*67113Spendry# 230*67113Spendry#% rmdir dvp L U U 231*67113Spendry#% rmdir vp L U U 232*67113Spendry# 23354647Smckusickvop_rmdir { 23454991Sheideman IN WILLRELE struct vnode *dvp; 23554991Sheideman IN WILLRELE struct vnode *vp; 23654647Smckusick IN struct componentname *cnp; 23754647Smckusick}; 23854647Smckusick 239*67113Spendry# 240*67113Spendry#% symlink dvp L U U 241*67113Spendry#% symlink vpp - U - 242*67113Spendry# XXX - note that the return vnode has already been VRELE'ed 243*67113Spendry# by the filesystem layer. To use it you must use vget, 244*67113Spendry# possibly with a further namei. 245*67113Spendry# 24654647Smckusickvop_symlink { 24754991Sheideman IN WILLRELE struct vnode *dvp; 24854991Sheideman OUT WILLRELE struct vnode **vpp; 24954647Smckusick IN struct componentname *cnp; 25054647Smckusick IN struct vattr *vap; 25154647Smckusick IN char *target; 25254647Smckusick}; 25354647Smckusick 254*67113Spendry# 255*67113Spendry#% readdir vp L L L 256*67113Spendry# 25754647Smckusickvop_readdir { 25854647Smckusick IN struct vnode *vp; 25954647Smckusick INOUT struct uio *uio; 26054647Smckusick IN struct ucred *cred; 26154647Smckusick}; 26254647Smckusick 263*67113Spendry# 264*67113Spendry#% readlink vp L L L 265*67113Spendry# 26654647Smckusickvop_readlink { 26754647Smckusick IN struct vnode *vp; 26854647Smckusick INOUT struct uio *uio; 26954647Smckusick IN struct ucred *cred; 27054647Smckusick}; 27154647Smckusick 272*67113Spendry# 273*67113Spendry#% abortop dvp = = = 274*67113Spendry# 27554647Smckusickvop_abortop { 27654647Smckusick IN struct vnode *dvp; 27754647Smckusick IN struct componentname *cnp; 27854647Smckusick}; 27954647Smckusick 280*67113Spendry# 281*67113Spendry#% inactive vp U U U 282*67113Spendry# 28354647Smckusickvop_inactive { 28454647Smckusick IN struct vnode *vp; 28554647Smckusick}; 28654647Smckusick 287*67113Spendry# 288*67113Spendry#% reclaim vp U U U 289*67113Spendry# 29054647Smckusickvop_reclaim { 29154647Smckusick IN struct vnode *vp; 29254647Smckusick}; 29354647Smckusick 294*67113Spendry# 295*67113Spendry#% lock vp U L U 296*67113Spendry# 29754647Smckusickvop_lock { 29854647Smckusick IN struct vnode *vp; 29954647Smckusick}; 30054647Smckusick 301*67113Spendry# 302*67113Spendry#% unlock vp L U L 303*67113Spendry# 30454647Smckusickvop_unlock { 30554647Smckusick IN struct vnode *vp; 30654647Smckusick}; 30754647Smckusick 308*67113Spendry# 309*67113Spendry#% bmap vp L L L 310*67113Spendry#% bmap vpp - U - 311*67113Spendry# 31254647Smckusickvop_bmap { 31354647Smckusick IN struct vnode *vp; 31454647Smckusick IN daddr_t bn; 31554647Smckusick OUT struct vnode **vpp; 31654647Smckusick IN daddr_t *bnp; 31756441Smargo OUT int *runp; 31854647Smckusick}; 31954647Smckusick 32054647Smckusick#vop_strategy { 32154647Smckusick# IN struct buf *bp; 32254647Smckusick#}; 32354647Smckusick 324*67113Spendry# 325*67113Spendry#% print vp = = = 326*67113Spendry# 32754647Smckusickvop_print { 32854647Smckusick IN struct vnode *vp; 32954647Smckusick}; 33054647Smckusick 331*67113Spendry# 332*67113Spendry#% islocked vp = = = 333*67113Spendry# 33454647Smckusickvop_islocked { 33554647Smckusick IN struct vnode *vp; 33654647Smckusick}; 33754647Smckusick 338*67113Spendry# 339*67113Spendry#% pathconf vp L L L 340*67113Spendry# 34160383Smckusickvop_pathconf { 34260383Smckusick IN struct vnode *vp; 34360383Smckusick IN int name; 34460383Smckusick OUT int *retval; 34560383Smckusick}; 34660383Smckusick 347*67113Spendry# 348*67113Spendry#% advlock vp U U U 349*67113Spendry# 35054647Smckusickvop_advlock { 35154647Smckusick IN struct vnode *vp; 35254647Smckusick IN caddr_t id; 35354647Smckusick IN int op; 35454647Smckusick IN struct flock *fl; 35554647Smckusick IN int flags; 35654647Smckusick}; 35754647Smckusick 358*67113Spendry# 359*67113Spendry#% blkatoff vp L L L 360*67113Spendry# 36154647Smckusickvop_blkatoff { 36254647Smckusick IN struct vnode *vp; 36354647Smckusick IN off_t offset; 36454647Smckusick OUT char **res; 36554647Smckusick OUT struct buf **bpp; 36654647Smckusick}; 36754647Smckusick 368*67113Spendry# 369*67113Spendry#% valloc pvp L L L 370*67113Spendry# 37154647Smckusickvop_valloc { 37254647Smckusick IN struct vnode *pvp; 37354647Smckusick IN int mode; 37454647Smckusick IN struct ucred *cred; 37554647Smckusick OUT struct vnode **vpp; 37654647Smckusick}; 37754647Smckusick 378*67113Spendry# 379*67113Spendry#% reallocblks vp L L L 380*67113Spendry# 38165976Smckusickvop_reallocblks { 38265976Smckusick IN struct vnode *vp; 38365976Smckusick IN struct cluster_save *buflist; 38465976Smckusick}; 38565976Smckusick 386*67113Spendry# 387*67113Spendry#% vfree pvp L L L 388*67113Spendry# 38954647Smckusickvop_vfree { 39054647Smckusick IN struct vnode *pvp; 39154647Smckusick IN ino_t ino; 39254647Smckusick IN int mode; 39354647Smckusick}; 39454647Smckusick 395*67113Spendry# 396*67113Spendry#% truncate vp L L L 397*67113Spendry# 39854647Smckusickvop_truncate { 39954647Smckusick IN struct vnode *vp; 40054647Smckusick IN off_t length; 40154647Smckusick IN int flags; 40254647Smckusick IN struct ucred *cred; 40354647Smckusick IN struct proc *p; 40454647Smckusick}; 40554647Smckusick 406*67113Spendry# 407*67113Spendry#% update vp L L L 408*67113Spendry# 40954647Smckusickvop_update { 41054647Smckusick IN struct vnode *vp; 41164415Sbostic IN struct timeval *access; 41264415Sbostic IN struct timeval *modify; 41354647Smckusick IN int waitfor; 41454647Smckusick}; 41554647Smckusick 41654647Smckusick# Needs work: no vp? 41754647Smckusick#vop_bwrite { 41854647Smckusick# IN struct buf *bp; 41954647Smckusick#}; 420