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*67637Smckusick# @(#)vnode_if.src 8.7 (Berkeley) 08/10/94 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 3167113Spendry# on the flags and operation fields in the (cnp) structure. Note 3267113Spendry# 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 - - - 5567518Spendryvop_whiteout { 5667518Spendry IN WILLRELE struct vnode *dvp; 5767518Spendry IN struct componentname *cnp; 5867518Spendry IN int flags; 5967518Spendry}; 6067518Spendry 6167518Spendry# 6267113Spendry#% mknod dvp L U U 6367113Spendry#% mknod vpp - X - 6467113Spendry# 6554647Smckusickvop_mknod { 6654991Sheideman IN WILLRELE struct vnode *dvp; 6754991Sheideman OUT WILLRELE struct vnode **vpp; 6854647Smckusick IN struct componentname *cnp; 6954647Smckusick IN struct vattr *vap; 7054647Smckusick}; 7154647Smckusick 7267113Spendry# 7367113Spendry#% open vp L L L 7467113Spendry# 7554647Smckusickvop_open { 7654647Smckusick IN struct vnode *vp; 7754647Smckusick IN int mode; 7854647Smckusick IN struct ucred *cred; 7954647Smckusick IN struct proc *p; 8054647Smckusick}; 8154647Smckusick 8267113Spendry# 8367113Spendry#% close vp U U U 8467113Spendry# 8554647Smckusickvop_close { 8654647Smckusick IN struct vnode *vp; 8754647Smckusick IN int fflag; 8854647Smckusick IN struct ucred *cred; 8954647Smckusick IN struct proc *p; 9054647Smckusick}; 9154647Smckusick 9267113Spendry# 9367113Spendry#% access vp L L L 9467113Spendry# 9554647Smckusickvop_access { 9654647Smckusick IN struct vnode *vp; 9754647Smckusick IN int mode; 9854647Smckusick IN struct ucred *cred; 9954647Smckusick IN struct proc *p; 10054647Smckusick}; 10154647Smckusick 10267113Spendry# 10367113Spendry#% getattr vp = = = 10467113Spendry# 10554647Smckusickvop_getattr { 10654647Smckusick IN struct vnode *vp; 10754647Smckusick IN struct vattr *vap; 10854647Smckusick IN struct ucred *cred; 10954647Smckusick IN struct proc *p; 11054647Smckusick}; 11154647Smckusick 11267113Spendry# 11367113Spendry#% setattr vp L L L 11467113Spendry# 11554647Smckusickvop_setattr { 11654647Smckusick IN struct vnode *vp; 11754647Smckusick IN struct vattr *vap; 11854647Smckusick IN struct ucred *cred; 11954647Smckusick IN struct proc *p; 12054647Smckusick}; 12154647Smckusick 12267113Spendry# 12367113Spendry#% read vp L L L 12467113Spendry# 12554647Smckusickvop_read { 12654647Smckusick IN struct vnode *vp; 12754647Smckusick INOUT struct uio *uio; 12854647Smckusick IN int ioflag; 12954647Smckusick IN struct ucred *cred; 13054647Smckusick}; 13154647Smckusick 13267113Spendry# 13367113Spendry#% write vp L L L 13467113Spendry# 13554647Smckusickvop_write { 13654647Smckusick IN struct vnode *vp; 13754647Smckusick INOUT struct uio *uio; 13854647Smckusick IN int ioflag; 13954647Smckusick IN struct ucred *cred; 14054647Smckusick}; 14154647Smckusick 14267113Spendry# 143*67637Smckusick#% lease vp = = = 144*67637Smckusick# 145*67637Smckusickvop_lease { 146*67637Smckusick IN struct vnode *vp; 147*67637Smckusick IN struct proc *p; 148*67637Smckusick IN struct ucred *cred; 149*67637Smckusick IN int flag; 150*67637Smckusick}; 151*67637Smckusick 152*67637Smckusick# 15367113Spendry#% ioctl vp U U U 15467113Spendry# 15554647Smckusickvop_ioctl { 15654647Smckusick IN struct vnode *vp; 15754647Smckusick IN int command; 15854647Smckusick IN caddr_t data; 15954647Smckusick IN int fflag; 16054647Smckusick IN struct ucred *cred; 16154647Smckusick IN struct proc *p; 16254647Smckusick}; 16354647Smckusick 16467113Spendry# 16567113Spendry#% select vp U U U 16667113Spendry# 16754647Smckusick# Needs work? (fflags) 16854647Smckusickvop_select { 16954647Smckusick IN struct vnode *vp; 17054647Smckusick IN int which; 17154647Smckusick IN int fflags; 17254647Smckusick IN struct ucred *cred; 17354647Smckusick IN struct proc *p; 17454647Smckusick}; 17554647Smckusick 17667113Spendry# XXX - not used 17754647Smckusickvop_mmap { 17854647Smckusick IN struct vnode *vp; 17954647Smckusick IN int fflags; 18054647Smckusick IN struct ucred *cred; 18154647Smckusick IN struct proc *p; 18254647Smckusick}; 18354647Smckusick 18467113Spendry# 18567113Spendry#% fsync vp L L L 18667113Spendry# 18754647Smckusickvop_fsync { 18854647Smckusick IN struct vnode *vp; 18954647Smckusick IN struct ucred *cred; 19054647Smckusick IN int waitfor; 19154647Smckusick IN struct proc *p; 19254647Smckusick}; 19354647Smckusick 19467113Spendry# XXX - not used 19554647Smckusick# Needs word: Is newoff right? What's it mean? 19654647Smckusickvop_seek { 19754647Smckusick IN struct vnode *vp; 19854647Smckusick IN off_t oldoff; 19954647Smckusick IN off_t newoff; 20054647Smckusick IN struct ucred *cred; 20154647Smckusick}; 20254647Smckusick 20367113Spendry# 20467113Spendry#% remove dvp L U U 20567113Spendry#% remove vp L U U 20667113Spendry# 20754647Smckusickvop_remove { 20854991Sheideman IN WILLRELE struct vnode *dvp; 20954991Sheideman IN WILLRELE struct vnode *vp; 21054647Smckusick IN struct componentname *cnp; 21154647Smckusick}; 21254647Smckusick 21367113Spendry# 21467113Spendry#% link vp L U U 21567113Spendry#% link tdvp U U U 21667113Spendry# 21754647Smckusickvop_link { 21854991Sheideman IN WILLRELE struct vnode *vp; 21954647Smckusick IN struct vnode *tdvp; 22054647Smckusick IN struct componentname *cnp; 22154647Smckusick}; 22254647Smckusick 22367113Spendry# 22467113Spendry#% rename fdvp U U U 22567113Spendry#% rename fvp U U U 22667113Spendry#% rename tdvp L U U 22767113Spendry#% rename tvp X U U 22867113Spendry# 22954647Smckusickvop_rename { 23054991Sheideman IN WILLRELE struct vnode *fdvp; 23154991Sheideman IN WILLRELE struct vnode *fvp; 23254647Smckusick IN struct componentname *fcnp; 23354991Sheideman IN WILLRELE struct vnode *tdvp; 23454991Sheideman IN WILLRELE struct vnode *tvp; 23554647Smckusick IN struct componentname *tcnp; 23654647Smckusick}; 23754647Smckusick 23867113Spendry# 23967113Spendry#% mkdir dvp L U U 24067113Spendry#% mkdir vpp - L - 24167113Spendry# 24254647Smckusickvop_mkdir { 24354991Sheideman IN WILLRELE struct vnode *dvp; 24454647Smckusick OUT struct vnode **vpp; 24554647Smckusick IN struct componentname *cnp; 24654647Smckusick IN struct vattr *vap; 24754647Smckusick}; 24854647Smckusick 24967113Spendry# 25067113Spendry#% rmdir dvp L U U 25167113Spendry#% rmdir vp L U U 25267113Spendry# 25354647Smckusickvop_rmdir { 25454991Sheideman IN WILLRELE struct vnode *dvp; 25554991Sheideman IN WILLRELE struct vnode *vp; 25654647Smckusick IN struct componentname *cnp; 25754647Smckusick}; 25854647Smckusick 25967113Spendry# 26067113Spendry#% symlink dvp L U U 26167113Spendry#% symlink vpp - U - 26267113Spendry# XXX - note that the return vnode has already been VRELE'ed 26367113Spendry# by the filesystem layer. To use it you must use vget, 26467113Spendry# possibly with a further namei. 26567113Spendry# 26654647Smckusickvop_symlink { 26754991Sheideman IN WILLRELE struct vnode *dvp; 26854991Sheideman OUT WILLRELE struct vnode **vpp; 26954647Smckusick IN struct componentname *cnp; 27054647Smckusick IN struct vattr *vap; 27154647Smckusick IN char *target; 27254647Smckusick}; 27354647Smckusick 27467113Spendry# 27567113Spendry#% readdir vp L L L 27667113Spendry# 27754647Smckusickvop_readdir { 27854647Smckusick IN struct vnode *vp; 27954647Smckusick INOUT struct uio *uio; 28054647Smckusick IN struct ucred *cred; 28167361Smckusick INOUT int *eofflag; 28267361Smckusick OUT u_long *cookies; 28367361Smckusick IN int ncookies; 28454647Smckusick}; 28554647Smckusick 28667113Spendry# 28767113Spendry#% readlink vp L L L 28867113Spendry# 28954647Smckusickvop_readlink { 29054647Smckusick IN struct vnode *vp; 29154647Smckusick INOUT struct uio *uio; 29254647Smckusick IN struct ucred *cred; 29354647Smckusick}; 29454647Smckusick 29567113Spendry# 29667113Spendry#% abortop dvp = = = 29767113Spendry# 29854647Smckusickvop_abortop { 29954647Smckusick IN struct vnode *dvp; 30054647Smckusick IN struct componentname *cnp; 30154647Smckusick}; 30254647Smckusick 30367113Spendry# 30467113Spendry#% inactive vp U U U 30567113Spendry# 30654647Smckusickvop_inactive { 30754647Smckusick IN struct vnode *vp; 30854647Smckusick}; 30954647Smckusick 31067113Spendry# 31167113Spendry#% reclaim vp U U U 31267113Spendry# 31354647Smckusickvop_reclaim { 31454647Smckusick IN struct vnode *vp; 31554647Smckusick}; 31654647Smckusick 31767113Spendry# 31867113Spendry#% lock vp U L U 31967113Spendry# 32054647Smckusickvop_lock { 32154647Smckusick IN struct vnode *vp; 32254647Smckusick}; 32354647Smckusick 32467113Spendry# 32567113Spendry#% unlock vp L U L 32667113Spendry# 32754647Smckusickvop_unlock { 32854647Smckusick IN struct vnode *vp; 32954647Smckusick}; 33054647Smckusick 33167113Spendry# 33267113Spendry#% bmap vp L L L 33367113Spendry#% bmap vpp - U - 33467113Spendry# 33554647Smckusickvop_bmap { 33654647Smckusick IN struct vnode *vp; 33754647Smckusick IN daddr_t bn; 33854647Smckusick OUT struct vnode **vpp; 33954647Smckusick IN daddr_t *bnp; 34056441Smargo OUT int *runp; 34154647Smckusick}; 34254647Smckusick 34354647Smckusick#vop_strategy { 34454647Smckusick# IN struct buf *bp; 34554647Smckusick#}; 34654647Smckusick 34767113Spendry# 34867113Spendry#% print vp = = = 34967113Spendry# 35054647Smckusickvop_print { 35154647Smckusick IN struct vnode *vp; 35254647Smckusick}; 35354647Smckusick 35467113Spendry# 35567113Spendry#% islocked vp = = = 35667113Spendry# 35754647Smckusickvop_islocked { 35854647Smckusick IN struct vnode *vp; 35954647Smckusick}; 36054647Smckusick 36167113Spendry# 36267113Spendry#% pathconf vp L L L 36367113Spendry# 36460383Smckusickvop_pathconf { 36560383Smckusick IN struct vnode *vp; 36660383Smckusick IN int name; 36760383Smckusick OUT int *retval; 36860383Smckusick}; 36960383Smckusick 37067113Spendry# 37167113Spendry#% advlock vp U U U 37267113Spendry# 37354647Smckusickvop_advlock { 37454647Smckusick IN struct vnode *vp; 37554647Smckusick IN caddr_t id; 37654647Smckusick IN int op; 37754647Smckusick IN struct flock *fl; 37854647Smckusick IN int flags; 37954647Smckusick}; 38054647Smckusick 38167113Spendry# 38267113Spendry#% blkatoff vp L L L 38367113Spendry# 38454647Smckusickvop_blkatoff { 38554647Smckusick IN struct vnode *vp; 38654647Smckusick IN off_t offset; 38754647Smckusick OUT char **res; 38854647Smckusick OUT struct buf **bpp; 38954647Smckusick}; 39054647Smckusick 39167113Spendry# 39267113Spendry#% valloc pvp L L L 39367113Spendry# 39454647Smckusickvop_valloc { 39554647Smckusick IN struct vnode *pvp; 39654647Smckusick IN int mode; 39754647Smckusick IN struct ucred *cred; 39854647Smckusick OUT struct vnode **vpp; 39954647Smckusick}; 40054647Smckusick 40167113Spendry# 40267113Spendry#% reallocblks vp L L L 40367113Spendry# 40465976Smckusickvop_reallocblks { 40565976Smckusick IN struct vnode *vp; 40665976Smckusick IN struct cluster_save *buflist; 40765976Smckusick}; 40865976Smckusick 40967113Spendry# 41067113Spendry#% vfree pvp L L L 41167113Spendry# 41254647Smckusickvop_vfree { 41354647Smckusick IN struct vnode *pvp; 41454647Smckusick IN ino_t ino; 41554647Smckusick IN int mode; 41654647Smckusick}; 41754647Smckusick 41867113Spendry# 41967113Spendry#% truncate vp L L L 42067113Spendry# 42154647Smckusickvop_truncate { 42254647Smckusick IN struct vnode *vp; 42354647Smckusick IN off_t length; 42454647Smckusick IN int flags; 42554647Smckusick IN struct ucred *cred; 42654647Smckusick IN struct proc *p; 42754647Smckusick}; 42854647Smckusick 42967113Spendry# 43067113Spendry#% update vp L L L 43167113Spendry# 43254647Smckusickvop_update { 43354647Smckusick IN struct vnode *vp; 43464415Sbostic IN struct timeval *access; 43564415Sbostic IN struct timeval *modify; 43654647Smckusick IN int waitfor; 43754647Smckusick}; 43854647Smckusick 43954647Smckusick# Needs work: no vp? 44054647Smckusick#vop_bwrite { 44154647Smckusick# IN struct buf *bp; 44254647Smckusick#}; 443