154753Sjohnh /* 254753Sjohnh * Copyright (c) 1992 The Regents of the University of California 354753Sjohnh * Copyright (c) 1990, 1992 Jan-Simon Pendry 454753Sjohnh * All rights reserved. 554753Sjohnh * 654753Sjohnh * This code is derived from software donated to Berkeley by 754753Sjohnh * Jan-Simon Pendry. 854753Sjohnh * 954753Sjohnh * %sccs.include.redist.c% 1054753Sjohnh * 1154753Sjohnh * @(#)lofs_vnops.c 1.2 (Berkeley) 6/18/92 1254753Sjohnh * 1354753Sjohnh * $Id: lofs_vnops.c,v 1.11 1992/05/30 10:05:43 jsp Exp jsp $ 1454753Sjohnh */ 1554753Sjohnh 1654753Sjohnh /* 17*54754Sjohnh * Null layer Filesystem 1854753Sjohnh */ 1954753Sjohnh 2054753Sjohnh #include <sys/param.h> 2154753Sjohnh #include <sys/systm.h> 2254753Sjohnh #include <sys/proc.h> 2354753Sjohnh #include <sys/time.h> 2454753Sjohnh #include <sys/types.h> 2554753Sjohnh #include <sys/vnode.h> 2654753Sjohnh #include <sys/mount.h> 2754753Sjohnh #include <sys/namei.h> 2854753Sjohnh #include <sys/malloc.h> 2954753Sjohnh #include <sys/buf.h> 3054753Sjohnh #include <lofs/lofs.h> 3154753Sjohnh 3254753Sjohnh /* 3354753Sjohnh * Basic strategy: as usual, do as little work as possible. 3454753Sjohnh * Nothing is ever locked in the lofs'ed filesystem, all 3554753Sjohnh * locks are held in the underlying filesystems. 3654753Sjohnh */ 3754753Sjohnh 3854753Sjohnh /* 3954753Sjohnh * Save a vnode and replace with 4054753Sjohnh * the lofs'ed one 4154753Sjohnh */ 4254753Sjohnh #define PUSHREF(v, nd) \ 4354753Sjohnh { \ 4454753Sjohnh struct { struct vnode *vnp; } v; \ 4554753Sjohnh v.vnp = (nd); \ 46*54754Sjohnh (nd) = NULLTOLOWERVP(v.vnp) 4754753Sjohnh 4854753Sjohnh /* 4954753Sjohnh * Undo the PUSHREF 5054753Sjohnh */ 5154753Sjohnh #define POP(v, nd) \ 5254753Sjohnh \ 5354753Sjohnh (nd) = v.vnp; \ 5454753Sjohnh } 5554753Sjohnh 5654753Sjohnh 5754753Sjohnh /* 5854753Sjohnh * vp is the current namei directory 5954753Sjohnh * ndp is the name to locate in that directory... 6054753Sjohnh */ 61*54754Sjohnh null_lookup (ap) 6254753Sjohnh struct vop_lookup_args *ap; 6354753Sjohnh { 6454753Sjohnh USES_VOP_LOOKUP; 6554753Sjohnh struct vnode *dvp = ap->a_dvp; 6654753Sjohnh struct vnode *newvp; 6754753Sjohnh struct vnode *targetdvp; 6854753Sjohnh int error; 6954753Sjohnh int flag = ap->a_cnp->cn_nameiop /*& OPMASK*/; 7054753Sjohnh 71*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 72*54754Sjohnh printf("null_lookup(ap->a_dvp = %x->%x, \"%s\", op = %d)\n", 73*54754Sjohnh dvp, NULLTOLOWERVP(dvp), ap->a_cnp->cn_nameptr, flag); 7454753Sjohnh #endif 7554753Sjohnh 7654753Sjohnh /* 7754753Sjohnh * (ap->a_dvp) was locked when passed in, and it will be replaced 7854753Sjohnh * with the target vnode, BUT that will already have been 79*54754Sjohnh * locked when (ap->a_dvp) was locked [see null_lock]. all that 8054753Sjohnh * must be done here is to keep track of reference counts. 8154753Sjohnh */ 82*54754Sjohnh targetdvp = NULLTOLOWERVP(dvp); 8354753Sjohnh /*VREF(targetdvp);*/ 84*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 8554753Sjohnh vprint("lofs VOP_LOOKUP", targetdvp); 8654753Sjohnh #endif 8754753Sjohnh 8854753Sjohnh /* 8954753Sjohnh * Call lookup on the looped vnode 9054753Sjohnh */ 9154753Sjohnh error = VOP_LOOKUP(targetdvp, &newvp, ap->a_cnp); 9254753Sjohnh /*vrele(targetdvp);*/ 9354753Sjohnh 9454753Sjohnh if (error) { 9554753Sjohnh *ap->a_vpp = NULLVP; 96*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 97*54754Sjohnh printf("null_lookup(%x->%x) = %d\n", dvp, NULLTOLOWERVP(dvp), error); 9854753Sjohnh #endif 9954753Sjohnh return (error); 10054753Sjohnh } 101*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 102*54754Sjohnh printf("null_lookup(%x->%x) = OK\n", dvp, NULLTOLOWERVP(dvp)); 10354753Sjohnh #endif 10454753Sjohnh 10554753Sjohnh *ap->a_vpp = newvp; 10654753Sjohnh 10754753Sjohnh /* 10854753Sjohnh * If we just found a directory then make 10954753Sjohnh * a loopback node for it and return the loopback 11054753Sjohnh * instead of the real vnode. Otherwise simply 11154753Sjohnh * return the aliased directory and vnode. 11254753Sjohnh */ 11354753Sjohnh if (newvp && newvp->v_type == VDIR && flag == LOOKUP) { 114*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 115*54754Sjohnh printf("null_lookup: found VDIR\n"); 11654753Sjohnh #endif 11754753Sjohnh /* 11854753Sjohnh * At this point, newvp is the vnode to be looped. 11954753Sjohnh * Activate a loopback and return the looped vnode. 12054753Sjohnh */ 121*54754Sjohnh return (make_null_node(dvp->v_mount, ap->a_vpp)); 12254753Sjohnh } 12354753Sjohnh 124*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 125*54754Sjohnh printf("null_lookup: not VDIR\n"); 12654753Sjohnh #endif 12754753Sjohnh 12854753Sjohnh return (0); 12954753Sjohnh } 13054753Sjohnh 13154753Sjohnh /* 13254753Sjohnh * this = ni_dvp 13354753Sjohnh * ni_dvp references the locked directory. 13454753Sjohnh * ni_vp is NULL. 13554753Sjohnh */ 136*54754Sjohnh null_mknod (ap) 13754753Sjohnh struct vop_mknod_args *ap; 13854753Sjohnh { 13954753Sjohnh USES_VOP_MKNOD; 14054753Sjohnh int error; 14154753Sjohnh 142*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 143*54754Sjohnh printf("null_mknod(vp = %x->%x)\n", ap->a_dvp, NULLTOLOWERVP(ap->a_dvp)); 14454753Sjohnh #endif 14554753Sjohnh 14654753Sjohnh PUSHREF(xdvp, ap->a_dvp); 14754753Sjohnh VREF(ap->a_dvp); 14854753Sjohnh 14954753Sjohnh error = VOP_MKNOD(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap); 15054753Sjohnh 15154753Sjohnh POP(xdvp, ap->a_dvp); 15254753Sjohnh vrele(ap->a_dvp); 15354753Sjohnh 15454753Sjohnh return (error); 15554753Sjohnh } 15654753Sjohnh 15754753Sjohnh /* 15854753Sjohnh * this = ni_dvp; 15954753Sjohnh * ni_dvp references the locked directory 16054753Sjohnh * ni_vp is NULL. 16154753Sjohnh */ 162*54754Sjohnh null_create (ap) 16354753Sjohnh struct vop_create_args *ap; 16454753Sjohnh { 16554753Sjohnh USES_VOP_CREATE; 16654753Sjohnh int error; 16754753Sjohnh 168*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 169*54754Sjohnh printf("null_create(ap->a_dvp = %x->%x)\n", ap->a_dvp, NULLTOLOWERVP(ap->a_dvp)); 17054753Sjohnh #endif 17154753Sjohnh 17254753Sjohnh PUSHREF(xdvp, ap->a_dvp); 17354753Sjohnh VREF(ap->a_dvp); 17454753Sjohnh 17554753Sjohnh error = VOP_CREATE(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap); 17654753Sjohnh 17754753Sjohnh POP(xdvp, ap->a_dvp); 17854753Sjohnh vrele(ap->a_dvp); 17954753Sjohnh 180*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 181*54754Sjohnh printf("null_create(ap->a_dvp = %x->%x)\n", ap->a_dvp, NULLTOLOWERVP(ap->a_dvp)); 18254753Sjohnh #endif 18354753Sjohnh 18454753Sjohnh return (error); 18554753Sjohnh } 18654753Sjohnh 187*54754Sjohnh null_open (ap) 18854753Sjohnh struct vop_open_args *ap; 18954753Sjohnh { 19054753Sjohnh USES_VOP_OPEN; 191*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 192*54754Sjohnh printf("null_open(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp)); 19354753Sjohnh #endif 19454753Sjohnh 195*54754Sjohnh return VOP_OPEN(NULLTOLOWERVP(ap->a_vp), ap->a_mode, ap->a_cred, ap->a_p); 19654753Sjohnh } 19754753Sjohnh 198*54754Sjohnh null_close (ap) 19954753Sjohnh struct vop_close_args *ap; 20054753Sjohnh { 20154753Sjohnh USES_VOP_CLOSE; 202*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 203*54754Sjohnh printf("null_close(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp)); 20454753Sjohnh #endif 20554753Sjohnh 206*54754Sjohnh return VOP_CLOSE(NULLTOLOWERVP(ap->a_vp), ap->a_fflag, ap->a_cred, ap->a_p); 20754753Sjohnh } 20854753Sjohnh 209*54754Sjohnh null_access (ap) 21054753Sjohnh struct vop_access_args *ap; 21154753Sjohnh { 21254753Sjohnh USES_VOP_ACCESS; 213*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 214*54754Sjohnh printf("null_access(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp)); 21554753Sjohnh #endif 21654753Sjohnh 217*54754Sjohnh return VOP_ACCESS(NULLTOLOWERVP(ap->a_vp), ap->a_mode, ap->a_cred, ap->a_p); 21854753Sjohnh } 21954753Sjohnh 220*54754Sjohnh null_getattr (ap) 22154753Sjohnh struct vop_getattr_args *ap; 22254753Sjohnh { 22354753Sjohnh USES_VOP_GETATTR; 22454753Sjohnh int error; 22554753Sjohnh 226*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 227*54754Sjohnh printf("null_getattr(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp)); 22854753Sjohnh #endif 22954753Sjohnh 23054753Sjohnh /* 23154753Sjohnh * Get the stats from the underlying filesystem 23254753Sjohnh */ 233*54754Sjohnh error = VOP_GETATTR(NULLTOLOWERVP(ap->a_vp), ap->a_vap, ap->a_cred, ap->a_p); 23454753Sjohnh if (error) 23554753Sjohnh return (error); 23654753Sjohnh /* 23754753Sjohnh * and replace the fsid field with the loopback number 23854753Sjohnh * to preserve the namespace. 23954753Sjohnh */ 24054753Sjohnh ap->a_vap->va_fsid = ap->a_vp->v_mount->mnt_stat.f_fsid.val[0]; 24154753Sjohnh return (0); 24254753Sjohnh } 24354753Sjohnh 244*54754Sjohnh null_setattr (ap) 24554753Sjohnh struct vop_setattr_args *ap; 24654753Sjohnh { 24754753Sjohnh USES_VOP_SETATTR; 248*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 249*54754Sjohnh printf("null_setattr(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp)); 25054753Sjohnh #endif 25154753Sjohnh 252*54754Sjohnh return VOP_SETATTR(NULLTOLOWERVP(ap->a_vp), ap->a_vap, ap->a_cred, ap->a_p); 25354753Sjohnh } 25454753Sjohnh 255*54754Sjohnh null_read (ap) 25654753Sjohnh struct vop_read_args *ap; 25754753Sjohnh { 25854753Sjohnh USES_VOP_READ; 259*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 260*54754Sjohnh printf("null_read(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp)); 26154753Sjohnh #endif 26254753Sjohnh 263*54754Sjohnh return VOP_READ(NULLTOLOWERVP(ap->a_vp), ap->a_uio, ap->a_ioflag, ap->a_cred); 26454753Sjohnh } 26554753Sjohnh 266*54754Sjohnh null_write (ap) 26754753Sjohnh struct vop_write_args *ap; 26854753Sjohnh { 26954753Sjohnh USES_VOP_WRITE; 270*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 271*54754Sjohnh printf("null_write(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp)); 27254753Sjohnh #endif 27354753Sjohnh 274*54754Sjohnh return VOP_WRITE(NULLTOLOWERVP(ap->a_vp), ap->a_uio, ap->a_ioflag, ap->a_cred); 27554753Sjohnh } 27654753Sjohnh 277*54754Sjohnh null_ioctl (ap) 27854753Sjohnh struct vop_ioctl_args *ap; 27954753Sjohnh { 28054753Sjohnh USES_VOP_IOCTL; 281*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 282*54754Sjohnh printf("null_ioctl(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp)); 28354753Sjohnh #endif 28454753Sjohnh 285*54754Sjohnh return VOP_IOCTL(NULLTOLOWERVP(ap->a_vp), ap->a_command, ap->a_data, ap->a_fflag, ap->a_cred, ap->a_p); 28654753Sjohnh } 28754753Sjohnh 288*54754Sjohnh null_select (ap) 28954753Sjohnh struct vop_select_args *ap; 29054753Sjohnh { 29154753Sjohnh USES_VOP_SELECT; 292*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 293*54754Sjohnh printf("null_select(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp)); 29454753Sjohnh #endif 29554753Sjohnh 296*54754Sjohnh return VOP_SELECT(NULLTOLOWERVP(ap->a_vp), ap->a_which, ap->a_fflags, ap->a_cred, ap->a_p); 29754753Sjohnh } 29854753Sjohnh 299*54754Sjohnh null_mmap (ap) 30054753Sjohnh struct vop_mmap_args *ap; 30154753Sjohnh { 30254753Sjohnh USES_VOP_MMAP; 303*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 304*54754Sjohnh printf("null_mmap(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp)); 30554753Sjohnh #endif 30654753Sjohnh 307*54754Sjohnh return VOP_MMAP(NULLTOLOWERVP(ap->a_vp), ap->a_fflags, ap->a_cred, ap->a_p); 30854753Sjohnh } 30954753Sjohnh 310*54754Sjohnh null_fsync (ap) 31154753Sjohnh struct vop_fsync_args *ap; 31254753Sjohnh { 31354753Sjohnh USES_VOP_FSYNC; 314*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 315*54754Sjohnh printf("null_fsync(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp)); 31654753Sjohnh #endif 31754753Sjohnh 318*54754Sjohnh return VOP_FSYNC(NULLTOLOWERVP(ap->a_vp), ap->a_fflags, ap->a_cred, ap->a_waitfor, ap->a_p); 31954753Sjohnh } 32054753Sjohnh 321*54754Sjohnh null_seek (ap) 32254753Sjohnh struct vop_seek_args *ap; 32354753Sjohnh { 32454753Sjohnh USES_VOP_SEEK; 325*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 326*54754Sjohnh printf("null_seek(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp)); 32754753Sjohnh #endif 32854753Sjohnh 329*54754Sjohnh return VOP_SEEK(NULLTOLOWERVP(ap->a_vp), ap->a_oldoff, ap->a_newoff, ap->a_cred); 33054753Sjohnh } 33154753Sjohnh 332*54754Sjohnh null_remove (ap) 33354753Sjohnh struct vop_remove_args *ap; 33454753Sjohnh { 33554753Sjohnh USES_VOP_REMOVE; 33654753Sjohnh int error; 33754753Sjohnh 338*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 339*54754Sjohnh printf("null_remove(ap->a_vp = %x->%x)\n", ap->a_dvp, NULLTOLOWERVP(ap->a_dvp)); 34054753Sjohnh #endif 34154753Sjohnh 34254753Sjohnh PUSHREF(xdvp, ap->a_dvp); 34354753Sjohnh VREF(ap->a_dvp); 34454753Sjohnh PUSHREF(xvp, ap->a_vp); 34554753Sjohnh VREF(ap->a_vp); 34654753Sjohnh 34754753Sjohnh error = VOP_REMOVE(ap->a_dvp, ap->a_vp, ap->a_cnp); 34854753Sjohnh 34954753Sjohnh POP(xvp, ap->a_vp); 35054753Sjohnh vrele(ap->a_vp); 35154753Sjohnh POP(xdvp, ap->a_dvp); 35254753Sjohnh vrele(ap->a_dvp); 35354753Sjohnh 35454753Sjohnh return (error); 35554753Sjohnh } 35654753Sjohnh 35754753Sjohnh /* 35854753Sjohnh * vp is this. 35954753Sjohnh * ni_dvp is the locked parent of the target. 36054753Sjohnh * ni_vp is NULL. 36154753Sjohnh */ 362*54754Sjohnh null_link (ap) 36354753Sjohnh struct vop_link_args *ap; 36454753Sjohnh { 36554753Sjohnh USES_VOP_LINK; 36654753Sjohnh int error; 36754753Sjohnh 368*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 369*54754Sjohnh printf("null_link(ap->a_tdvp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp)); 37054753Sjohnh #endif 37154753Sjohnh 37254753Sjohnh PUSHREF(xdvp, ap->a_vp); 37354753Sjohnh VREF(ap->a_vp); 37454753Sjohnh 375*54754Sjohnh error = VOP_LINK(ap->a_vp, NULLTOLOWERVP(ap->a_tdvp), ap->a_cnp); 37654753Sjohnh 37754753Sjohnh POP(xdvp, ap->a_vp); 37854753Sjohnh vrele(ap->a_vp); 37954753Sjohnh 38054753Sjohnh return (error); 38154753Sjohnh } 38254753Sjohnh 383*54754Sjohnh null_rename (ap) 38454753Sjohnh struct vop_rename_args *ap; 38554753Sjohnh { 38654753Sjohnh USES_VOP_RENAME; 38754753Sjohnh struct vnode *fvp, *tvp; 38854753Sjohnh struct vnode *tdvp; 38954753Sjohnh #if 0 39054753Sjohnh struct vnode *fsvp, *tsvp; 39154753Sjohnh #endif 39254753Sjohnh int error; 39354753Sjohnh 394*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 395*54754Sjohnh printf("null_rename(fdvp = %x->%x)\n", ap->a_fdvp, NULLTOLOWERVP(ap->a_fdvp)); 396*54754Sjohnh /*printf("null_rename(tdvp = %x->%x)\n", tndp->ni_dvp, NULLTOLOWERVP(tndp->ni_dvp));*/ 39754753Sjohnh #endif 39854753Sjohnh 399*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 400*54754Sjohnh printf("null_rename - switch source dvp\n"); 40154753Sjohnh #endif 40254753Sjohnh /* 40354753Sjohnh * Switch source directory to point to lofsed vnode 40454753Sjohnh */ 40554753Sjohnh PUSHREF(fdvp, ap->a_fdvp); 40654753Sjohnh VREF(ap->a_fdvp); 40754753Sjohnh 408*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 409*54754Sjohnh printf("null_rename - switch source vp\n"); 41054753Sjohnh #endif 41154753Sjohnh /* 41254753Sjohnh * And source object if it is lofsed... 41354753Sjohnh */ 41454753Sjohnh fvp = ap->a_fvp; 415*54754Sjohnh if (fvp && fvp->v_op == null_vnodeop_p) { 416*54754Sjohnh ap->a_fvp = NULLTOLOWERVP(fvp); 41754753Sjohnh VREF(ap->a_fvp); 41854753Sjohnh } else { 41954753Sjohnh fvp = 0; 42054753Sjohnh } 42154753Sjohnh 42254753Sjohnh #if 0 423*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 424*54754Sjohnh printf("null_rename - switch source start vp\n"); 42554753Sjohnh #endif 42654753Sjohnh /* 42754753Sjohnh * And source startdir object if it is lofsed... 42854753Sjohnh */ 42954753Sjohnh fsvp = fndp->ni_startdir; 430*54754Sjohnh if (fsvp && fsvp->v_op == null_vnodeop_p) { 431*54754Sjohnh fndp->ni_startdir = NULLTOLOWERVP(fsvp); 43254753Sjohnh VREF(fndp->ni_startdir); 43354753Sjohnh } else { 43454753Sjohnh fsvp = 0; 43554753Sjohnh } 43654753Sjohnh #endif 43754753Sjohnh 438*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 439*54754Sjohnh printf("null_rename - switch target dvp\n"); 44054753Sjohnh #endif 44154753Sjohnh /* 44254753Sjohnh * Switch target directory to point to lofsed vnode 44354753Sjohnh */ 44454753Sjohnh tdvp = ap->a_tdvp; 445*54754Sjohnh if (tdvp && tdvp->v_op == null_vnodeop_p) { 446*54754Sjohnh ap->a_tdvp = NULLTOLOWERVP(tdvp); 44754753Sjohnh VREF(ap->a_tdvp); 44854753Sjohnh } else { 44954753Sjohnh tdvp = 0; 45054753Sjohnh } 45154753Sjohnh 452*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 453*54754Sjohnh printf("null_rename - switch target vp\n"); 45454753Sjohnh #endif 45554753Sjohnh /* 45654753Sjohnh * And target object if it is lofsed... 45754753Sjohnh */ 45854753Sjohnh tvp = ap->a_tvp; 459*54754Sjohnh if (tvp && tvp->v_op == null_vnodeop_p) { 460*54754Sjohnh ap->a_tvp = NULLTOLOWERVP(tvp); 46154753Sjohnh VREF(ap->a_tvp); 46254753Sjohnh } else { 46354753Sjohnh tvp = 0; 46454753Sjohnh } 46554753Sjohnh 46654753Sjohnh #if 0 467*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 468*54754Sjohnh printf("null_rename - switch target start vp\n"); 46954753Sjohnh #endif 47054753Sjohnh /* 47154753Sjohnh * And target startdir object if it is lofsed... 47254753Sjohnh */ 47354753Sjohnh tsvp = tndp->ni_startdir; 474*54754Sjohnh if (tsvp && tsvp->v_op == null_vnodeop_p) { 475*54754Sjohnh tndp->ni_startdir = NULLTOLOWERVP(fsvp); 47654753Sjohnh VREF(tndp->ni_startdir); 47754753Sjohnh } else { 47854753Sjohnh tsvp = 0; 47954753Sjohnh } 48054753Sjohnh #endif 48154753Sjohnh 482*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 483*54754Sjohnh printf("null_rename - VOP_RENAME(%x, %x, %x, %x)\n", 48454753Sjohnh ap->a_fdvp, ap->a_fvp, ap->a_tdvp, ap->a_tvp); 48554753Sjohnh vprint("ap->a_fdvp", ap->a_fdvp); 48654753Sjohnh vprint("ap->a_fvp", ap->a_fvp); 48754753Sjohnh vprint("ap->a_tdvp", ap->a_tdvp); 48854753Sjohnh if (ap->a_tvp) vprint("ap->a_tvp", ap->a_tvp); 48954753Sjohnh DELAY(16000000); 49054753Sjohnh #endif 49154753Sjohnh 49254753Sjohnh error = VOP_RENAME(ap->a_fdvp, ap->a_fvp, ap->a_fcnp, ap->a_tdvp, ap->a_tvp, ap->a_tcnp); 49354753Sjohnh 49454753Sjohnh /* 49554753Sjohnh * Put everything back... 49654753Sjohnh */ 49754753Sjohnh 49854753Sjohnh #if 0 499*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 500*54754Sjohnh printf("null_rename - restore target startdir\n"); 50154753Sjohnh #endif 50254753Sjohnh 50354753Sjohnh if (tsvp) { 50454753Sjohnh if (tndp->ni_startdir) 50554753Sjohnh vrele(tndp->ni_startdir); 50654753Sjohnh tndp->ni_startdir = tsvp; 50754753Sjohnh } 50854753Sjohnh #endif 50954753Sjohnh 510*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 511*54754Sjohnh printf("null_rename - restore target vp\n"); 51254753Sjohnh #endif 51354753Sjohnh 51454753Sjohnh if (tvp) { 51554753Sjohnh ap->a_tvp = tvp; 51654753Sjohnh vrele(ap->a_tvp); 51754753Sjohnh } 51854753Sjohnh 519*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 520*54754Sjohnh printf("null_rename - restore target dvp\n"); 52154753Sjohnh #endif 52254753Sjohnh 52354753Sjohnh if (tdvp) { 52454753Sjohnh ap->a_tdvp = tdvp; 52554753Sjohnh vrele(ap->a_tdvp); 52654753Sjohnh } 52754753Sjohnh 52854753Sjohnh #if 0 529*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 530*54754Sjohnh printf("null_rename - restore source startdir\n"); 53154753Sjohnh #endif 53254753Sjohnh 53354753Sjohnh if (fsvp) { 53454753Sjohnh if (fndp->ni_startdir) 53554753Sjohnh vrele(fndp->ni_startdir); 53654753Sjohnh fndp->ni_startdir = fsvp; 53754753Sjohnh } 53854753Sjohnh #endif 53954753Sjohnh 540*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 541*54754Sjohnh printf("null_rename - restore source vp\n"); 54254753Sjohnh #endif 54354753Sjohnh 54454753Sjohnh 54554753Sjohnh if (fvp) { 54654753Sjohnh ap->a_fvp = fvp; 54754753Sjohnh vrele(ap->a_fvp); 54854753Sjohnh } 54954753Sjohnh 550*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 551*54754Sjohnh printf("null_rename - restore source dvp\n"); 55254753Sjohnh #endif 55354753Sjohnh 55454753Sjohnh POP(fdvp, ap->a_fdvp); 55554753Sjohnh vrele(ap->a_fdvp); 55654753Sjohnh 55754753Sjohnh return (error); 55854753Sjohnh } 55954753Sjohnh 56054753Sjohnh /* 56154753Sjohnh * ni_dvp is the locked (alias) parent. 56254753Sjohnh * ni_vp is NULL. 56354753Sjohnh */ 564*54754Sjohnh null_mkdir (ap) 56554753Sjohnh struct vop_mkdir_args *ap; 56654753Sjohnh { 56754753Sjohnh USES_VOP_MKDIR; 56854753Sjohnh int error; 56954753Sjohnh struct vnode *dvp = ap->a_dvp; 57054753Sjohnh struct vnode *xdvp; 57154753Sjohnh struct vnode *newvp; 57254753Sjohnh 573*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 574*54754Sjohnh printf("null_mkdir(vp = %x->%x)\n", dvp, NULLTOLOWERVP(dvp)); 57554753Sjohnh #endif 57654753Sjohnh 57754753Sjohnh xdvp = dvp; 578*54754Sjohnh dvp = NULLTOLOWERVP(xdvp); 57954753Sjohnh /*VREF(dvp);*/ 58054753Sjohnh 58154753Sjohnh error = VOP_MKDIR(dvp, &newvp, ap->a_cnp, ap->a_vap); 58254753Sjohnh 58354753Sjohnh if (error) { 58454753Sjohnh *ap->a_vpp = NULLVP; 58554753Sjohnh /*vrele(xdvp);*/ 58654753Sjohnh return (error); 58754753Sjohnh } 58854753Sjohnh 58954753Sjohnh /* 59054753Sjohnh * Make a new lofs node 59154753Sjohnh */ 59254753Sjohnh /*VREF(dvp);*/ 59354753Sjohnh 594*54754Sjohnh error = make_null_node(dvp->v_mount, &newvp); 59554753Sjohnh 59654753Sjohnh *ap->a_vpp = newvp; 59754753Sjohnh 59854753Sjohnh return (error); 59954753Sjohnh } 60054753Sjohnh 60154753Sjohnh /* 60254753Sjohnh * ni_dvp is the locked parent. 60354753Sjohnh * ni_vp is the entry to be removed. 60454753Sjohnh */ 605*54754Sjohnh null_rmdir (ap) 60654753Sjohnh struct vop_rmdir_args *ap; 60754753Sjohnh { 60854753Sjohnh USES_VOP_RMDIR; 60954753Sjohnh struct vnode *vp = ap->a_vp; 61054753Sjohnh struct vnode *dvp = ap->a_dvp; 61154753Sjohnh int error; 61254753Sjohnh 613*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 614*54754Sjohnh printf("null_rmdir(dvp = %x->%x)\n", dvp, NULLTOLOWERVP(dvp)); 61554753Sjohnh #endif 61654753Sjohnh 61754753Sjohnh PUSHREF(xdvp, dvp); 61854753Sjohnh VREF(dvp); 61954753Sjohnh PUSHREF(xvp, vp); 62054753Sjohnh VREF(vp); 62154753Sjohnh 62254753Sjohnh error = VOP_RMDIR(dvp, vp, ap->a_cnp); 62354753Sjohnh 62454753Sjohnh POP(xvp, vp); 62554753Sjohnh vrele(vp); 62654753Sjohnh POP(xdvp, dvp); 62754753Sjohnh vrele(dvp); 62854753Sjohnh 62954753Sjohnh return (error); 63054753Sjohnh } 63154753Sjohnh 63254753Sjohnh /* 63354753Sjohnh * ni_dvp is the locked parent. 63454753Sjohnh * ni_vp is NULL. 63554753Sjohnh */ 636*54754Sjohnh null_symlink (ap) 63754753Sjohnh struct vop_symlink_args *ap; 63854753Sjohnh { 63954753Sjohnh USES_VOP_SYMLINK; 64054753Sjohnh int error; 64154753Sjohnh 642*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 643*54754Sjohnh printf("VOP_SYMLINK(vp = %x->%x)\n", ap->a_dvp, NULLTOLOWERVP(ap->a_dvp)); 64454753Sjohnh #endif 64554753Sjohnh 64654753Sjohnh PUSHREF(xdvp, ap->a_dvp); 64754753Sjohnh VREF(ap->a_dvp); 64854753Sjohnh 64954753Sjohnh error = VOP_SYMLINK(ap->a_dvp, ap->a_vpp, ap->a_cnp, ap->a_vap, ap->a_target); 65054753Sjohnh 65154753Sjohnh POP(xdvp, ap->a_dvp); 65254753Sjohnh vrele(ap->a_dvp); 65354753Sjohnh 65454753Sjohnh return (error); 65554753Sjohnh } 65654753Sjohnh 657*54754Sjohnh null_readdir (ap) 65854753Sjohnh struct vop_readdir_args *ap; 65954753Sjohnh { 66054753Sjohnh USES_VOP_READDIR; 661*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 662*54754Sjohnh printf("null_readdir(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp)); 66354753Sjohnh #endif 66454753Sjohnh 665*54754Sjohnh return VOP_READDIR(NULLTOLOWERVP(ap->a_vp), ap->a_uio, ap->a_cred, ap->a_eofflagp); 66654753Sjohnh } 66754753Sjohnh 668*54754Sjohnh null_readlink (ap) 66954753Sjohnh struct vop_readlink_args *ap; 67054753Sjohnh { 67154753Sjohnh USES_VOP_READLINK; 672*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 673*54754Sjohnh printf("null_readlink(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp)); 67454753Sjohnh #endif 67554753Sjohnh 676*54754Sjohnh return VOP_READLINK(NULLTOLOWERVP(ap->a_vp), ap->a_uio, ap->a_cred); 67754753Sjohnh } 67854753Sjohnh 67954753Sjohnh /* 68054753Sjohnh * Anyone's guess... 68154753Sjohnh */ 682*54754Sjohnh null_abortop (ap) 68354753Sjohnh struct vop_abortop_args *ap; 68454753Sjohnh { 68554753Sjohnh USES_VOP_ABORTOP; 68654753Sjohnh int error; 68754753Sjohnh 68854753Sjohnh PUSHREF(xdvp, ap->a_dvp); 68954753Sjohnh 69054753Sjohnh error = VOP_ABORTOP(ap->a_dvp, ap->a_cnp); 69154753Sjohnh 69254753Sjohnh POP(xdvp, ap->a_dvp); 69354753Sjohnh 69454753Sjohnh return (error); 69554753Sjohnh } 69654753Sjohnh 697*54754Sjohnh null_inactive (ap) 69854753Sjohnh struct vop_inactive_args *ap; 69954753Sjohnh { 70054753Sjohnh USES_VOP_INACTIVE; 701*54754Sjohnh struct vnode *targetvp = NULLTOLOWERVP(ap->a_vp); 702*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 703*54754Sjohnh printf("null_inactive(ap->a_vp = %x->%x)\n", ap->a_vp, targetvp); 70454753Sjohnh #endif 70554753Sjohnh 70654753Sjohnh #ifdef DIAGNOSTIC 70754753Sjohnh { extern int prtactive; 70854753Sjohnh if (prtactive && ap->a_vp->v_usecount != 0) 709*54754Sjohnh vprint("null_inactive: pushing active", ap->a_vp); 71054753Sjohnh } 71154753Sjohnh #endif 71254753Sjohnh 71354753Sjohnh if (targetvp) { 71454753Sjohnh vrele(targetvp); 715*54754Sjohnh VTONULLNODE(ap->a_vp)->null_lowervp = 0; 71654753Sjohnh } 71754753Sjohnh } 71854753Sjohnh 719*54754Sjohnh null_reclaim (ap) 72054753Sjohnh struct vop_reclaim_args *ap; 72154753Sjohnh { 72254753Sjohnh USES_VOP_RECLAIM; 72354753Sjohnh struct vnode *targetvp; 724*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 725*54754Sjohnh printf("null_reclaim(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp)); 72654753Sjohnh #endif 727*54754Sjohnh remque(VTONULLNODE(ap->a_vp)); 728*54754Sjohnh targetvp = NULLTOLOWERVP(ap->a_vp); 72954753Sjohnh if (targetvp) { 73054753Sjohnh printf("lofs: delayed vrele of %x\n", targetvp); 73154753Sjohnh vrele(targetvp); /* XXX should never happen */ 73254753Sjohnh } 73354753Sjohnh FREE(ap->a_vp->v_data, M_TEMP); 73454753Sjohnh ap->a_vp->v_data = 0; 73554753Sjohnh return (0); 73654753Sjohnh } 73754753Sjohnh 738*54754Sjohnh null_lock (ap) 73954753Sjohnh struct vop_lock_args *ap; 74054753Sjohnh { 74154753Sjohnh USES_VOP_LOCK; 74254753Sjohnh int error; 743*54754Sjohnh struct vnode *targetvp = NULLTOLOWERVP(ap->a_vp); 74454753Sjohnh 745*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 746*54754Sjohnh printf("null_lock(ap->a_vp = %x->%x)\n", ap->a_vp, targetvp); 747*54754Sjohnh /*vprint("null_lock ap->a_vp", ap->a_vp); 74854753Sjohnh if (targetvp) 749*54754Sjohnh vprint("null_lock ->ap->a_vp", targetvp); 75054753Sjohnh else 751*54754Sjohnh printf("null_lock ->ap->a_vp = NIL\n");*/ 75254753Sjohnh #endif 75354753Sjohnh 75454753Sjohnh if (targetvp) { 75554753Sjohnh error = VOP_LOCK(targetvp); 75654753Sjohnh if (error) 75754753Sjohnh return (error); 75854753Sjohnh } 75954753Sjohnh 76054753Sjohnh return (0); 76154753Sjohnh } 76254753Sjohnh 763*54754Sjohnh null_unlock (ap) 76454753Sjohnh struct vop_unlock_args *ap; 76554753Sjohnh { 76654753Sjohnh USES_VOP_UNLOCK; 767*54754Sjohnh struct vnode *targetvp = NULLTOLOWERVP(ap->a_vp); 76854753Sjohnh 769*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 770*54754Sjohnh printf("null_unlock(ap->a_vp = %x->%x)\n", ap->a_vp, targetvp); 77154753Sjohnh #endif 77254753Sjohnh 77354753Sjohnh if (targetvp) 77454753Sjohnh return (VOP_UNLOCK(targetvp)); 77554753Sjohnh return (0); 77654753Sjohnh } 77754753Sjohnh 778*54754Sjohnh null_bmap (ap) 77954753Sjohnh struct vop_bmap_args *ap; 78054753Sjohnh { 78154753Sjohnh USES_VOP_BMAP; 782*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 783*54754Sjohnh printf("null_bmap(ap->a_vp = %x->%x)\n", ap->a_vp, NULLTOLOWERVP(ap->a_vp)); 78454753Sjohnh #endif 78554753Sjohnh 786*54754Sjohnh return VOP_BMAP(NULLTOLOWERVP(ap->a_vp), ap->a_bn, ap->a_vpp, ap->a_bnp); 78754753Sjohnh } 78854753Sjohnh 789*54754Sjohnh null_strategy (ap) 79054753Sjohnh struct vop_strategy_args *ap; 79154753Sjohnh { 79254753Sjohnh USES_VOP_STRATEGY; 79354753Sjohnh int error; 79454753Sjohnh 795*54754Sjohnh #ifdef NULLFS_DIAGNOSTIC 796*54754Sjohnh printf("null_strategy(vp = %x->%x)\n", ap->a_bp->b_vp, NULLTOLOWERVP(ap->a_bp->b_vp)); 79754753Sjohnh #endif 79854753Sjohnh 79954753Sjohnh PUSHREF(vp, ap->a_bp->b_vp); 80054753Sjohnh 80154753Sjohnh error = VOP_STRATEGY(ap->a_bp); 80254753Sjohnh 80354753Sjohnh POP(vp, ap->a_bp->b_vp); 80454753Sjohnh 80554753Sjohnh return (error); 80654753Sjohnh } 80754753Sjohnh 808*54754Sjohnh null_print (ap) 80954753Sjohnh struct vop_print_args *ap; 81054753Sjohnh { 81154753Sjohnh USES_VOP_PRINT; 812*54754Sjohnh struct vnode *targetvp = NULLTOLOWERVP(ap->a_vp); 81354753Sjohnh printf("tag VT_LOFS ref "); 81454753Sjohnh if (targetvp) 81554753Sjohnh return (VOP_PRINT(targetvp)); 81654753Sjohnh printf("NULLVP\n"); 81754753Sjohnh return (0); 81854753Sjohnh } 81954753Sjohnh 820*54754Sjohnh null_islocked (ap) 82154753Sjohnh struct vop_islocked_args *ap; 82254753Sjohnh { 82354753Sjohnh USES_VOP_ISLOCKED; 824*54754Sjohnh struct vnode *targetvp = NULLTOLOWERVP(ap->a_vp); 82554753Sjohnh if (targetvp) 82654753Sjohnh return (VOP_ISLOCKED(targetvp)); 82754753Sjohnh return (0); 82854753Sjohnh } 82954753Sjohnh 830*54754Sjohnh null_advlock (ap) 83154753Sjohnh struct vop_advlock_args *ap; 83254753Sjohnh { 83354753Sjohnh USES_VOP_ADVLOCK; 834*54754Sjohnh return VOP_ADVLOCK(NULLTOLOWERVP(ap->a_vp), ap->a_id, ap->a_op, ap->a_fl, ap->a_flags); 83554753Sjohnh } 83654753Sjohnh 83754753Sjohnh /* 83854753Sjohnh * LOFS directory offset lookup. 83954753Sjohnh * Currently unsupported. 84054753Sjohnh */ 841*54754Sjohnh null_blkatoff (ap) 84254753Sjohnh struct vop_blkatoff_args *ap; 84354753Sjohnh { 84454753Sjohnh 84554753Sjohnh return (EOPNOTSUPP); 84654753Sjohnh } 84754753Sjohnh 84854753Sjohnh /* 84954753Sjohnh * LOFS flat namespace lookup. 85054753Sjohnh * Currently unsupported. 85154753Sjohnh */ 852*54754Sjohnh null_vget (ap) 85354753Sjohnh struct vop_vget_args *ap; 85454753Sjohnh { 85554753Sjohnh 85654753Sjohnh return (EOPNOTSUPP); 85754753Sjohnh } 85854753Sjohnh 85954753Sjohnh /* 86054753Sjohnh * LOFS flat namespace allocation. 86154753Sjohnh * Currently unsupported. 86254753Sjohnh */ 863*54754Sjohnh null_valloc (ap) 86454753Sjohnh struct vop_valloc_args *ap; 86554753Sjohnh { 86654753Sjohnh 86754753Sjohnh return (EOPNOTSUPP); 86854753Sjohnh } 86954753Sjohnh 87054753Sjohnh /* 87154753Sjohnh * LOFS flat namespace free. 87254753Sjohnh * Currently unsupported. 87354753Sjohnh */ 87454753Sjohnh /*void*/ 875*54754Sjohnh null_vfree (ap) 87654753Sjohnh struct vop_vfree_args *ap; 87754753Sjohnh { 87854753Sjohnh 87954753Sjohnh return; 88054753Sjohnh } 88154753Sjohnh 88254753Sjohnh /* 88354753Sjohnh * LOFS file truncation. 88454753Sjohnh */ 885*54754Sjohnh null_truncate (ap) 88654753Sjohnh struct vop_truncate_args *ap; 88754753Sjohnh { 88854753Sjohnh 889*54754Sjohnh /* Use null_setattr */ 890*54754Sjohnh printf("null_truncate: need to implement!!"); 89154753Sjohnh return (EOPNOTSUPP); 89254753Sjohnh } 89354753Sjohnh 89454753Sjohnh /* 89554753Sjohnh * LOFS update. 89654753Sjohnh */ 897*54754Sjohnh null_update (ap) 89854753Sjohnh struct vop_update_args *ap; 89954753Sjohnh { 90054753Sjohnh 901*54754Sjohnh /* Use null_setattr */ 902*54754Sjohnh printf("null_update: need to implement!!"); 90354753Sjohnh return (EOPNOTSUPP); 90454753Sjohnh } 90554753Sjohnh 90654753Sjohnh /* 90754753Sjohnh * LOFS bwrite 90854753Sjohnh */ 909*54754Sjohnh null_bwrite (ap) 91054753Sjohnh struct vop_bwrite_args *ap; 91154753Sjohnh { 91254753Sjohnh return (EOPNOTSUPP); 91354753Sjohnh } 91454753Sjohnh 91554753Sjohnh /* 91654753Sjohnh * Global vfs data structures for ufs 91754753Sjohnh */ 918*54754Sjohnh int (**null_vnodeop_p)(); 91954753Sjohnh struct vnodeopv_entry_desc lofs_vnodeop_entries[] = { 92054753Sjohnh { &vop_default_desc, vn_default_error }, 921*54754Sjohnh { &vop_lookup_desc, null_lookup }, /* lookup */ 922*54754Sjohnh { &vop_create_desc, null_create }, /* create */ 923*54754Sjohnh { &vop_mknod_desc, null_mknod }, /* mknod */ 924*54754Sjohnh { &vop_open_desc, null_open }, /* open */ 925*54754Sjohnh { &vop_close_desc, null_close }, /* close */ 926*54754Sjohnh { &vop_access_desc, null_access }, /* access */ 927*54754Sjohnh { &vop_getattr_desc, null_getattr }, /* getattr */ 928*54754Sjohnh { &vop_setattr_desc, null_setattr }, /* setattr */ 929*54754Sjohnh { &vop_read_desc, null_read }, /* read */ 930*54754Sjohnh { &vop_write_desc, null_write }, /* write */ 931*54754Sjohnh { &vop_ioctl_desc, null_ioctl }, /* ioctl */ 932*54754Sjohnh { &vop_select_desc, null_select }, /* select */ 933*54754Sjohnh { &vop_mmap_desc, null_mmap }, /* mmap */ 934*54754Sjohnh { &vop_fsync_desc, null_fsync }, /* fsync */ 935*54754Sjohnh { &vop_seek_desc, null_seek }, /* seek */ 936*54754Sjohnh { &vop_remove_desc, null_remove }, /* remove */ 937*54754Sjohnh { &vop_link_desc, null_link }, /* link */ 938*54754Sjohnh { &vop_rename_desc, null_rename }, /* rename */ 939*54754Sjohnh { &vop_mkdir_desc, null_mkdir }, /* mkdir */ 940*54754Sjohnh { &vop_rmdir_desc, null_rmdir }, /* rmdir */ 941*54754Sjohnh { &vop_symlink_desc, null_symlink }, /* symlink */ 942*54754Sjohnh { &vop_readdir_desc, null_readdir }, /* readdir */ 943*54754Sjohnh { &vop_readlink_desc, null_readlink }, /* readlink */ 944*54754Sjohnh { &vop_abortop_desc, null_abortop }, /* abortop */ 945*54754Sjohnh { &vop_inactive_desc, null_inactive }, /* inactive */ 946*54754Sjohnh { &vop_reclaim_desc, null_reclaim }, /* reclaim */ 947*54754Sjohnh { &vop_lock_desc, null_lock }, /* lock */ 948*54754Sjohnh { &vop_unlock_desc, null_unlock }, /* unlock */ 949*54754Sjohnh { &vop_bmap_desc, null_bmap }, /* bmap */ 950*54754Sjohnh { &vop_strategy_desc, null_strategy }, /* strategy */ 951*54754Sjohnh { &vop_print_desc, null_print }, /* print */ 952*54754Sjohnh { &vop_islocked_desc, null_islocked }, /* islocked */ 953*54754Sjohnh { &vop_advlock_desc, null_advlock }, /* advlock */ 954*54754Sjohnh { &vop_blkatoff_desc, null_blkatoff }, /* blkatoff */ 955*54754Sjohnh { &vop_vget_desc, null_vget }, /* vget */ 956*54754Sjohnh { &vop_valloc_desc, null_valloc }, /* valloc */ 957*54754Sjohnh { &vop_vfree_desc, null_vfree }, /* vfree */ 958*54754Sjohnh { &vop_truncate_desc, null_truncate }, /* truncate */ 959*54754Sjohnh { &vop_update_desc, null_update }, /* update */ 960*54754Sjohnh { &vop_bwrite_desc, null_bwrite }, /* bwrite */ 96154753Sjohnh { (struct vnodeop_desc*)NULL, (int(*)())NULL } 96254753Sjohnh }; 96354753Sjohnh struct vnodeopv_desc lofs_vnodeop_opv_desc = 964*54754Sjohnh { &null_vnodeop_p, lofs_vnodeop_entries }; 965