1*54753Sjohnh /* 2*54753Sjohnh * Copyright (c) 1992 The Regents of the University of California 3*54753Sjohnh * Copyright (c) 1990, 1992 Jan-Simon Pendry 4*54753Sjohnh * All rights reserved. 5*54753Sjohnh * 6*54753Sjohnh * This code is derived from software donated to Berkeley by 7*54753Sjohnh * Jan-Simon Pendry. 8*54753Sjohnh * 9*54753Sjohnh * %sccs.include.redist.c% 10*54753Sjohnh * 11*54753Sjohnh * @(#)lofs_vnops.c 1.2 (Berkeley) 6/18/92 12*54753Sjohnh * 13*54753Sjohnh * $Id: lofs_vnops.c,v 1.11 1992/05/30 10:05:43 jsp Exp jsp $ 14*54753Sjohnh */ 15*54753Sjohnh 16*54753Sjohnh /* 17*54753Sjohnh * Loopback Filesystem 18*54753Sjohnh */ 19*54753Sjohnh 20*54753Sjohnh #include <sys/param.h> 21*54753Sjohnh #include <sys/systm.h> 22*54753Sjohnh #include <sys/proc.h> 23*54753Sjohnh #include <sys/time.h> 24*54753Sjohnh #include <sys/types.h> 25*54753Sjohnh #include <sys/vnode.h> 26*54753Sjohnh #include <sys/mount.h> 27*54753Sjohnh #include <sys/namei.h> 28*54753Sjohnh #include <sys/malloc.h> 29*54753Sjohnh #include <sys/buf.h> 30*54753Sjohnh #include <lofs/lofs.h> 31*54753Sjohnh 32*54753Sjohnh /* 33*54753Sjohnh * Basic strategy: as usual, do as little work as possible. 34*54753Sjohnh * Nothing is ever locked in the lofs'ed filesystem, all 35*54753Sjohnh * locks are held in the underlying filesystems. 36*54753Sjohnh */ 37*54753Sjohnh 38*54753Sjohnh /* 39*54753Sjohnh * Save a vnode and replace with 40*54753Sjohnh * the lofs'ed one 41*54753Sjohnh */ 42*54753Sjohnh #define PUSHREF(v, nd) \ 43*54753Sjohnh { \ 44*54753Sjohnh struct { struct vnode *vnp; } v; \ 45*54753Sjohnh v.vnp = (nd); \ 46*54753Sjohnh (nd) = LOFSVP(v.vnp) 47*54753Sjohnh 48*54753Sjohnh /* 49*54753Sjohnh * Undo the PUSHREF 50*54753Sjohnh */ 51*54753Sjohnh #define POP(v, nd) \ 52*54753Sjohnh \ 53*54753Sjohnh (nd) = v.vnp; \ 54*54753Sjohnh } 55*54753Sjohnh 56*54753Sjohnh 57*54753Sjohnh /* 58*54753Sjohnh * vp is the current namei directory 59*54753Sjohnh * ndp is the name to locate in that directory... 60*54753Sjohnh */ 61*54753Sjohnh lofs_lookup (ap) 62*54753Sjohnh struct vop_lookup_args *ap; 63*54753Sjohnh { 64*54753Sjohnh USES_VOP_LOOKUP; 65*54753Sjohnh struct vnode *dvp = ap->a_dvp; 66*54753Sjohnh struct vnode *newvp; 67*54753Sjohnh struct vnode *targetdvp; 68*54753Sjohnh int error; 69*54753Sjohnh int flag = ap->a_cnp->cn_nameiop /*& OPMASK*/; 70*54753Sjohnh 71*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 72*54753Sjohnh printf("lofs_lookup(ap->a_dvp = %x->%x, \"%s\", op = %d)\n", 73*54753Sjohnh dvp, LOFSVP(dvp), ap->a_cnp->cn_nameptr, flag); 74*54753Sjohnh #endif 75*54753Sjohnh 76*54753Sjohnh /* 77*54753Sjohnh * (ap->a_dvp) was locked when passed in, and it will be replaced 78*54753Sjohnh * with the target vnode, BUT that will already have been 79*54753Sjohnh * locked when (ap->a_dvp) was locked [see lofs_lock]. all that 80*54753Sjohnh * must be done here is to keep track of reference counts. 81*54753Sjohnh */ 82*54753Sjohnh targetdvp = LOFSVP(dvp); 83*54753Sjohnh /*VREF(targetdvp);*/ 84*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 85*54753Sjohnh vprint("lofs VOP_LOOKUP", targetdvp); 86*54753Sjohnh #endif 87*54753Sjohnh 88*54753Sjohnh /* 89*54753Sjohnh * Call lookup on the looped vnode 90*54753Sjohnh */ 91*54753Sjohnh error = VOP_LOOKUP(targetdvp, &newvp, ap->a_cnp); 92*54753Sjohnh /*vrele(targetdvp);*/ 93*54753Sjohnh 94*54753Sjohnh if (error) { 95*54753Sjohnh *ap->a_vpp = NULLVP; 96*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 97*54753Sjohnh printf("lofs_lookup(%x->%x) = %d\n", dvp, LOFSVP(dvp), error); 98*54753Sjohnh #endif 99*54753Sjohnh return (error); 100*54753Sjohnh } 101*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 102*54753Sjohnh printf("lofs_lookup(%x->%x) = OK\n", dvp, LOFSVP(dvp)); 103*54753Sjohnh #endif 104*54753Sjohnh 105*54753Sjohnh *ap->a_vpp = newvp; 106*54753Sjohnh 107*54753Sjohnh /* 108*54753Sjohnh * If we just found a directory then make 109*54753Sjohnh * a loopback node for it and return the loopback 110*54753Sjohnh * instead of the real vnode. Otherwise simply 111*54753Sjohnh * return the aliased directory and vnode. 112*54753Sjohnh */ 113*54753Sjohnh if (newvp && newvp->v_type == VDIR && flag == LOOKUP) { 114*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 115*54753Sjohnh printf("lofs_lookup: found VDIR\n"); 116*54753Sjohnh #endif 117*54753Sjohnh /* 118*54753Sjohnh * At this point, newvp is the vnode to be looped. 119*54753Sjohnh * Activate a loopback and return the looped vnode. 120*54753Sjohnh */ 121*54753Sjohnh return (make_lofs(dvp->v_mount, ap->a_vpp)); 122*54753Sjohnh } 123*54753Sjohnh 124*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 125*54753Sjohnh printf("lofs_lookup: not VDIR\n"); 126*54753Sjohnh #endif 127*54753Sjohnh 128*54753Sjohnh return (0); 129*54753Sjohnh } 130*54753Sjohnh 131*54753Sjohnh /* 132*54753Sjohnh * this = ni_dvp 133*54753Sjohnh * ni_dvp references the locked directory. 134*54753Sjohnh * ni_vp is NULL. 135*54753Sjohnh */ 136*54753Sjohnh lofs_mknod (ap) 137*54753Sjohnh struct vop_mknod_args *ap; 138*54753Sjohnh { 139*54753Sjohnh USES_VOP_MKNOD; 140*54753Sjohnh int error; 141*54753Sjohnh 142*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 143*54753Sjohnh printf("lofs_mknod(vp = %x->%x)\n", ap->a_dvp, LOFSVP(ap->a_dvp)); 144*54753Sjohnh #endif 145*54753Sjohnh 146*54753Sjohnh PUSHREF(xdvp, ap->a_dvp); 147*54753Sjohnh VREF(ap->a_dvp); 148*54753Sjohnh 149*54753Sjohnh error = VOP_MKNOD(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap); 150*54753Sjohnh 151*54753Sjohnh POP(xdvp, ap->a_dvp); 152*54753Sjohnh vrele(ap->a_dvp); 153*54753Sjohnh 154*54753Sjohnh return (error); 155*54753Sjohnh } 156*54753Sjohnh 157*54753Sjohnh /* 158*54753Sjohnh * this = ni_dvp; 159*54753Sjohnh * ni_dvp references the locked directory 160*54753Sjohnh * ni_vp is NULL. 161*54753Sjohnh */ 162*54753Sjohnh lofs_create (ap) 163*54753Sjohnh struct vop_create_args *ap; 164*54753Sjohnh { 165*54753Sjohnh USES_VOP_CREATE; 166*54753Sjohnh int error; 167*54753Sjohnh 168*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 169*54753Sjohnh printf("lofs_create(ap->a_dvp = %x->%x)\n", ap->a_dvp, LOFSVP(ap->a_dvp)); 170*54753Sjohnh #endif 171*54753Sjohnh 172*54753Sjohnh PUSHREF(xdvp, ap->a_dvp); 173*54753Sjohnh VREF(ap->a_dvp); 174*54753Sjohnh 175*54753Sjohnh error = VOP_CREATE(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap); 176*54753Sjohnh 177*54753Sjohnh POP(xdvp, ap->a_dvp); 178*54753Sjohnh vrele(ap->a_dvp); 179*54753Sjohnh 180*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 181*54753Sjohnh printf("lofs_create(ap->a_dvp = %x->%x)\n", ap->a_dvp, LOFSVP(ap->a_dvp)); 182*54753Sjohnh #endif 183*54753Sjohnh 184*54753Sjohnh return (error); 185*54753Sjohnh } 186*54753Sjohnh 187*54753Sjohnh lofs_open (ap) 188*54753Sjohnh struct vop_open_args *ap; 189*54753Sjohnh { 190*54753Sjohnh USES_VOP_OPEN; 191*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 192*54753Sjohnh printf("lofs_open(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp)); 193*54753Sjohnh #endif 194*54753Sjohnh 195*54753Sjohnh return VOP_OPEN(LOFSVP(ap->a_vp), ap->a_mode, ap->a_cred, ap->a_p); 196*54753Sjohnh } 197*54753Sjohnh 198*54753Sjohnh lofs_close (ap) 199*54753Sjohnh struct vop_close_args *ap; 200*54753Sjohnh { 201*54753Sjohnh USES_VOP_CLOSE; 202*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 203*54753Sjohnh printf("lofs_close(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp)); 204*54753Sjohnh #endif 205*54753Sjohnh 206*54753Sjohnh return VOP_CLOSE(LOFSVP(ap->a_vp), ap->a_fflag, ap->a_cred, ap->a_p); 207*54753Sjohnh } 208*54753Sjohnh 209*54753Sjohnh lofs_access (ap) 210*54753Sjohnh struct vop_access_args *ap; 211*54753Sjohnh { 212*54753Sjohnh USES_VOP_ACCESS; 213*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 214*54753Sjohnh printf("lofs_access(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp)); 215*54753Sjohnh #endif 216*54753Sjohnh 217*54753Sjohnh return VOP_ACCESS(LOFSVP(ap->a_vp), ap->a_mode, ap->a_cred, ap->a_p); 218*54753Sjohnh } 219*54753Sjohnh 220*54753Sjohnh lofs_getattr (ap) 221*54753Sjohnh struct vop_getattr_args *ap; 222*54753Sjohnh { 223*54753Sjohnh USES_VOP_GETATTR; 224*54753Sjohnh int error; 225*54753Sjohnh 226*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 227*54753Sjohnh printf("lofs_getattr(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp)); 228*54753Sjohnh #endif 229*54753Sjohnh 230*54753Sjohnh /* 231*54753Sjohnh * Get the stats from the underlying filesystem 232*54753Sjohnh */ 233*54753Sjohnh error = VOP_GETATTR(LOFSVP(ap->a_vp), ap->a_vap, ap->a_cred, ap->a_p); 234*54753Sjohnh if (error) 235*54753Sjohnh return (error); 236*54753Sjohnh /* 237*54753Sjohnh * and replace the fsid field with the loopback number 238*54753Sjohnh * to preserve the namespace. 239*54753Sjohnh */ 240*54753Sjohnh ap->a_vap->va_fsid = ap->a_vp->v_mount->mnt_stat.f_fsid.val[0]; 241*54753Sjohnh return (0); 242*54753Sjohnh } 243*54753Sjohnh 244*54753Sjohnh lofs_setattr (ap) 245*54753Sjohnh struct vop_setattr_args *ap; 246*54753Sjohnh { 247*54753Sjohnh USES_VOP_SETATTR; 248*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 249*54753Sjohnh printf("lofs_setattr(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp)); 250*54753Sjohnh #endif 251*54753Sjohnh 252*54753Sjohnh return VOP_SETATTR(LOFSVP(ap->a_vp), ap->a_vap, ap->a_cred, ap->a_p); 253*54753Sjohnh } 254*54753Sjohnh 255*54753Sjohnh lofs_read (ap) 256*54753Sjohnh struct vop_read_args *ap; 257*54753Sjohnh { 258*54753Sjohnh USES_VOP_READ; 259*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 260*54753Sjohnh printf("lofs_read(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp)); 261*54753Sjohnh #endif 262*54753Sjohnh 263*54753Sjohnh return VOP_READ(LOFSVP(ap->a_vp), ap->a_uio, ap->a_ioflag, ap->a_cred); 264*54753Sjohnh } 265*54753Sjohnh 266*54753Sjohnh lofs_write (ap) 267*54753Sjohnh struct vop_write_args *ap; 268*54753Sjohnh { 269*54753Sjohnh USES_VOP_WRITE; 270*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 271*54753Sjohnh printf("lofs_write(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp)); 272*54753Sjohnh #endif 273*54753Sjohnh 274*54753Sjohnh return VOP_WRITE(LOFSVP(ap->a_vp), ap->a_uio, ap->a_ioflag, ap->a_cred); 275*54753Sjohnh } 276*54753Sjohnh 277*54753Sjohnh lofs_ioctl (ap) 278*54753Sjohnh struct vop_ioctl_args *ap; 279*54753Sjohnh { 280*54753Sjohnh USES_VOP_IOCTL; 281*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 282*54753Sjohnh printf("lofs_ioctl(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp)); 283*54753Sjohnh #endif 284*54753Sjohnh 285*54753Sjohnh return VOP_IOCTL(LOFSVP(ap->a_vp), ap->a_command, ap->a_data, ap->a_fflag, ap->a_cred, ap->a_p); 286*54753Sjohnh } 287*54753Sjohnh 288*54753Sjohnh lofs_select (ap) 289*54753Sjohnh struct vop_select_args *ap; 290*54753Sjohnh { 291*54753Sjohnh USES_VOP_SELECT; 292*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 293*54753Sjohnh printf("lofs_select(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp)); 294*54753Sjohnh #endif 295*54753Sjohnh 296*54753Sjohnh return VOP_SELECT(LOFSVP(ap->a_vp), ap->a_which, ap->a_fflags, ap->a_cred, ap->a_p); 297*54753Sjohnh } 298*54753Sjohnh 299*54753Sjohnh lofs_mmap (ap) 300*54753Sjohnh struct vop_mmap_args *ap; 301*54753Sjohnh { 302*54753Sjohnh USES_VOP_MMAP; 303*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 304*54753Sjohnh printf("lofs_mmap(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp)); 305*54753Sjohnh #endif 306*54753Sjohnh 307*54753Sjohnh return VOP_MMAP(LOFSVP(ap->a_vp), ap->a_fflags, ap->a_cred, ap->a_p); 308*54753Sjohnh } 309*54753Sjohnh 310*54753Sjohnh lofs_fsync (ap) 311*54753Sjohnh struct vop_fsync_args *ap; 312*54753Sjohnh { 313*54753Sjohnh USES_VOP_FSYNC; 314*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 315*54753Sjohnh printf("lofs_fsync(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp)); 316*54753Sjohnh #endif 317*54753Sjohnh 318*54753Sjohnh return VOP_FSYNC(LOFSVP(ap->a_vp), ap->a_fflags, ap->a_cred, ap->a_waitfor, ap->a_p); 319*54753Sjohnh } 320*54753Sjohnh 321*54753Sjohnh lofs_seek (ap) 322*54753Sjohnh struct vop_seek_args *ap; 323*54753Sjohnh { 324*54753Sjohnh USES_VOP_SEEK; 325*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 326*54753Sjohnh printf("lofs_seek(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp)); 327*54753Sjohnh #endif 328*54753Sjohnh 329*54753Sjohnh return VOP_SEEK(LOFSVP(ap->a_vp), ap->a_oldoff, ap->a_newoff, ap->a_cred); 330*54753Sjohnh } 331*54753Sjohnh 332*54753Sjohnh lofs_remove (ap) 333*54753Sjohnh struct vop_remove_args *ap; 334*54753Sjohnh { 335*54753Sjohnh USES_VOP_REMOVE; 336*54753Sjohnh int error; 337*54753Sjohnh 338*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 339*54753Sjohnh printf("lofs_remove(ap->a_vp = %x->%x)\n", ap->a_dvp, LOFSVP(ap->a_dvp)); 340*54753Sjohnh #endif 341*54753Sjohnh 342*54753Sjohnh PUSHREF(xdvp, ap->a_dvp); 343*54753Sjohnh VREF(ap->a_dvp); 344*54753Sjohnh PUSHREF(xvp, ap->a_vp); 345*54753Sjohnh VREF(ap->a_vp); 346*54753Sjohnh 347*54753Sjohnh error = VOP_REMOVE(ap->a_dvp, ap->a_vp, ap->a_cnp); 348*54753Sjohnh 349*54753Sjohnh POP(xvp, ap->a_vp); 350*54753Sjohnh vrele(ap->a_vp); 351*54753Sjohnh POP(xdvp, ap->a_dvp); 352*54753Sjohnh vrele(ap->a_dvp); 353*54753Sjohnh 354*54753Sjohnh return (error); 355*54753Sjohnh } 356*54753Sjohnh 357*54753Sjohnh /* 358*54753Sjohnh * vp is this. 359*54753Sjohnh * ni_dvp is the locked parent of the target. 360*54753Sjohnh * ni_vp is NULL. 361*54753Sjohnh */ 362*54753Sjohnh lofs_link (ap) 363*54753Sjohnh struct vop_link_args *ap; 364*54753Sjohnh { 365*54753Sjohnh USES_VOP_LINK; 366*54753Sjohnh int error; 367*54753Sjohnh 368*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 369*54753Sjohnh printf("lofs_link(ap->a_tdvp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp)); 370*54753Sjohnh #endif 371*54753Sjohnh 372*54753Sjohnh PUSHREF(xdvp, ap->a_vp); 373*54753Sjohnh VREF(ap->a_vp); 374*54753Sjohnh 375*54753Sjohnh error = VOP_LINK(ap->a_vp, LOFSVP(ap->a_tdvp), ap->a_cnp); 376*54753Sjohnh 377*54753Sjohnh POP(xdvp, ap->a_vp); 378*54753Sjohnh vrele(ap->a_vp); 379*54753Sjohnh 380*54753Sjohnh return (error); 381*54753Sjohnh } 382*54753Sjohnh 383*54753Sjohnh lofs_rename (ap) 384*54753Sjohnh struct vop_rename_args *ap; 385*54753Sjohnh { 386*54753Sjohnh USES_VOP_RENAME; 387*54753Sjohnh struct vnode *fvp, *tvp; 388*54753Sjohnh struct vnode *tdvp; 389*54753Sjohnh #if 0 390*54753Sjohnh struct vnode *fsvp, *tsvp; 391*54753Sjohnh #endif 392*54753Sjohnh int error; 393*54753Sjohnh 394*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 395*54753Sjohnh printf("lofs_rename(fdvp = %x->%x)\n", ap->a_fdvp, LOFSVP(ap->a_fdvp)); 396*54753Sjohnh /*printf("lofs_rename(tdvp = %x->%x)\n", tndp->ni_dvp, LOFSVP(tndp->ni_dvp));*/ 397*54753Sjohnh #endif 398*54753Sjohnh 399*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 400*54753Sjohnh printf("lofs_rename - switch source dvp\n"); 401*54753Sjohnh #endif 402*54753Sjohnh /* 403*54753Sjohnh * Switch source directory to point to lofsed vnode 404*54753Sjohnh */ 405*54753Sjohnh PUSHREF(fdvp, ap->a_fdvp); 406*54753Sjohnh VREF(ap->a_fdvp); 407*54753Sjohnh 408*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 409*54753Sjohnh printf("lofs_rename - switch source vp\n"); 410*54753Sjohnh #endif 411*54753Sjohnh /* 412*54753Sjohnh * And source object if it is lofsed... 413*54753Sjohnh */ 414*54753Sjohnh fvp = ap->a_fvp; 415*54753Sjohnh if (fvp && fvp->v_op == lofs_vnodeop_p) { 416*54753Sjohnh ap->a_fvp = LOFSVP(fvp); 417*54753Sjohnh VREF(ap->a_fvp); 418*54753Sjohnh } else { 419*54753Sjohnh fvp = 0; 420*54753Sjohnh } 421*54753Sjohnh 422*54753Sjohnh #if 0 423*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 424*54753Sjohnh printf("lofs_rename - switch source start vp\n"); 425*54753Sjohnh #endif 426*54753Sjohnh /* 427*54753Sjohnh * And source startdir object if it is lofsed... 428*54753Sjohnh */ 429*54753Sjohnh fsvp = fndp->ni_startdir; 430*54753Sjohnh if (fsvp && fsvp->v_op == lofs_vnodeop_p) { 431*54753Sjohnh fndp->ni_startdir = LOFSVP(fsvp); 432*54753Sjohnh VREF(fndp->ni_startdir); 433*54753Sjohnh } else { 434*54753Sjohnh fsvp = 0; 435*54753Sjohnh } 436*54753Sjohnh #endif 437*54753Sjohnh 438*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 439*54753Sjohnh printf("lofs_rename - switch target dvp\n"); 440*54753Sjohnh #endif 441*54753Sjohnh /* 442*54753Sjohnh * Switch target directory to point to lofsed vnode 443*54753Sjohnh */ 444*54753Sjohnh tdvp = ap->a_tdvp; 445*54753Sjohnh if (tdvp && tdvp->v_op == lofs_vnodeop_p) { 446*54753Sjohnh ap->a_tdvp = LOFSVP(tdvp); 447*54753Sjohnh VREF(ap->a_tdvp); 448*54753Sjohnh } else { 449*54753Sjohnh tdvp = 0; 450*54753Sjohnh } 451*54753Sjohnh 452*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 453*54753Sjohnh printf("lofs_rename - switch target vp\n"); 454*54753Sjohnh #endif 455*54753Sjohnh /* 456*54753Sjohnh * And target object if it is lofsed... 457*54753Sjohnh */ 458*54753Sjohnh tvp = ap->a_tvp; 459*54753Sjohnh if (tvp && tvp->v_op == lofs_vnodeop_p) { 460*54753Sjohnh ap->a_tvp = LOFSVP(tvp); 461*54753Sjohnh VREF(ap->a_tvp); 462*54753Sjohnh } else { 463*54753Sjohnh tvp = 0; 464*54753Sjohnh } 465*54753Sjohnh 466*54753Sjohnh #if 0 467*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 468*54753Sjohnh printf("lofs_rename - switch target start vp\n"); 469*54753Sjohnh #endif 470*54753Sjohnh /* 471*54753Sjohnh * And target startdir object if it is lofsed... 472*54753Sjohnh */ 473*54753Sjohnh tsvp = tndp->ni_startdir; 474*54753Sjohnh if (tsvp && tsvp->v_op == lofs_vnodeop_p) { 475*54753Sjohnh tndp->ni_startdir = LOFSVP(fsvp); 476*54753Sjohnh VREF(tndp->ni_startdir); 477*54753Sjohnh } else { 478*54753Sjohnh tsvp = 0; 479*54753Sjohnh } 480*54753Sjohnh #endif 481*54753Sjohnh 482*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 483*54753Sjohnh printf("lofs_rename - VOP_RENAME(%x, %x, %x, %x)\n", 484*54753Sjohnh ap->a_fdvp, ap->a_fvp, ap->a_tdvp, ap->a_tvp); 485*54753Sjohnh vprint("ap->a_fdvp", ap->a_fdvp); 486*54753Sjohnh vprint("ap->a_fvp", ap->a_fvp); 487*54753Sjohnh vprint("ap->a_tdvp", ap->a_tdvp); 488*54753Sjohnh if (ap->a_tvp) vprint("ap->a_tvp", ap->a_tvp); 489*54753Sjohnh DELAY(16000000); 490*54753Sjohnh #endif 491*54753Sjohnh 492*54753Sjohnh error = VOP_RENAME(ap->a_fdvp, ap->a_fvp, ap->a_fcnp, ap->a_tdvp, ap->a_tvp, ap->a_tcnp); 493*54753Sjohnh 494*54753Sjohnh /* 495*54753Sjohnh * Put everything back... 496*54753Sjohnh */ 497*54753Sjohnh 498*54753Sjohnh #if 0 499*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 500*54753Sjohnh printf("lofs_rename - restore target startdir\n"); 501*54753Sjohnh #endif 502*54753Sjohnh 503*54753Sjohnh if (tsvp) { 504*54753Sjohnh if (tndp->ni_startdir) 505*54753Sjohnh vrele(tndp->ni_startdir); 506*54753Sjohnh tndp->ni_startdir = tsvp; 507*54753Sjohnh } 508*54753Sjohnh #endif 509*54753Sjohnh 510*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 511*54753Sjohnh printf("lofs_rename - restore target vp\n"); 512*54753Sjohnh #endif 513*54753Sjohnh 514*54753Sjohnh if (tvp) { 515*54753Sjohnh ap->a_tvp = tvp; 516*54753Sjohnh vrele(ap->a_tvp); 517*54753Sjohnh } 518*54753Sjohnh 519*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 520*54753Sjohnh printf("lofs_rename - restore target dvp\n"); 521*54753Sjohnh #endif 522*54753Sjohnh 523*54753Sjohnh if (tdvp) { 524*54753Sjohnh ap->a_tdvp = tdvp; 525*54753Sjohnh vrele(ap->a_tdvp); 526*54753Sjohnh } 527*54753Sjohnh 528*54753Sjohnh #if 0 529*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 530*54753Sjohnh printf("lofs_rename - restore source startdir\n"); 531*54753Sjohnh #endif 532*54753Sjohnh 533*54753Sjohnh if (fsvp) { 534*54753Sjohnh if (fndp->ni_startdir) 535*54753Sjohnh vrele(fndp->ni_startdir); 536*54753Sjohnh fndp->ni_startdir = fsvp; 537*54753Sjohnh } 538*54753Sjohnh #endif 539*54753Sjohnh 540*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 541*54753Sjohnh printf("lofs_rename - restore source vp\n"); 542*54753Sjohnh #endif 543*54753Sjohnh 544*54753Sjohnh 545*54753Sjohnh if (fvp) { 546*54753Sjohnh ap->a_fvp = fvp; 547*54753Sjohnh vrele(ap->a_fvp); 548*54753Sjohnh } 549*54753Sjohnh 550*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 551*54753Sjohnh printf("lofs_rename - restore source dvp\n"); 552*54753Sjohnh #endif 553*54753Sjohnh 554*54753Sjohnh POP(fdvp, ap->a_fdvp); 555*54753Sjohnh vrele(ap->a_fdvp); 556*54753Sjohnh 557*54753Sjohnh return (error); 558*54753Sjohnh } 559*54753Sjohnh 560*54753Sjohnh /* 561*54753Sjohnh * ni_dvp is the locked (alias) parent. 562*54753Sjohnh * ni_vp is NULL. 563*54753Sjohnh */ 564*54753Sjohnh lofs_mkdir (ap) 565*54753Sjohnh struct vop_mkdir_args *ap; 566*54753Sjohnh { 567*54753Sjohnh USES_VOP_MKDIR; 568*54753Sjohnh int error; 569*54753Sjohnh struct vnode *dvp = ap->a_dvp; 570*54753Sjohnh struct vnode *xdvp; 571*54753Sjohnh struct vnode *newvp; 572*54753Sjohnh 573*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 574*54753Sjohnh printf("lofs_mkdir(vp = %x->%x)\n", dvp, LOFSVP(dvp)); 575*54753Sjohnh #endif 576*54753Sjohnh 577*54753Sjohnh xdvp = dvp; 578*54753Sjohnh dvp = LOFSVP(xdvp); 579*54753Sjohnh /*VREF(dvp);*/ 580*54753Sjohnh 581*54753Sjohnh error = VOP_MKDIR(dvp, &newvp, ap->a_cnp, ap->a_vap); 582*54753Sjohnh 583*54753Sjohnh if (error) { 584*54753Sjohnh *ap->a_vpp = NULLVP; 585*54753Sjohnh /*vrele(xdvp);*/ 586*54753Sjohnh return (error); 587*54753Sjohnh } 588*54753Sjohnh 589*54753Sjohnh /* 590*54753Sjohnh * Make a new lofs node 591*54753Sjohnh */ 592*54753Sjohnh /*VREF(dvp);*/ 593*54753Sjohnh 594*54753Sjohnh error = make_lofs(dvp->v_mount, &newvp); 595*54753Sjohnh 596*54753Sjohnh *ap->a_vpp = newvp; 597*54753Sjohnh 598*54753Sjohnh return (error); 599*54753Sjohnh } 600*54753Sjohnh 601*54753Sjohnh /* 602*54753Sjohnh * ni_dvp is the locked parent. 603*54753Sjohnh * ni_vp is the entry to be removed. 604*54753Sjohnh */ 605*54753Sjohnh lofs_rmdir (ap) 606*54753Sjohnh struct vop_rmdir_args *ap; 607*54753Sjohnh { 608*54753Sjohnh USES_VOP_RMDIR; 609*54753Sjohnh struct vnode *vp = ap->a_vp; 610*54753Sjohnh struct vnode *dvp = ap->a_dvp; 611*54753Sjohnh int error; 612*54753Sjohnh 613*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 614*54753Sjohnh printf("lofs_rmdir(dvp = %x->%x)\n", dvp, LOFSVP(dvp)); 615*54753Sjohnh #endif 616*54753Sjohnh 617*54753Sjohnh PUSHREF(xdvp, dvp); 618*54753Sjohnh VREF(dvp); 619*54753Sjohnh PUSHREF(xvp, vp); 620*54753Sjohnh VREF(vp); 621*54753Sjohnh 622*54753Sjohnh error = VOP_RMDIR(dvp, vp, ap->a_cnp); 623*54753Sjohnh 624*54753Sjohnh POP(xvp, vp); 625*54753Sjohnh vrele(vp); 626*54753Sjohnh POP(xdvp, dvp); 627*54753Sjohnh vrele(dvp); 628*54753Sjohnh 629*54753Sjohnh return (error); 630*54753Sjohnh } 631*54753Sjohnh 632*54753Sjohnh /* 633*54753Sjohnh * ni_dvp is the locked parent. 634*54753Sjohnh * ni_vp is NULL. 635*54753Sjohnh */ 636*54753Sjohnh lofs_symlink (ap) 637*54753Sjohnh struct vop_symlink_args *ap; 638*54753Sjohnh { 639*54753Sjohnh USES_VOP_SYMLINK; 640*54753Sjohnh int error; 641*54753Sjohnh 642*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 643*54753Sjohnh printf("VOP_SYMLINK(vp = %x->%x)\n", ap->a_dvp, LOFSVP(ap->a_dvp)); 644*54753Sjohnh #endif 645*54753Sjohnh 646*54753Sjohnh PUSHREF(xdvp, ap->a_dvp); 647*54753Sjohnh VREF(ap->a_dvp); 648*54753Sjohnh 649*54753Sjohnh error = VOP_SYMLINK(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap, ap->a_target); 650*54753Sjohnh 651*54753Sjohnh POP(xdvp, ap->a_dvp); 652*54753Sjohnh vrele(ap->a_dvp); 653*54753Sjohnh 654*54753Sjohnh return (error); 655*54753Sjohnh } 656*54753Sjohnh 657*54753Sjohnh lofs_readdir (ap) 658*54753Sjohnh struct vop_readdir_args *ap; 659*54753Sjohnh { 660*54753Sjohnh USES_VOP_READDIR; 661*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 662*54753Sjohnh printf("lofs_readdir(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp)); 663*54753Sjohnh #endif 664*54753Sjohnh 665*54753Sjohnh return VOP_READDIR(LOFSVP(ap->a_vp), ap->a_uio, ap->a_cred, ap->a_eofflagp); 666*54753Sjohnh } 667*54753Sjohnh 668*54753Sjohnh lofs_readlink (ap) 669*54753Sjohnh struct vop_readlink_args *ap; 670*54753Sjohnh { 671*54753Sjohnh USES_VOP_READLINK; 672*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 673*54753Sjohnh printf("lofs_readlink(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp)); 674*54753Sjohnh #endif 675*54753Sjohnh 676*54753Sjohnh return VOP_READLINK(LOFSVP(ap->a_vp), ap->a_uio, ap->a_cred); 677*54753Sjohnh } 678*54753Sjohnh 679*54753Sjohnh /* 680*54753Sjohnh * Anyone's guess... 681*54753Sjohnh */ 682*54753Sjohnh lofs_abortop (ap) 683*54753Sjohnh struct vop_abortop_args *ap; 684*54753Sjohnh { 685*54753Sjohnh USES_VOP_ABORTOP; 686*54753Sjohnh int error; 687*54753Sjohnh 688*54753Sjohnh PUSHREF(xdvp, ap->a_dvp); 689*54753Sjohnh 690*54753Sjohnh error = VOP_ABORTOP(ap->a_dvp, ap->a_cnp); 691*54753Sjohnh 692*54753Sjohnh POP(xdvp, ap->a_dvp); 693*54753Sjohnh 694*54753Sjohnh return (error); 695*54753Sjohnh } 696*54753Sjohnh 697*54753Sjohnh lofs_inactive (ap) 698*54753Sjohnh struct vop_inactive_args *ap; 699*54753Sjohnh { 700*54753Sjohnh USES_VOP_INACTIVE; 701*54753Sjohnh struct vnode *targetvp = LOFSVP(ap->a_vp); 702*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 703*54753Sjohnh printf("lofs_inactive(ap->a_vp = %x->%x)\n", ap->a_vp, targetvp); 704*54753Sjohnh #endif 705*54753Sjohnh 706*54753Sjohnh #ifdef DIAGNOSTIC 707*54753Sjohnh { extern int prtactive; 708*54753Sjohnh if (prtactive && ap->a_vp->v_usecount != 0) 709*54753Sjohnh vprint("lofs_inactive: pushing active", ap->a_vp); 710*54753Sjohnh } 711*54753Sjohnh #endif 712*54753Sjohnh 713*54753Sjohnh if (targetvp) { 714*54753Sjohnh vrele(targetvp); 715*54753Sjohnh LOFSP(ap->a_vp)->a_lofsvp = 0; 716*54753Sjohnh } 717*54753Sjohnh } 718*54753Sjohnh 719*54753Sjohnh lofs_reclaim (ap) 720*54753Sjohnh struct vop_reclaim_args *ap; 721*54753Sjohnh { 722*54753Sjohnh USES_VOP_RECLAIM; 723*54753Sjohnh struct vnode *targetvp; 724*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 725*54753Sjohnh printf("lofs_reclaim(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp)); 726*54753Sjohnh #endif 727*54753Sjohnh remque(LOFSP(ap->a_vp)); 728*54753Sjohnh targetvp = LOFSVP(ap->a_vp); 729*54753Sjohnh if (targetvp) { 730*54753Sjohnh printf("lofs: delayed vrele of %x\n", targetvp); 731*54753Sjohnh vrele(targetvp); /* XXX should never happen */ 732*54753Sjohnh } 733*54753Sjohnh FREE(ap->a_vp->v_data, M_TEMP); 734*54753Sjohnh ap->a_vp->v_data = 0; 735*54753Sjohnh return (0); 736*54753Sjohnh } 737*54753Sjohnh 738*54753Sjohnh lofs_lock (ap) 739*54753Sjohnh struct vop_lock_args *ap; 740*54753Sjohnh { 741*54753Sjohnh USES_VOP_LOCK; 742*54753Sjohnh int error; 743*54753Sjohnh struct vnode *targetvp = LOFSVP(ap->a_vp); 744*54753Sjohnh 745*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 746*54753Sjohnh printf("lofs_lock(ap->a_vp = %x->%x)\n", ap->a_vp, targetvp); 747*54753Sjohnh /*vprint("lofs_lock ap->a_vp", ap->a_vp); 748*54753Sjohnh if (targetvp) 749*54753Sjohnh vprint("lofs_lock ->ap->a_vp", targetvp); 750*54753Sjohnh else 751*54753Sjohnh printf("lofs_lock ->ap->a_vp = NIL\n");*/ 752*54753Sjohnh #endif 753*54753Sjohnh 754*54753Sjohnh if (targetvp) { 755*54753Sjohnh error = VOP_LOCK(targetvp); 756*54753Sjohnh if (error) 757*54753Sjohnh return (error); 758*54753Sjohnh } 759*54753Sjohnh 760*54753Sjohnh return (0); 761*54753Sjohnh } 762*54753Sjohnh 763*54753Sjohnh lofs_unlock (ap) 764*54753Sjohnh struct vop_unlock_args *ap; 765*54753Sjohnh { 766*54753Sjohnh USES_VOP_UNLOCK; 767*54753Sjohnh struct vnode *targetvp = LOFSVP(ap->a_vp); 768*54753Sjohnh 769*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 770*54753Sjohnh printf("lofs_unlock(ap->a_vp = %x->%x)\n", ap->a_vp, targetvp); 771*54753Sjohnh #endif 772*54753Sjohnh 773*54753Sjohnh if (targetvp) 774*54753Sjohnh return (VOP_UNLOCK(targetvp)); 775*54753Sjohnh return (0); 776*54753Sjohnh } 777*54753Sjohnh 778*54753Sjohnh lofs_bmap (ap) 779*54753Sjohnh struct vop_bmap_args *ap; 780*54753Sjohnh { 781*54753Sjohnh USES_VOP_BMAP; 782*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 783*54753Sjohnh printf("lofs_bmap(ap->a_vp = %x->%x)\n", ap->a_vp, LOFSVP(ap->a_vp)); 784*54753Sjohnh #endif 785*54753Sjohnh 786*54753Sjohnh return VOP_BMAP(LOFSVP(ap->a_vp), ap->a_bn, ap->a_vpp, ap->a_bnp); 787*54753Sjohnh } 788*54753Sjohnh 789*54753Sjohnh lofs_strategy (ap) 790*54753Sjohnh struct vop_strategy_args *ap; 791*54753Sjohnh { 792*54753Sjohnh USES_VOP_STRATEGY; 793*54753Sjohnh int error; 794*54753Sjohnh 795*54753Sjohnh #ifdef LOFS_DIAGNOSTIC 796*54753Sjohnh printf("lofs_strategy(vp = %x->%x)\n", ap->a_bp->b_vp, LOFSVP(ap->a_bp->b_vp)); 797*54753Sjohnh #endif 798*54753Sjohnh 799*54753Sjohnh PUSHREF(vp, ap->a_bp->b_vp); 800*54753Sjohnh 801*54753Sjohnh error = VOP_STRATEGY(ap->a_bp); 802*54753Sjohnh 803*54753Sjohnh POP(vp, ap->a_bp->b_vp); 804*54753Sjohnh 805*54753Sjohnh return (error); 806*54753Sjohnh } 807*54753Sjohnh 808*54753Sjohnh lofs_print (ap) 809*54753Sjohnh struct vop_print_args *ap; 810*54753Sjohnh { 811*54753Sjohnh USES_VOP_PRINT; 812*54753Sjohnh struct vnode *targetvp = LOFSVP(ap->a_vp); 813*54753Sjohnh printf("tag VT_LOFS ref "); 814*54753Sjohnh if (targetvp) 815*54753Sjohnh return (VOP_PRINT(targetvp)); 816*54753Sjohnh printf("NULLVP\n"); 817*54753Sjohnh return (0); 818*54753Sjohnh } 819*54753Sjohnh 820*54753Sjohnh lofs_islocked (ap) 821*54753Sjohnh struct vop_islocked_args *ap; 822*54753Sjohnh { 823*54753Sjohnh USES_VOP_ISLOCKED; 824*54753Sjohnh struct vnode *targetvp = LOFSVP(ap->a_vp); 825*54753Sjohnh if (targetvp) 826*54753Sjohnh return (VOP_ISLOCKED(targetvp)); 827*54753Sjohnh return (0); 828*54753Sjohnh } 829*54753Sjohnh 830*54753Sjohnh lofs_advlock (ap) 831*54753Sjohnh struct vop_advlock_args *ap; 832*54753Sjohnh { 833*54753Sjohnh USES_VOP_ADVLOCK; 834*54753Sjohnh return VOP_ADVLOCK(LOFSVP(ap->a_vp), ap->a_id, ap->a_op, ap->a_fl, ap->a_flags); 835*54753Sjohnh } 836*54753Sjohnh 837*54753Sjohnh /* 838*54753Sjohnh * LOFS directory offset lookup. 839*54753Sjohnh * Currently unsupported. 840*54753Sjohnh */ 841*54753Sjohnh lofs_blkatoff (ap) 842*54753Sjohnh struct vop_blkatoff_args *ap; 843*54753Sjohnh { 844*54753Sjohnh 845*54753Sjohnh return (EOPNOTSUPP); 846*54753Sjohnh } 847*54753Sjohnh 848*54753Sjohnh /* 849*54753Sjohnh * LOFS flat namespace lookup. 850*54753Sjohnh * Currently unsupported. 851*54753Sjohnh */ 852*54753Sjohnh lofs_vget (ap) 853*54753Sjohnh struct vop_vget_args *ap; 854*54753Sjohnh { 855*54753Sjohnh 856*54753Sjohnh return (EOPNOTSUPP); 857*54753Sjohnh } 858*54753Sjohnh 859*54753Sjohnh /* 860*54753Sjohnh * LOFS flat namespace allocation. 861*54753Sjohnh * Currently unsupported. 862*54753Sjohnh */ 863*54753Sjohnh lofs_valloc (ap) 864*54753Sjohnh struct vop_valloc_args *ap; 865*54753Sjohnh { 866*54753Sjohnh 867*54753Sjohnh return (EOPNOTSUPP); 868*54753Sjohnh } 869*54753Sjohnh 870*54753Sjohnh /* 871*54753Sjohnh * LOFS flat namespace free. 872*54753Sjohnh * Currently unsupported. 873*54753Sjohnh */ 874*54753Sjohnh /*void*/ 875*54753Sjohnh lofs_vfree (ap) 876*54753Sjohnh struct vop_vfree_args *ap; 877*54753Sjohnh { 878*54753Sjohnh 879*54753Sjohnh return; 880*54753Sjohnh } 881*54753Sjohnh 882*54753Sjohnh /* 883*54753Sjohnh * LOFS file truncation. 884*54753Sjohnh */ 885*54753Sjohnh lofs_truncate (ap) 886*54753Sjohnh struct vop_truncate_args *ap; 887*54753Sjohnh { 888*54753Sjohnh 889*54753Sjohnh /* Use lofs_setattr */ 890*54753Sjohnh printf("lofs_truncate: need to implement!!"); 891*54753Sjohnh return (EOPNOTSUPP); 892*54753Sjohnh } 893*54753Sjohnh 894*54753Sjohnh /* 895*54753Sjohnh * LOFS update. 896*54753Sjohnh */ 897*54753Sjohnh lofs_update (ap) 898*54753Sjohnh struct vop_update_args *ap; 899*54753Sjohnh { 900*54753Sjohnh 901*54753Sjohnh /* Use lofs_setattr */ 902*54753Sjohnh printf("lofs_update: need to implement!!"); 903*54753Sjohnh return (EOPNOTSUPP); 904*54753Sjohnh } 905*54753Sjohnh 906*54753Sjohnh /* 907*54753Sjohnh * LOFS bwrite 908*54753Sjohnh */ 909*54753Sjohnh lofs_bwrite (ap) 910*54753Sjohnh struct vop_bwrite_args *ap; 911*54753Sjohnh { 912*54753Sjohnh return (EOPNOTSUPP); 913*54753Sjohnh } 914*54753Sjohnh 915*54753Sjohnh /* 916*54753Sjohnh * Global vfs data structures for ufs 917*54753Sjohnh */ 918*54753Sjohnh int (**lofs_vnodeop_p)(); 919*54753Sjohnh struct vnodeopv_entry_desc lofs_vnodeop_entries[] = { 920*54753Sjohnh { &vop_default_desc, vn_default_error }, 921*54753Sjohnh { &vop_lookup_desc, lofs_lookup }, /* lookup */ 922*54753Sjohnh { &vop_create_desc, lofs_create }, /* create */ 923*54753Sjohnh { &vop_mknod_desc, lofs_mknod }, /* mknod */ 924*54753Sjohnh { &vop_open_desc, lofs_open }, /* open */ 925*54753Sjohnh { &vop_close_desc, lofs_close }, /* close */ 926*54753Sjohnh { &vop_access_desc, lofs_access }, /* access */ 927*54753Sjohnh { &vop_getattr_desc, lofs_getattr }, /* getattr */ 928*54753Sjohnh { &vop_setattr_desc, lofs_setattr }, /* setattr */ 929*54753Sjohnh { &vop_read_desc, lofs_read }, /* read */ 930*54753Sjohnh { &vop_write_desc, lofs_write }, /* write */ 931*54753Sjohnh { &vop_ioctl_desc, lofs_ioctl }, /* ioctl */ 932*54753Sjohnh { &vop_select_desc, lofs_select }, /* select */ 933*54753Sjohnh { &vop_mmap_desc, lofs_mmap }, /* mmap */ 934*54753Sjohnh { &vop_fsync_desc, lofs_fsync }, /* fsync */ 935*54753Sjohnh { &vop_seek_desc, lofs_seek }, /* seek */ 936*54753Sjohnh { &vop_remove_desc, lofs_remove }, /* remove */ 937*54753Sjohnh { &vop_link_desc, lofs_link }, /* link */ 938*54753Sjohnh { &vop_rename_desc, lofs_rename }, /* rename */ 939*54753Sjohnh { &vop_mkdir_desc, lofs_mkdir }, /* mkdir */ 940*54753Sjohnh { &vop_rmdir_desc, lofs_rmdir }, /* rmdir */ 941*54753Sjohnh { &vop_symlink_desc, lofs_symlink }, /* symlink */ 942*54753Sjohnh { &vop_readdir_desc, lofs_readdir }, /* readdir */ 943*54753Sjohnh { &vop_readlink_desc, lofs_readlink }, /* readlink */ 944*54753Sjohnh { &vop_abortop_desc, lofs_abortop }, /* abortop */ 945*54753Sjohnh { &vop_inactive_desc, lofs_inactive }, /* inactive */ 946*54753Sjohnh { &vop_reclaim_desc, lofs_reclaim }, /* reclaim */ 947*54753Sjohnh { &vop_lock_desc, lofs_lock }, /* lock */ 948*54753Sjohnh { &vop_unlock_desc, lofs_unlock }, /* unlock */ 949*54753Sjohnh { &vop_bmap_desc, lofs_bmap }, /* bmap */ 950*54753Sjohnh { &vop_strategy_desc, lofs_strategy }, /* strategy */ 951*54753Sjohnh { &vop_print_desc, lofs_print }, /* print */ 952*54753Sjohnh { &vop_islocked_desc, lofs_islocked }, /* islocked */ 953*54753Sjohnh { &vop_advlock_desc, lofs_advlock }, /* advlock */ 954*54753Sjohnh { &vop_blkatoff_desc, lofs_blkatoff }, /* blkatoff */ 955*54753Sjohnh { &vop_vget_desc, lofs_vget }, /* vget */ 956*54753Sjohnh { &vop_valloc_desc, lofs_valloc }, /* valloc */ 957*54753Sjohnh { &vop_vfree_desc, lofs_vfree }, /* vfree */ 958*54753Sjohnh { &vop_truncate_desc, lofs_truncate }, /* truncate */ 959*54753Sjohnh { &vop_update_desc, lofs_update }, /* update */ 960*54753Sjohnh { &vop_bwrite_desc, lofs_bwrite }, /* bwrite */ 961*54753Sjohnh { (struct vnodeop_desc*)NULL, (int(*)())NULL } 962*54753Sjohnh }; 963*54753Sjohnh struct vnodeopv_desc lofs_vnodeop_opv_desc = 964*54753Sjohnh { &lofs_vnodeop_p, lofs_vnodeop_entries }; 965