vnode_if.src revision 208003
11541Srgrimes#- 21541Srgrimes# Copyright (c) 1992, 1993 31541Srgrimes# The Regents of the University of California. All rights reserved. 41541Srgrimes# 51541Srgrimes# Redistribution and use in source and binary forms, with or without 61541Srgrimes# modification, are permitted provided that the following conditions 71541Srgrimes# are met: 81541Srgrimes# 1. Redistributions of source code must retain the above copyright 91541Srgrimes# notice, this list of conditions and the following disclaimer. 101541Srgrimes# 2. Redistributions in binary form must reproduce the above copyright 111541Srgrimes# notice, this list of conditions and the following disclaimer in the 121541Srgrimes# documentation and/or other materials provided with the distribution. 131541Srgrimes# 4. Neither the name of the University nor the names of its contributors 141541Srgrimes# may be used to endorse or promote products derived from this software 151541Srgrimes# without specific prior written permission. 161541Srgrimes# 171541Srgrimes# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 181541Srgrimes# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 191541Srgrimes# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 201541Srgrimes# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 211541Srgrimes# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 221541Srgrimes# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 231541Srgrimes# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 241541Srgrimes# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 251541Srgrimes# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 261541Srgrimes# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 271541Srgrimes# SUCH DAMAGE. 281541Srgrimes# 291541Srgrimes# @(#)vnode_if.src 8.12 (Berkeley) 5/14/95 301541Srgrimes# $FreeBSD: head/sys/kern/vnode_if.src 208003 2010-05-12 21:24:46Z zml $ 311541Srgrimes# 321541Srgrimes 331541Srgrimes# 3414525Shsu# Above each of the vop descriptors in lines starting with %% 351541Srgrimes# is a specification of the locking protocol used by each vop call. 361541Srgrimes# The first column is the name of the variable, the remaining three 37116182Sobrien# columns are in, out and error respectively. The "in" column defines 38116182Sobrien# the lock state on input, the "out" column defines the state on succesful 39116182Sobrien# return, and the "error" column defines the locking state on error exit. 40235459Srstone# 4113203Swollman# The locking value can take the following values: 42178272Sjeff# L: locked; not converted to type of lock. 4313203Swollman# A: any lock type. 441541Srgrimes# S: locked with shared lock. 451541Srgrimes# E: locked with exclusive lock for this process. 4674927Sjhb# O: locked with exclusive lock for other process. 47131927Smarcel# U: unlocked. 481541Srgrimes# -: not applicable. vnode does not yet (or no longer) exists. 4965557Sjasone# =: the same on input and output, may be either L or U. 5069645Sjhb# X: locked if not nil. 5167362Sjhb# 5274927Sjhb# The paramater named "vpp" is assumed to be always used with double 5374927Sjhb# indirection (**vpp) and that name is hard-codeed in vnode_if.awk ! 54104964Sjeff# 55235459Srstone# Lines starting with %! specify a pre or post-condition function 561541Srgrimes# to call before/after the vop call. 57126326Sjhb# 5876078Sjhb# If other such parameters are introduced, they have to be added to 5974927Sjhb# the AWK script at the head of the definition of "add_debug_code()". 6027989Sjulian# 6169512Sjake 6274927Sjhbvop_islocked { 631541Srgrimes IN struct vnode *vp; 6434924Sbde}; 651541Srgrimes 661541Srgrimes%% lookup dvp L ? ? 671541Srgrimes%% lookup vpp - L - 681541Srgrimes%! lookup pre vop_lookup_pre 691541Srgrimes%! lookup post vop_lookup_post 70184042Skmacy 71184042Skmacy# XXX - the lookup locking protocol defies simple description and depends 72184042Skmacy# on the flags and operation fields in the (cnp) structure. Note 73184042Skmacy# especially that *vpp may equal dvp and both may be locked. 74184042Skmacy 75184042Skmacyvop_lookup { 76124954Sjeff IN struct vnode *dvp; 77177253Srwatson INOUT struct vnode **vpp; 78177253Srwatson IN struct componentname *cnp; 7910358Sjulian}; 8044218Sbde 81248186Smav%% cachedlookup dvp L ? ? 821541Srgrimes%% cachedlookup vpp - L - 83125292Sjeff 8469286Sjake# This must be an exact copy of lookup. See kern/vfs_cache.c for details. 8585227Siedowse 8685227Siedowsevop_cachedlookup { 8785227Siedowse IN struct vnode *dvp; 8885227Siedowse INOUT struct vnode **vpp; 8985227Siedowse IN struct componentname *cnp; 9085227Siedowse}; 9185227Siedowse 9285227Siedowse%% create dvp E E E 9385227Siedowse%% create vpp - L - 9485227Siedowse%! create post vop_create_post 9585227Siedowse 9685227Siedowsevop_create { 97107134Sjeff IN struct vnode *dvp; 98273736Shselasky OUT struct vnode **vpp; 99107134Sjeff IN struct componentname *cnp; 100125292Sjeff IN struct vattr *vap; 1017090Sbde}; 102235459Srstone 103260817Savg 104235459Srstone%% whiteout dvp E E E 105235459Srstone 106235459Srstonevop_whiteout { 107235459Srstone IN struct vnode *dvp; 108235459Srstone IN struct componentname *cnp; 109235459Srstone IN int flags; 110260817Savg}; 111260817Savg 112260817Savg 113260817Savg%% mknod dvp E E E 114260817Savg%% mknod vpp - L - 115235459Srstone%! mknod post vop_mknod_post 116254167Scognet 117254167Scognetvop_mknod { 11817366Sdg IN struct vnode *dvp; 11917366Sdg OUT struct vnode **vpp; 120104964Sjeff IN struct componentname *cnp; 121126326Sjhb IN struct vattr *vap; 12217366Sdg}; 12317366Sdg 1241541Srgrimes 125254167Scognet%% open vp L L L 126254167Scognet 127254167Scognetvop_open { 128254167Scognet IN struct vnode *vp; 129254167Scognet IN int mode; 130254167Scognet IN struct ucred *cred; 131155924Sjhb IN struct thread *td; 132155924Sjhb IN struct file *fp; 133252357Sdavide}; 134245049Sbjk 135245049Sbjk 1361541Srgrimes%% close vp L L L 137245049Sbjk 1381541Srgrimesvop_close { 1391541Srgrimes IN struct vnode *vp; 14065708Sjake IN int fflag; 141167387Sjhb IN struct ucred *cred; 142167387Sjhb IN struct thread *td; 143167387Sjhb}; 1441541Srgrimes 1451541Srgrimes 146177272Srwatson%% access vp L L L 147247787Sdavide 1481541Srgrimesvop_access { 149126326Sjhb IN struct vnode *vp; 150126326Sjhb IN accmode_t accmode; 151167387Sjhb IN struct ucred *cred; 152255745Sdavide IN struct thread *td; 153255745Sdavide}; 154167387Sjhb 1551541Srgrimes 156126326Sjhb%% accessx vp L L L 157126326Sjhb 1581541Srgrimesvop_accessx { 15997995Sjhb IN struct vnode *vp; 160234494Sjhb IN accmode_t accmode; 1611541Srgrimes IN struct ucred *cred; 162167387Sjhb IN struct thread *td; 163167387Sjhb}; 164247787Sdavide 165181921Sed 166126326Sjhb%% getattr vp L L L 167126326Sjhb 168181394Sjhbvop_getattr { 169181394Sjhb IN struct vnode *vp; 170181394Sjhb OUT struct vattr *vap; 171167387Sjhb IN struct ucred *cred; 172167387Sjhb}; 173167387Sjhb 174167387Sjhb 175126326Sjhb%% setattr vp E E E 176228424Savg%! setattr post vop_setattr_post 177126326Sjhb 178126326Sjhbvop_setattr { 179129241Sbde IN struct vnode *vp; 180129241Sbde IN struct vattr *vap; 181126326Sjhb IN struct ucred *cred; 182126326Sjhb}; 183126326Sjhb 184126326Sjhb%% markatime vp L L L 185167387Sjhb 186167387Sjhbvop_markatime { 187126326Sjhb IN struct vnode *vp; 188126326Sjhb}; 189126326Sjhb 190177085Sjeff%% read vp L L L 191126326Sjhb 192308470Skibvop_read { 193126326Sjhb IN struct vnode *vp; 194248186Smav INOUT struct uio *uio; 195248186Smav IN int ioflag; 196247787Sdavide IN struct ucred *cred; 197166908Sjhb}; 198247787Sdavide 199155932Sdavidxu 200247787Sdavide%% write vp L L L 201155932Sdavidxu%! write pre VOP_WRITE_PRE 202136445Sjhb%! write post VOP_WRITE_POST 203167387Sjhb 204173601Sjulianvop_write { 205126326Sjhb IN struct vnode *vp; 206183352Sjhb INOUT struct uio *uio; 207183352Sjhb IN int ioflag; 20888900Sjhb IN struct ucred *cred; 209181394Sjhb}; 210181394Sjhb 211167387Sjhb 212167387Sjhb%% ioctl vp U U U 213167387Sjhb 214167387Sjhbvop_ioctl { 215167387Sjhb IN struct vnode *vp; 21641971Sdillon IN u_long command; 2171541Srgrimes IN void *data; 2181541Srgrimes IN int fflag; 219126326Sjhb IN struct ucred *cred; 220126326Sjhb IN struct thread *td; 221126326Sjhb}; 222126326Sjhb 223126326Sjhb 224126326Sjhb%% poll vp U U U 2251541Srgrimes 226247787Sdavidevop_poll { 227247787Sdavide IN struct vnode *vp; 228247787Sdavide IN int events; 229169392Sjhb IN struct ucred *cred; 230169392Sjhb IN struct thread *td; 231169392Sjhb}; 232169392Sjhb 233169392Sjhb 234169392Sjhb%% kqfilter vp U U U 235247787Sdavide 236177085Sjeffvop_kqfilter { 237247787Sdavide IN struct vnode *vp; 238177085Sjeff IN struct knote *kn; 239126326Sjhb}; 240177085Sjeff 241126326Sjhb 242177085Sjeff%% revoke vp L L L 243126326Sjhb 24478638Sjhbvop_revoke { 2451541Srgrimes IN struct vnode *vp; 24697995Sjhb IN int flags; 247234494Sjhb}; 2481541Srgrimes 24997995Sjhb 250181394Sjhb%% fsync vp L L L 251167387Sjhb 252167387Sjhbvop_fsync { 25365708Sjake IN struct vnode *vp; 25465557Sjasone IN int waitfor; 2551541Srgrimes IN struct thread *td; 2561541Srgrimes}; 257153855Sjhb 258247787Sdavide 259247787Sdavide%% remove dvp E E E 260153855Sjhb%% remove vp E E E 261153855Sjhb%! remove post vop_remove_post 262153855Sjhb 263153855Sjhbvop_remove { 264153855Sjhb IN struct vnode *dvp; 265153855Sjhb IN struct vnode *vp; 266153855Sjhb IN struct componentname *cnp; 267153855Sjhb}; 268153855Sjhb 269153855Sjhb 270153855Sjhb%% link tdvp E E E 271153855Sjhb%% link vp E E E 272228424Savg%! link post vop_link_post 273153855Sjhb 274153855Sjhbvop_link { 275153855Sjhb IN struct vnode *tdvp; 276153855Sjhb IN struct vnode *vp; 277153855Sjhb IN struct componentname *cnp; 278153855Sjhb}; 279153855Sjhb 280153855Sjhb 281153855Sjhb%! rename pre vop_rename_pre 282153855Sjhb%! rename post vop_rename_post 283153855Sjhb 284153855Sjhbvop_rename { 285167089Sjhb IN WILLRELE struct vnode *fdvp; 286173601Sjulian IN WILLRELE struct vnode *fvp; 287153855Sjhb IN struct componentname *fcnp; 288153855Sjhb IN WILLRELE struct vnode *tdvp; 289153855Sjhb IN WILLRELE struct vnode *tvp; 290167787Sjhb IN struct componentname *tcnp; 291153855Sjhb}; 292153855Sjhb 293153855Sjhb 294153855Sjhb%% mkdir dvp E E E 295153855Sjhb%% mkdir vpp - E - 296167787Sjhb%! mkdir post vop_mkdir_post 297247787Sdavide 298247787Sdavidevop_mkdir { 299153855Sjhb IN struct vnode *dvp; 300153855Sjhb OUT struct vnode **vpp; 301153855Sjhb IN struct componentname *cnp; 302153855Sjhb IN struct vattr *vap; 303153855Sjhb}; 304153855Sjhb 305153855Sjhb 306153855Sjhb%% rmdir dvp E E E 307153855Sjhb%% rmdir vp E E E 308153855Sjhb%! rmdir post vop_rmdir_post 309153855Sjhb 310234494Sjhbvop_rmdir { 311153855Sjhb IN struct vnode *dvp; 312153855Sjhb IN struct vnode *vp; 313153855Sjhb IN struct componentname *cnp; 314153855Sjhb}; 315153855Sjhb 316153855Sjhb 317153855Sjhb%% symlink dvp E E E 318153855Sjhb%% symlink vpp - E - 319153855Sjhb%! symlink post vop_symlink_post 320247787Sdavide 321177085Sjeffvop_symlink { 322153855Sjhb IN struct vnode *dvp; 323177085Sjeff OUT struct vnode **vpp; 324153855Sjhb IN struct componentname *cnp; 325153855Sjhb IN struct vattr *vap; 326153855Sjhb IN char *target; 327153855Sjhb}; 328234494Sjhb 329153855Sjhb 330153855Sjhb%% readdir vp L L L 331153855Sjhb 332167787Sjhbvop_readdir { 333153855Sjhb IN struct vnode *vp; 334153855Sjhb INOUT struct uio *uio; 335153855Sjhb IN struct ucred *cred; 3361541Srgrimes INOUT int *eofflag; 337337034Shselasky OUT int *ncookies; 338337034Shselasky INOUT u_long **cookies; 339337034Shselasky}; 340337034Shselasky 341337034Shselasky 342166908Sjhb%% readlink vp L L L 343166908Sjhb 344247787Sdavidevop_readlink { 345166908Sjhb IN struct vnode *vp; 346337034Shselasky INOUT struct uio *uio; 347166908Sjhb IN struct ucred *cred; 348227748Shselasky}; 349247787Sdavide 350247787Sdavide 351227706Shselasky%% inactive vp E E E 352301261Shselasky 353227706Shselaskyvop_inactive { 354247787Sdavide IN struct vnode *vp; 355227748Shselasky IN struct thread *td; 356227706Shselasky}; 357255067Shselasky 358227706Shselasky 359255067Shselasky%% reclaim vp E E E 360227706Shselasky 361255067Shselaskyvop_reclaim { 362255067Shselasky IN struct vnode *vp; 363255067Shselasky IN struct thread *td; 364255067Shselasky}; 365337035Shselasky 366227706Shselasky 367337034Shselasky%! lock1 pre vop_lock_pre 368337034Shselasky%! lock1 post vop_lock_post 369166908Sjhb 370166908Sjhbvop_lock1 { 371166908Sjhb IN struct vnode *vp; 372129241Sbde IN int flags; 3731541Srgrimes IN char *file; 3741541Srgrimes IN int line; 375177272Srwatson}; 37617366Sdg 377181334Sjhb 3781541Srgrimes%! unlock pre vop_unlock_pre 379136445Sjhb%! unlock post vop_unlock_post 380181334Sjhb 381177085Sjeffvop_unlock { 382195700Skib IN struct vnode *vp; 383195700Skib IN int flags; 384195700Skib}; 385181334Sjhb 386195700Skib 3871541Srgrimes%% bmap vp L L L 3881541Srgrimes 3891541Srgrimesvop_bmap { 390129241Sbde IN struct vnode *vp; 391129241Sbde IN daddr_t bn; 39279343Sjake OUT struct bufobj **bop; 3931541Srgrimes IN daddr_t *bnp; 3941541Srgrimes OUT int *runp; 395177272Srwatson OUT int *runb; 3961541Srgrimes}; 397181334Sjhb 3981541Srgrimes 399136445Sjhb%% strategy vp L L L 400181334Sjhb%! strategy pre vop_strategy_pre 401170294Sjeff 402181334Sjhbvop_strategy { 403181334Sjhb IN struct vnode *vp; 4041541Srgrimes IN struct buf *bp; 4051541Srgrimes}; 406177010Sjeff 407177010Sjeff 408177010Sjeff%% getwritemount vp = = = 409177010Sjeff 410177010Sjeffvop_getwritemount { 411177010Sjeff IN struct vnode *vp; 412177010Sjeff OUT struct mount **mpp; 413177010Sjeff}; 414177010Sjeff 4151541Srgrimes 416129241Sbde%% print vp - - - 4171541Srgrimes 4181541Srgrimesvop_print { 419131473Sjhb IN struct vnode *vp; 4201541Srgrimes}; 421175219Srwatson 422112993Speter 4231541Srgrimes%% pathconf vp L L L 424112993Speter 425170294Sjeffvop_pathconf { 426103216Sjulian IN struct vnode *vp; 42785368Sjhb IN int name; 428114750Sjhb OUT register_t *retval; 42985368Sjhb}; 43085368Sjhb 431222252Sjhb 432100210Sjhb%% advlock vp U U U 433124944Sjeff 434124944Sjeffvop_advlock { 435132266Sjhb IN struct vnode *vp; 43665557Sjasone IN void *id; 437159205Sjhb IN int op; 438159205Sjhb IN struct flock *fl; 439159205Sjhb IN int flags; 440177010Sjeff}; 441177010Sjeff 442228424Savg 443228424Savg%% advlockasync vp U U U 444218424Smdf 445170174Sjeffvop_advlockasync { 446218424Smdf IN struct vnode *vp; 447218424Smdf IN void *id; 448170174Sjeff IN int op; 449178272Sjeff IN struct flock *fl; 450178272Sjeff IN int flags; 451178272Sjeff IN struct task *task; 4521541Srgrimes INOUT void **cookiep; 4531541Srgrimes}; 454170174Sjeff 4551541Srgrimes 456155444Sphk%% advlockpurge vp E E E 457175219Srwatson 458175219Srwatsonvop_advlockpurge { 459175219Srwatson IN struct vnode *vp; 460170174Sjeff}; 461120802Sbms 462170292Sattilio 463121688Sbde%% reallocblks vp E E E 464177091Sjeff 465284021Skibvop_reallocblks { 466316843Savg IN struct vnode *vp; 467316843Savg IN struct cluster_save *buflist; 468316843Savg}; 469316843Savg 470316843Savg 471184042Skmacy%% getpages vp L L L 472184042Skmacy 473184042Skmacyvop_getpages { 474135051Sjulian IN struct vnode *vp; 475177091Sjeff IN vm_page_t *m; 476284021Skib IN int count; 477121688Sbde IN int reqpage; 478107719Sjulian IN vm_ooffset_t offset; 479107719Sjulian}; 480107719Sjulian 481107719Sjulian 482107719Sjulian%% putpages vp E E E 483107719Sjulian 484107719Sjulianvop_putpages { 4851541Srgrimes IN struct vnode *vp; 4861541Srgrimes IN vm_page_t *m; 4871541Srgrimes IN int count; 488181334Sjhb IN int sync; 489181334Sjhb IN int *rtvals; 490181334Sjhb IN vm_ooffset_t offset; 4911541Srgrimes}; 492181334Sjhb 49383366Sjulian 4941541Srgrimes%% getacl vp L L L 49583786Sjhb 496170294Sjeffvop_getacl { 497172207Sjeff IN struct vnode *vp; 498172207Sjeff IN acl_type_t type; 49999072Sjulian OUT struct acl *aclp; 50099072Sjulian IN struct ucred *cred; 501103216Sjulian IN struct thread *td; 502181334Sjhb}; 503103216Sjulian 504103216Sjulian 505103216Sjulian%% setacl vp E E E 506103216Sjulian 507103216Sjulianvop_setacl { 508103216Sjulian IN struct vnode *vp; 509181334Sjhb IN acl_type_t type; 510181334Sjhb IN struct acl *aclp; 511103216Sjulian IN struct ucred *cred; 512103216Sjulian IN struct thread *td; 5131541Srgrimes}; 514103216Sjulian 51583366Sjulian 5161541Srgrimes%% aclcheck vp = = = 517172207Sjeff 518172207Sjeffvop_aclcheck { 519172207Sjeff IN struct vnode *vp; 520181334Sjhb IN acl_type_t type; 521100913Stanimura IN struct acl *aclp; 522104964Sjeff IN struct ucred *cred; 523104964Sjeff IN struct thread *td; 524181334Sjhb}; 5251541Srgrimes 5261541Srgrimes 5271541Srgrimes%% closeextattr vp L L L 52885227Siedowse 52985227Siedowsevop_closeextattr { 53085227Siedowse IN struct vnode *vp; 53185227Siedowse IN int commit; 532125292Sjeff IN struct ucred *cred; 53385227Siedowse IN struct thread *td; 53485227Siedowse}; 53585237Siedowse 53685227Siedowse 537125290Sjeff%% getextattr vp L L L 53885237Siedowse 539125290Sjeffvop_getextattr { 54085227Siedowse IN struct vnode *vp; 54185227Siedowse IN int attrnamespace; 54285227Siedowse IN const char *name; 54385237Siedowse INOUT struct uio *uio; 544125292Sjeff OUT size_t *size; 545125292Sjeff IN struct ucred *cred; 546125292Sjeff IN struct thread *td; 547125292Sjeff}; 548125292Sjeff 549247778Sdavide 550255835Smav%% listextattr vp L L L 551255835Smav 55285227Siedowsevop_listextattr { 55385227Siedowse IN struct vnode *vp; 55431403Sjulian IN int attrnamespace; 55531403Sjulian INOUT struct uio *uio; 556177272Srwatson OUT size_t *size; 55731403Sjulian IN struct ucred *cred; 558314667Savg IN struct thread *td; 55969286Sjake}; 56031403Sjulian 561125292Sjeff 56231403Sjulian%% openextattr vp L L L 56331403Sjulian 564218424Smdfvop_openextattr { 565218424Smdf IN struct vnode *vp; 566218424Smdf IN struct ucred *cred; 567218424Smdf IN struct thread *td; 568260737Savg}; 569218424Smdf 570218424Smdf 571218424Smdf%% deleteextattr vp E E E 572218424Smdf 573218424Smdfvop_deleteextattr { 574218424Smdf IN struct vnode *vp; 575218424Smdf IN int attrnamespace; 576221829Smdf IN const char *name; 577218424Smdf IN struct ucred *cred; 578218424Smdf IN struct thread *td; 579218424Smdf}; 580218424Smdf 581218424Smdf 582218424Smdf%% setextattr vp E E E 583218424Smdf 584218424Smdfvop_setextattr { 585218424Smdf IN struct vnode *vp; 586218424Smdf IN int attrnamespace; 587221829Smdf IN const char *name; 588221829Smdf INOUT struct uio *uio; 589218424Smdf IN struct ucred *cred; 590218424Smdf IN struct thread *td; 591218424Smdf}; 592218424Smdf 593218424Smdf 594218424Smdf%% setlabel vp E E E 595218424Smdf 59653745Sbdevop_setlabel { 597167232Srwatson IN struct vnode *vp; 59869512Sjake IN struct label *label; 59969512Sjake IN struct ucred *cred; 600225617Skmacy IN struct thread *td; 60169512Sjake}; 602172482Sjeff 603172482Sjeff 604217077Sjhb%% vptofh vp = = = 605217077Sjhb 606178272Sjeffvop_vptofh { 607172482Sjeff IN struct vnode *vp; 608172482Sjeff IN struct fid *fhp; 60969512Sjake}; 61069512Sjake 611%% vptocnp vp L L L 612%% vptocnp vpp - U - 613 614vop_vptocnp { 615 IN struct vnode *vp; 616 OUT struct vnode **vpp; 617 IN struct ucred *cred; 618 INOUT char *buf; 619 INOUT int *buflen; 620}; 621