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*69405Smckusick# @(#)vnode_if.src 8.12 (Berkeley) 05/14/95 854647Smckusick# 967113Spendry 1067113Spendry# 1167113Spendry# Above each of the vop descriptors is a specification of the locking 1267113Spendry# protocol used by each vop call. The first column is the name of 1367113Spendry# the variable, the remaining three columns are in, out and error 1467113Spendry# respectively. The "in" column defines the lock state on input, 1567113Spendry# the "out" column defines the state on succesful return, and the 1667113Spendry# "error" column defines the locking state on error exit. 1767113Spendry# 1867113Spendry# The locking value can take the following values: 1967113Spendry# L: locked. 2067113Spendry# U: unlocked/ 2167113Spendry# -: not applicable. vnode does not yet (or no longer) exists. 2267113Spendry# =: the same on input and output, may be either L or U. 2367113Spendry# X: locked if not nil. 2467113Spendry# 2567113Spendry 2667113Spendry# 2767113Spendry#% lookup dvp L ? ? 2867113Spendry#% lookup vpp - L - 2967113Spendry# 3067113Spendry# XXX - the lookup locking protocol defies simple description and depends 3168297Scgd# on the flags and operation fields in the (cnp) structure. Note 3268297Scgd# especially that *vpp may equal dvp and both may be locked. 3367113Spendry# 3454647Smckusickvop_lookup { 3554647Smckusick IN struct vnode *dvp; 3655087Spendry INOUT struct vnode **vpp; 3754647Smckusick IN struct componentname *cnp; 3854647Smckusick}; 3954647Smckusick 4067113Spendry# 4167113Spendry#% create dvp L U U 4267113Spendry#% create vpp - L - 4367113Spendry# 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 5167113Spendry# 5267518Spendry#% whiteout dvp L L L 5367518Spendry#% whiteout cnp - - - 5467518Spendry#% whiteout flag - - - 5568297Scgd# 5667518Spendryvop_whiteout { 5767518Spendry IN WILLRELE struct vnode *dvp; 5867518Spendry IN struct componentname *cnp; 5967518Spendry IN int flags; 6067518Spendry}; 6167518Spendry 6267518Spendry# 6367113Spendry#% mknod dvp L U U 6467113Spendry#% mknod vpp - X - 6567113Spendry# 6654647Smckusickvop_mknod { 6754991Sheideman IN WILLRELE struct vnode *dvp; 6854991Sheideman OUT WILLRELE struct vnode **vpp; 6954647Smckusick IN struct componentname *cnp; 7054647Smckusick IN struct vattr *vap; 7154647Smckusick}; 7254647Smckusick 7367113Spendry# 7468297Scgd#% open vp L L L 7567113Spendry# 7654647Smckusickvop_open { 7754647Smckusick IN struct vnode *vp; 7854647Smckusick IN int mode; 7954647Smckusick IN struct ucred *cred; 8054647Smckusick IN struct proc *p; 8154647Smckusick}; 8254647Smckusick 8367113Spendry# 8467113Spendry#% close vp U U U 8567113Spendry# 8654647Smckusickvop_close { 8754647Smckusick IN struct vnode *vp; 8854647Smckusick IN int fflag; 8954647Smckusick IN struct ucred *cred; 9054647Smckusick IN struct proc *p; 9154647Smckusick}; 9254647Smckusick 9367113Spendry# 9467113Spendry#% access vp L L L 9567113Spendry# 9654647Smckusickvop_access { 9754647Smckusick IN struct vnode *vp; 9854647Smckusick IN int mode; 9954647Smckusick IN struct ucred *cred; 10054647Smckusick IN struct proc *p; 10154647Smckusick}; 10254647Smckusick 10367113Spendry# 10467113Spendry#% getattr vp = = = 10567113Spendry# 10654647Smckusickvop_getattr { 10754647Smckusick IN struct vnode *vp; 10854647Smckusick IN struct vattr *vap; 10954647Smckusick IN struct ucred *cred; 11054647Smckusick IN struct proc *p; 11154647Smckusick}; 11254647Smckusick 11367113Spendry# 11467113Spendry#% setattr vp L L L 11567113Spendry# 11654647Smckusickvop_setattr { 11754647Smckusick IN struct vnode *vp; 11854647Smckusick IN struct vattr *vap; 11954647Smckusick IN struct ucred *cred; 12054647Smckusick IN struct proc *p; 12154647Smckusick}; 12254647Smckusick 12367113Spendry# 12468297Scgd#% read vp L L L 12567113Spendry# 12654647Smckusickvop_read { 12754647Smckusick IN struct vnode *vp; 12854647Smckusick INOUT struct uio *uio; 12954647Smckusick IN int ioflag; 13054647Smckusick IN struct ucred *cred; 13154647Smckusick}; 13254647Smckusick 13367113Spendry# 13467113Spendry#% write vp L L L 13567113Spendry# 13654647Smckusickvop_write { 13754647Smckusick IN struct vnode *vp; 13854647Smckusick INOUT struct uio *uio; 13954647Smckusick IN int ioflag; 14054647Smckusick IN struct ucred *cred; 14154647Smckusick}; 14254647Smckusick 14367113Spendry# 14467637Smckusick#% lease vp = = = 14567637Smckusick# 14667637Smckusickvop_lease { 14767637Smckusick IN struct vnode *vp; 14867637Smckusick IN struct proc *p; 14967637Smckusick IN struct ucred *cred; 15067637Smckusick IN int flag; 15167637Smckusick}; 15267637Smckusick 15367637Smckusick# 15467113Spendry#% ioctl vp U U U 15567113Spendry# 15654647Smckusickvop_ioctl { 15754647Smckusick IN struct vnode *vp; 15868297Scgd IN u_long command; 15954647Smckusick IN caddr_t data; 16054647Smckusick IN int fflag; 16154647Smckusick IN struct ucred *cred; 16254647Smckusick IN struct proc *p; 16354647Smckusick}; 16454647Smckusick 16567113Spendry# 16667113Spendry#% select vp U U U 16767113Spendry# 16854647Smckusick# Needs work? (fflags) 16968297Scgd# 17054647Smckusickvop_select { 17154647Smckusick IN struct vnode *vp; 17254647Smckusick IN int which; 17354647Smckusick IN int fflags; 17454647Smckusick IN struct ucred *cred; 17554647Smckusick IN struct proc *p; 17654647Smckusick}; 17754647Smckusick 17868297Scgd# 17968420Smckusick#% revoke vp U U U 18068420Smckusick# 18168420Smckusickvop_revoke { 18268420Smckusick IN struct vnode *vp; 18368420Smckusick IN int flags; 18468420Smckusick}; 18568420Smckusick 18668420Smckusick# 18767113Spendry# XXX - not used 18868297Scgd# 18954647Smckusickvop_mmap { 19054647Smckusick IN struct vnode *vp; 19154647Smckusick IN int fflags; 19254647Smckusick IN struct ucred *cred; 19354647Smckusick IN struct proc *p; 19454647Smckusick}; 19554647Smckusick 19667113Spendry# 19767113Spendry#% fsync vp L L L 19867113Spendry# 19954647Smckusickvop_fsync { 20054647Smckusick IN struct vnode *vp; 20154647Smckusick IN struct ucred *cred; 20254647Smckusick IN int waitfor; 20354647Smckusick IN struct proc *p; 20454647Smckusick}; 20554647Smckusick 20668297Scgd# 20767113Spendry# XXX - not used 20868297Scgd# Needs work: Is newoff right? What's it mean? 20968297Scgd# 21054647Smckusickvop_seek { 21154647Smckusick IN struct vnode *vp; 21254647Smckusick IN off_t oldoff; 21354647Smckusick IN off_t newoff; 21454647Smckusick IN struct ucred *cred; 21554647Smckusick}; 21654647Smckusick 21767113Spendry# 21867113Spendry#% remove dvp L U U 21967113Spendry#% remove vp L U U 22067113Spendry# 22154647Smckusickvop_remove { 22254991Sheideman IN WILLRELE struct vnode *dvp; 22354991Sheideman IN WILLRELE struct vnode *vp; 22454647Smckusick IN struct componentname *cnp; 22554647Smckusick}; 22654647Smckusick 22767113Spendry# 22868297Scgd#% link vp U U U 22968297Scgd#% link tdvp L U U 23067113Spendry# 23154647Smckusickvop_link { 23254991Sheideman IN WILLRELE struct vnode *vp; 23354647Smckusick IN struct vnode *tdvp; 23454647Smckusick IN struct componentname *cnp; 23554647Smckusick}; 23654647Smckusick 23767113Spendry# 23867113Spendry#% rename fdvp U U U 23967113Spendry#% rename fvp U U U 24067113Spendry#% rename tdvp L U U 24167113Spendry#% rename tvp X U U 24267113Spendry# 24354647Smckusickvop_rename { 24454991Sheideman IN WILLRELE struct vnode *fdvp; 24554991Sheideman IN WILLRELE struct vnode *fvp; 24654647Smckusick IN struct componentname *fcnp; 24754991Sheideman IN WILLRELE struct vnode *tdvp; 24854991Sheideman IN WILLRELE struct vnode *tvp; 24954647Smckusick IN struct componentname *tcnp; 25054647Smckusick}; 25154647Smckusick 25267113Spendry# 25367113Spendry#% mkdir dvp L U U 25467113Spendry#% mkdir vpp - L - 25567113Spendry# 25654647Smckusickvop_mkdir { 25754991Sheideman IN WILLRELE struct vnode *dvp; 25854647Smckusick OUT struct vnode **vpp; 25954647Smckusick IN struct componentname *cnp; 26054647Smckusick IN struct vattr *vap; 26154647Smckusick}; 26254647Smckusick 26367113Spendry# 26467113Spendry#% rmdir dvp L U U 26567113Spendry#% rmdir vp L U U 26667113Spendry# 26754647Smckusickvop_rmdir { 26854991Sheideman IN WILLRELE struct vnode *dvp; 26954991Sheideman IN WILLRELE struct vnode *vp; 27054647Smckusick IN struct componentname *cnp; 27154647Smckusick}; 27254647Smckusick 27367113Spendry# 27467113Spendry#% symlink dvp L U U 27567113Spendry#% symlink vpp - U - 27668297Scgd# 27767113Spendry# XXX - note that the return vnode has already been VRELE'ed 27868297Scgd# by the filesystem layer. To use it you must use vget, 27968297Scgd# possibly with a further namei. 28067113Spendry# 28154647Smckusickvop_symlink { 28254991Sheideman IN WILLRELE struct vnode *dvp; 28354991Sheideman OUT WILLRELE struct vnode **vpp; 28454647Smckusick IN struct componentname *cnp; 28554647Smckusick IN struct vattr *vap; 28654647Smckusick IN char *target; 28754647Smckusick}; 28854647Smckusick 28967113Spendry# 29067113Spendry#% readdir vp L L L 29167113Spendry# 29254647Smckusickvop_readdir { 29354647Smckusick IN struct vnode *vp; 29454647Smckusick INOUT struct uio *uio; 29554647Smckusick IN struct ucred *cred; 29667361Smckusick INOUT int *eofflag; 29768660Smckusick OUT int *ncookies; 29868660Smckusick INOUT u_long **cookies; 29954647Smckusick}; 30054647Smckusick 30167113Spendry# 30267113Spendry#% readlink vp L L L 30367113Spendry# 30454647Smckusickvop_readlink { 30554647Smckusick IN struct vnode *vp; 30654647Smckusick INOUT struct uio *uio; 30754647Smckusick IN struct ucred *cred; 30854647Smckusick}; 30954647Smckusick 31067113Spendry# 31167113Spendry#% abortop dvp = = = 31267113Spendry# 31354647Smckusickvop_abortop { 31454647Smckusick IN struct vnode *dvp; 31554647Smckusick IN struct componentname *cnp; 31654647Smckusick}; 31754647Smckusick 31867113Spendry# 319*69405Smckusick#% inactive vp L U U 32067113Spendry# 32154647Smckusickvop_inactive { 32254647Smckusick IN struct vnode *vp; 323*69405Smckusick IN struct proc *p; 32454647Smckusick}; 32554647Smckusick 32667113Spendry# 32767113Spendry#% reclaim vp U U U 32867113Spendry# 32954647Smckusickvop_reclaim { 33054647Smckusick IN struct vnode *vp; 331*69405Smckusick IN struct proc *p; 33254647Smckusick}; 33354647Smckusick 33467113Spendry# 33568297Scgd#% lock vp U L U 33667113Spendry# 33754647Smckusickvop_lock { 33854647Smckusick IN struct vnode *vp; 33968791Smckusick IN int flags; 34068791Smckusick IN struct proc *p; 34154647Smckusick}; 34254647Smckusick 34367113Spendry# 34467113Spendry#% unlock vp L U L 34567113Spendry# 34654647Smckusickvop_unlock { 34754647Smckusick IN struct vnode *vp; 34868791Smckusick IN int flags; 34968791Smckusick IN struct proc *p; 35054647Smckusick}; 35154647Smckusick 35267113Spendry# 35368297Scgd#% bmap vp L L L 35468297Scgd#% bmap vpp - U - 35567113Spendry# 35654647Smckusickvop_bmap { 35754647Smckusick IN struct vnode *vp; 35854647Smckusick IN daddr_t bn; 35954647Smckusick OUT struct vnode **vpp; 36054647Smckusick IN daddr_t *bnp; 36156441Smargo OUT int *runp; 36254647Smckusick}; 36354647Smckusick 36468297Scgd# 36568297Scgd# Needs work: no vp? 36668297Scgd# 36754647Smckusick#vop_strategy { 36854647Smckusick# IN struct buf *bp; 36954647Smckusick#}; 37054647Smckusick 37167113Spendry# 37267113Spendry#% print vp = = = 37367113Spendry# 37454647Smckusickvop_print { 37554647Smckusick IN struct vnode *vp; 37654647Smckusick}; 37754647Smckusick 37867113Spendry# 37967113Spendry#% islocked vp = = = 38067113Spendry# 38154647Smckusickvop_islocked { 38254647Smckusick IN struct vnode *vp; 38354647Smckusick}; 38454647Smckusick 38567113Spendry# 38667113Spendry#% pathconf vp L L L 38767113Spendry# 38860383Smckusickvop_pathconf { 38960383Smckusick IN struct vnode *vp; 39060383Smckusick IN int name; 39168297Scgd OUT register_t *retval; 39260383Smckusick}; 39360383Smckusick 39467113Spendry# 39567113Spendry#% advlock vp U U U 39667113Spendry# 39754647Smckusickvop_advlock { 39854647Smckusick IN struct vnode *vp; 39954647Smckusick IN caddr_t id; 40054647Smckusick IN int op; 40154647Smckusick IN struct flock *fl; 40254647Smckusick IN int flags; 40354647Smckusick}; 40454647Smckusick 40567113Spendry# 40667113Spendry#% blkatoff vp L L L 40767113Spendry# 40854647Smckusickvop_blkatoff { 40954647Smckusick IN struct vnode *vp; 41054647Smckusick IN off_t offset; 41154647Smckusick OUT char **res; 41254647Smckusick OUT struct buf **bpp; 41354647Smckusick}; 41454647Smckusick 41567113Spendry# 41667113Spendry#% valloc pvp L L L 41767113Spendry# 41854647Smckusickvop_valloc { 41954647Smckusick IN struct vnode *pvp; 42054647Smckusick IN int mode; 42154647Smckusick IN struct ucred *cred; 42254647Smckusick OUT struct vnode **vpp; 42354647Smckusick}; 42454647Smckusick 42567113Spendry# 42667113Spendry#% reallocblks vp L L L 42767113Spendry# 42865976Smckusickvop_reallocblks { 42965976Smckusick IN struct vnode *vp; 43065976Smckusick IN struct cluster_save *buflist; 43165976Smckusick}; 43265976Smckusick 43367113Spendry# 43467113Spendry#% vfree pvp L L L 43567113Spendry# 43654647Smckusickvop_vfree { 43754647Smckusick IN struct vnode *pvp; 43854647Smckusick IN ino_t ino; 43954647Smckusick IN int mode; 44054647Smckusick}; 44154647Smckusick 44267113Spendry# 44367113Spendry#% truncate vp L L L 44467113Spendry# 44554647Smckusickvop_truncate { 44654647Smckusick IN struct vnode *vp; 44754647Smckusick IN off_t length; 44854647Smckusick IN int flags; 44954647Smckusick IN struct ucred *cred; 45054647Smckusick IN struct proc *p; 45154647Smckusick}; 45254647Smckusick 45367113Spendry# 45467113Spendry#% update vp L L L 45567113Spendry# 45654647Smckusickvop_update { 45754647Smckusick IN struct vnode *vp; 45864415Sbostic IN struct timeval *access; 45964415Sbostic IN struct timeval *modify; 46054647Smckusick IN int waitfor; 46154647Smckusick}; 46254647Smckusick 46368297Scgd# 46454647Smckusick# Needs work: no vp? 46568297Scgd# 46654647Smckusick#vop_bwrite { 46754647Smckusick# IN struct buf *bp; 46854647Smckusick#}; 469