Remove VOP_GETVOBJECT, VOP_DESTROYVOBJECT, and VOP_CREATEVOBJECT. Rearrange
authorMatthew Dillon <dillon@dragonflybsd.org>
Wed, 29 Mar 2006 18:45:07 +0000 (18:45 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Wed, 29 Mar 2006 18:45:07 +0000 (18:45 +0000)
the VFS code such that VOP_OPEN is now responsible for associating a VM
object with a vnode.  Add the vinitvmio() helper routine.

33 files changed:
sys/kern/imgact_aout.c
sys/kern/imgact_elf.c
sys/kern/kern_exec.c
sys/kern/kern_fp.c
sys/kern/uipc_syscalls.c
sys/kern/vfs_bio.c
sys/kern/vfs_default.c
sys/kern/vfs_mount.c
sys/kern/vfs_nlookup.c
sys/kern/vfs_subr.c
sys/kern/vfs_syscalls.c
sys/kern/vfs_vnops.c
sys/kern/vfs_vopops.c
sys/sys/vfsops.h
sys/sys/vnode.h
sys/vfs/coda/coda_fbsd.c
sys/vfs/coda/coda_vnops.c
sys/vfs/isofs/cd9660/cd9660_lookup.c
sys/vfs/isofs/cd9660/cd9660_vnops.c
sys/vfs/mfs/mfs_vnops.c
sys/vfs/msdosfs/msdosfs_vnops.c
sys/vfs/nfs/nfs_serv.c
sys/vfs/nfs/nfs_subs.c
sys/vfs/nfs/nfs_vnops.c
sys/vfs/ntfs/ntfs_vnops.c
sys/vfs/specfs/spec_vnops.c
sys/vfs/ufs/ffs_rawread.c
sys/vfs/ufs/ffs_vfsops.c
sys/vfs/ufs/ufs_lookup.c
sys/vfs/ufs/ufs_vnops.c
sys/vfs/union/union_subr.c
sys/vfs/union/union_vnops.c
sys/vm/vm_mmap.c

index 76b0e6d..496ffc7 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/imgact_aout.c,v 1.59.2.5 2001/11/03 01:41:08 ps Exp $
- * $DragonFly: src/sys/kern/imgact_aout.c,v 1.9 2004/07/24 20:21:35 dillon Exp $
+ * $DragonFly: src/sys/kern/imgact_aout.c,v 1.10 2006/03/29 18:44:50 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -179,7 +179,7 @@ exec_aout_imgact(struct image_params *imgp)
        map = &vmspace->vm_map;
        count = vm_map_entry_reserve(MAP_RESERVE_COUNT);
        vm_map_lock(map);
-       VOP_GETVOBJECT(vp, &object);
+       object = vp->v_object;
        vm_object_reference(object);
 
        text_end = virtual_offset + a_out->a_text;
index 6d99125..aebdc7e 100644 (file)
@@ -27,7 +27,7 @@
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/imgact_elf.c,v 1.73.2.13 2002/12/28 19:49:41 dillon Exp $
- * $DragonFly: src/sys/kern/imgact_elf.c,v 1.34 2006/03/27 01:54:15 dillon Exp $
+ * $DragonFly: src/sys/kern/imgact_elf.c,v 1.35 2006/03/29 18:44:50 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -241,7 +241,7 @@ elf_load_section(struct proc *p, struct vmspace *vmspace, struct vnode *vp,
        vm_offset_t file_addr;
        vm_offset_t data_buf = 0;
 
-       VOP_GETVOBJECT(vp, &object);
+       object = vp->v_object;
        error = 0;
 
        /*
index d75c2ab..ca1c6b1 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/kern/kern_exec.c,v 1.107.2.15 2002/07/30 15:40:46 nectar Exp $
- * $DragonFly: src/sys/kern/kern_exec.c,v 1.35 2005/10/09 20:12:34 corecode Exp $
+ * $DragonFly: src/sys/kern/kern_exec.c,v 1.36 2006/03/29 18:44:50 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -526,23 +526,14 @@ exec_map_first_page(struct image_params *imgp)
        vm_page_t ma[VM_INITIAL_PAGEIN];
        vm_page_t m;
        vm_object_t object;
-       int error;
 
        if (imgp->firstpage)
                exec_unmap_first_page(imgp);
 
        /*
-        * XXX the callers should really use vn_open so we don't have to
-        * do this junk.
+        * The file has to be mappable.
         */
-       if ((error = VOP_GETVOBJECT(imgp->vp, &object)) != 0) {
-               if (vn_canvmio(imgp->vp) == TRUE) {
-                       error = vfs_object_create(imgp->vp, curthread);
-                       if (error == 0)
-                               error = VOP_GETVOBJECT(imgp->vp, &object);
-               }
-       }
-       if (error)
+       if ((object = imgp->vp->v_object) == NULL)
                return (EIO);
 
        /*
@@ -950,8 +941,9 @@ exec_check_permissions(struct image_params *imgp)
                return (ETXTBSY);
 
        /*
-        * Call filesystem specific open routine (which does nothing in the
-        * general case).
+        * Call filesystem specific open routine, which allows us to read,
+        * write, and mmap the file.  Without the VOP_OPEN we can only
+        * stat the file.
         */
        error = VOP_OPEN(vp, FREAD, p->p_ucred, NULL, td);
        if (error)
index d64d58e..d8ffbf3 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/kern/kern_fp.c,v 1.12 2005/09/02 07:16:58 hsu Exp $
+ * $DragonFly: src/sys/kern/kern_fp.c,v 1.13 2006/03/29 18:44:50 dillon Exp $
  */
 
 /*
@@ -190,16 +190,6 @@ fp_vpopen(struct vnode *vp, int flags, file_t *fpp)
     if (error)
        goto bad1;
 
-    /*
-     * Make sure that a VM object is created for VMIO support.
-     */
-    if (vn_canvmio(vp) == TRUE) {
-       if ((error = vfs_object_create(vp, td)) != 0) {
-           VOP_CLOSE(vp, flags, td);
-           goto bad1;
-       }
-    }
-
     /*
      * All done, update v_writecount now that no more errors can occur.
      */
@@ -511,9 +501,9 @@ fp_mmap(void *addr_arg, size_t size, int prot, int flags, struct file *fp,
      * Get the proper underlying object
      */
     if (vp->v_type == VREG) {
-       if (VOP_GETVOBJECT(vp, &obj) != 0)
+       if ((obj = vp->v_object) == NULL)
            return (EINVAL);
-       vp = (struct vnode*)obj->handle;
+       KKASSERT(vp == (struct vnode *)obj->handle);
     }
 
     /*
index f023687..8c5152a 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)uipc_syscalls.c     8.4 (Berkeley) 2/21/94
  * $FreeBSD: src/sys/kern/uipc_syscalls.c,v 1.65.2.17 2003/04/04 17:11:16 tegge Exp $
- * $DragonFly: src/sys/kern/uipc_syscalls.c,v 1.60 2006/03/27 01:54:15 dillon Exp $
+ * $DragonFly: src/sys/kern/uipc_syscalls.c,v 1.61 2006/03/29 18:44:50 dillon Exp $
  */
 
 #include "opt_ktrace.h"
@@ -1447,7 +1447,11 @@ kern_sendfile(struct vnode *vp, int sfd, off_t offset, size_t nbytes,
        off_t hbytes = 0;
        int error = 0;
 
-       if (vp->v_type != VREG || VOP_GETVOBJECT(vp, &obj) != 0) {
+       if (vp->v_type != VREG) {
+               error = EINVAL;
+               goto done0;
+       }
+       if ((obj = vp->v_object) == NULL) {
                error = EINVAL;
                goto done0;
        }
index 1b1fe29..bf95b7a 100644 (file)
@@ -12,7 +12,7 @@
  *             John S. Dyson.
  *
  * $FreeBSD: src/sys/kern/vfs_bio.c,v 1.242.2.20 2003/05/28 18:38:10 alc Exp $
- * $DragonFly: src/sys/kern/vfs_bio.c,v 1.59 2006/03/24 18:35:33 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_bio.c,v 1.60 2006/03/29 18:44:50 dillon Exp $
  */
 
 /*
@@ -100,7 +100,6 @@ static void buf_daemon (void);
  * but the code is intricate enough already.
  */
 vm_page_t bogus_page;
-int vmiodirenable = TRUE;
 int runningbufspace;
 
 static int bufspace, maxbufspace,
@@ -128,8 +127,6 @@ SYSCTL_INT(_vfs, OID_AUTO, lorunningspace, CTLFLAG_RW, &lorunningspace, 0,
        "Minimum amount of buffer space required for active I/O");
 SYSCTL_INT(_vfs, OID_AUTO, hirunningspace, CTLFLAG_RW, &hirunningspace, 0,
        "Maximum amount of buffer space to usable for active I/O");
-SYSCTL_INT(_vfs, OID_AUTO, vmiodirenable, CTLFLAG_RW, &vmiodirenable, 0,
-       "Use the VM system for performing directory writes");
 /*
  * Sysctls determining current state of the buffer cache.
  */
@@ -1077,7 +1074,7 @@ brelse(struct buf * bp)
                         * no critical section protection is necessary.
                         */
                        if (m == bogus_page) {
-                               VOP_GETVOBJECT(vp, &obj);
+                               obj = vp->v_object;
                                poff = OFF_TO_IDX(bp->b_loffset);
 
                                for (j = i; j < bp->b_xio.xio_npages; j++) {
@@ -1974,8 +1971,8 @@ inmem(struct vnode *vp, off_t loffset)
                return 1;
        if (vp->v_mount == NULL)
                return 0;
-       if (VOP_GETVOBJECT(vp, &obj) != 0 || (vp->v_flag & VOBJBUF) == 0)
-               return 0;
+       if ((obj = vp->v_object) == NULL)
+               return 0;
 
        size = PAGE_SIZE;
        if (size > vp->v_mount->mnt_stat.f_iosize)
@@ -2156,6 +2153,8 @@ getblk(struct vnode *vp, off_t loffset, int size, int slpflag, int slptimeo)
 
        if (size > MAXBSIZE)
                panic("getblk: size(%d) > MAXBSIZE(%d)", size, MAXBSIZE);
+       if (vp->v_object == NULL)
+               panic("getblk: vnode %p has no object!", vp);
 
        crit_enter();
 loop:
@@ -2323,7 +2322,7 @@ loop:
                 * mechanism is such that the underlying directory (with a
                 * non-NULL v_mountedhere) is not a special case.
                 */
-               int bsize, maxsize, vmio;
+               int bsize, maxsize;
 
                if (vp->v_type == VBLK || vp->v_type == VCHR)
                        bsize = DEV_BSIZE;
@@ -2332,8 +2331,7 @@ loop:
                else
                        bsize = size;
 
-               vmio = (VOP_GETVOBJECT(vp, NULL) == 0) && (vp->v_flag & VOBJBUF);
-               maxsize = vmio ? size + (loffset & PAGE_MASK) : size;
+               maxsize = size + (loffset & PAGE_MASK);
                maxsize = imax(maxsize, bsize);
 
                if ((bp = getnewbuf(slpflag, slptimeo, size, maxsize)) == NULL) {
@@ -2378,13 +2376,8 @@ loop:
                 * allocbuf() for the VMIO case prior to it testing the
                 * backing store for validity.
                 */
-
-               if (vmio) {
+               if (vp->v_object) {
                        bp->b_flags |= B_VMIO;
-#if defined(VFS_BIO_DEBUG)
-                       if (vn_canvmio(vp) != TRUE)
-                               printf("getblk: vmioing file type %d???\n", vp->v_type);
-#endif
                } else {
                        bp->b_flags &= ~B_VMIO;
                }
@@ -2601,7 +2594,7 @@ allocbuf(struct buf *bp, int size)
                         * busycheck/wiring call.
                         */
                        vp = bp->b_vp;
-                       VOP_GETVOBJECT(vp, &obj);
+                       obj = vp->v_object;
 
                        crit_enter();
                        while (bp->b_xio.xio_npages < desiredpages) {
@@ -2810,7 +2803,6 @@ void
 biodone(struct bio *bio)
 {
        struct buf *bp = bio->bio_buf;
-       int error;
 
        crit_enter();
 
@@ -2879,28 +2871,19 @@ biodone(struct bio *bio)
                int iosize;
                struct vnode *vp = bp->b_vp;
 
-               error = VOP_GETVOBJECT(vp, &obj);
+               obj = vp->v_object;
 
 #if defined(VFS_BIO_DEBUG)
-               if (vp->v_holdcnt == 0) {
+               if (vp->v_holdcnt == 0)
                        panic("biodone: zero vnode hold count");
-               }
-
-               if (error) {
-                       panic("biodone: missing VM object");
-               }
-
-               if ((vp->v_flag & VOBJBUF) == 0) {
+               if ((vp->v_flag & VOBJBUF) == 0)
                        panic("biodone: vnode is not setup for merged cache");
-               }
 #endif
 
                foff = bp->b_loffset;
                KASSERT(foff != NOOFFSET, ("biodone: no buffer offset"));
+               KASSERT(obj != NULL, ("biodone: missing VM object"));
 
-               if (error) {
-                       panic("biodone: no object");
-               }
 #if defined(VFS_BIO_DEBUG)
                if (obj->paging_in_progress < bp->b_xio.xio_npages) {
                        printf("biodone: paging in progress(%d) < bp->b_xio.xio_npages(%d)\n",
@@ -3027,7 +3010,7 @@ vfs_unbusy_pages(struct buf *bp)
                struct vnode *vp = bp->b_vp;
                vm_object_t obj;
 
-               VOP_GETVOBJECT(vp, &obj);
+               obj = vp->v_object;
 
                for (i = 0; i < bp->b_xio.xio_npages; i++) {
                        vm_page_t m = bp->b_xio.xio_pages[i];
@@ -3117,7 +3100,7 @@ vfs_busy_pages(struct buf *bp, int clear_modify)
                vm_object_t obj;
                vm_ooffset_t foff;
 
-               VOP_GETVOBJECT(vp, &obj);
+               obj = vp->v_object;
                foff = bp->b_loffset;
                KASSERT(bp->b_loffset != NOOFFSET,
                        ("vfs_busy_pages: no buffer offset"));
index 9bfb585..40ca040 100644 (file)
@@ -37,7 +37,7 @@
  *
  *
  * $FreeBSD: src/sys/kern/vfs_default.c,v 1.28.2.7 2003/01/10 18:23:26 bde Exp $
- * $DragonFly: src/sys/kern/vfs_default.c,v 1.30 2006/03/27 16:18:34 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_default.c,v 1.31 2006/03/29 18:44:50 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -78,10 +78,7 @@ static struct vnodeopv_entry_desc default_vnodeop_entries[] = {
        { &vop_advlock_desc,            vop_einval },
        { &vop_bwrite_desc,             (void *) vop_stdbwrite },
        { &vop_close_desc,              vop_null },
-       { &vop_createvobject_desc,      (void *) vop_stdcreatevobject },
-       { &vop_destroyvobject_desc,     (void *) vop_stddestroyvobject },
        { &vop_fsync_desc,              vop_null },
-       { &vop_getvobject_desc,         (void *) vop_stdgetvobject },
        { &vop_ioctl_desc,              vop_enotty },
        { &vop_islocked_desc,           (void *) vop_stdislocked },
        { &vop_lock_desc,               (void *) vop_stdlock },
@@ -1285,117 +1282,6 @@ vop_stdbwrite(ap)
        return (bwrite(ap->a_bp));
 }
 
-int
-vop_stdcreatevobject(ap)
-       struct vop_createvobject_args /* {
-               struct vnode *a_vp;
-               struct proc *a_td;
-       } */ *ap;
-{
-       struct vnode *vp = ap->a_vp;
-       struct thread *td = ap->a_td;
-       struct vattr vat;
-       vm_object_t object;
-       int error = 0;
-
-       if (!vn_isdisk(vp, NULL) && vn_canvmio(vp) == FALSE)
-               return (0);
-
-retry:
-       if ((object = vp->v_object) == NULL) {
-               if (vp->v_type == VREG || vp->v_type == VDIR) {
-                       if ((error = VOP_GETATTR(vp, &vat, td)) != 0)
-                               goto retn;
-                       object = vnode_pager_alloc(vp, vat.va_size, 0, 0);
-               } else if (vp->v_rdev && dev_is_good(vp->v_rdev)) {
-                       /*
-                        * XXX v_rdev uses NULL/non-NULL instead of NODEV
-                        *
-                        * This simply allocates the biggest object possible
-                        * for a disk vnode.  This should be fixed, but doesn't
-                        * cause any problems (yet).
-                        */
-                       object = vnode_pager_alloc(vp, IDX_TO_OFF(INT_MAX), 0, 0);
-               } else {
-                       goto retn;
-               }
-               /*
-                * Dereference the reference we just created.  This assumes
-                * that the object is associated with the vp.
-                */
-               object->ref_count--;
-               vp->v_usecount--;
-       } else {
-               if (object->flags & OBJ_DEAD) {
-                       VOP_UNLOCK(vp, 0, td);
-                       tsleep(object, 0, "vodead", 0);
-                       vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
-                       goto retry;
-               }
-       }
-
-       KASSERT(vp->v_object != NULL, ("vfs_object_create: NULL object"));
-       vp->v_flag |= VOBJBUF;
-
-retn:
-       return (error);
-}
-
-int
-vop_stddestroyvobject(ap)
-       struct vop_destroyvobject_args /* {
-               struct vnode *vp;
-       } */ *ap;
-{
-       struct vnode *vp = ap->a_vp;
-       vm_object_t obj = vp->v_object;
-
-       if (vp->v_object == NULL)
-               return (0);
-
-       if (obj->ref_count == 0) {
-               /*
-                * vclean() may be called twice. The first time
-                * removes the primary reference to the object,
-                * the second time goes one further and is a
-                * special-case to terminate the object.
-                *
-                * don't double-terminate the object.
-                */
-               if ((obj->flags & OBJ_DEAD) == 0)
-                       vm_object_terminate(obj);
-       } else {
-               /*
-                * Woe to the process that tries to page now :-).
-                */
-               vm_pager_deallocate(obj);
-       }
-       return (0);
-}
-
-/*
- * Return the underlying VM object.  This routine may be called with or
- * without the vnode interlock held.  If called without, the returned
- * object is not guarenteed to be valid.  The syncer typically gets the
- * object without holding the interlock in order to quickly test whether
- * it might be dirty before going heavy-weight.  vm_object's use zalloc
- * and thus stable-storage, so this is safe.
- */
-int
-vop_stdgetvobject(ap)
-       struct vop_getvobject_args /* {
-               struct vnode *vp;
-               struct vm_object **objpp;
-       } */ *ap;
-{
-       struct vnode *vp = ap->a_vp;
-       struct vm_object **objpp = ap->a_objpp;
-
-       if (objpp)
-               *objpp = vp->v_object;
-       return (vp->v_object ? 0 : EINVAL);
-}
-
 /* 
  * vfs default ops
  * used to fill the vfs fucntion table to get reasonable default return values.
index a3a92d0..b063fe9 100644 (file)
@@ -67,7 +67,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/kern/vfs_mount.c,v 1.12 2006/03/02 19:07:59 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_mount.c,v 1.13 2006/03/29 18:44:50 dillon Exp $
  */
 
 /*
@@ -192,7 +192,6 @@ getnewvnode(enum vtagtype tag, struct mount *mp,
         * VNON prevents it from being messed with, however.
         */
        insmntque(vp, mp);
-       vfs_object_create(vp, curthread);
 
        /*
         * A VX locked & refd vnode is returned.
@@ -224,7 +223,6 @@ getspecialvnode(enum vtagtype tag, struct mount *mp,
         * VNON prevents it from being messed with, however.
         */
        insmntque(vp, mp);
-       vfs_object_create(vp, curthread);
 
        /*
         * A VX locked & refd vnode is returned.
index caec5ba..540b3f3 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/kern/vfs_nlookup.c,v 1.11 2005/04/19 17:54:42 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_nlookup.c,v 1.12 2006/03/29 18:44:50 dillon Exp $
  */
 /*
  * nlookup() is the 'new' namei interface.  Rather then return directory and
@@ -584,10 +584,6 @@ nlookup(struct nlookupdata *nd)
            }
        }
 
-       /*
-        * XXX vnode canvmio (test in mmap(), read(), and write())
-        */
-
        /*
         * Termination: no more elements.  If NLC_CREATE was set the
         * ncp may represent a negative hit (ncp->nc_error will be ENOENT),
index ef7460b..b42fdfa 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)vfs_subr.c  8.31 (Berkeley) 5/26/95
  * $FreeBSD: src/sys/kern/vfs_subr.c,v 1.249.2.30 2003/04/04 20:35:57 tegge Exp $
- * $DragonFly: src/sys/kern/vfs_subr.c,v 1.71 2006/03/24 18:35:33 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_subr.c,v 1.72 2006/03/29 18:44:50 dillon Exp $
  */
 
 /*
@@ -339,7 +339,7 @@ vinvalbuf(struct vnode *vp, int flags, struct thread *td,
                        vp->v_track_write.bk_waitflag = 1;
                        tsleep(&vp->v_track_write, 0, "vnvlbv", 0);
                }
-               if (VOP_GETVOBJECT(vp, &object) == 0) {
+               if ((object = vp->v_object) != NULL) {
                        while (object->paging_in_progress)
                                vm_object_pip_sleep(object, "vnvlbx");
                }
@@ -350,7 +350,7 @@ vinvalbuf(struct vnode *vp, int flags, struct thread *td,
        /*
         * Destroy the copy in the VM cache, too.
         */
-       if (VOP_GETVOBJECT(vp, &object) == 0) {
+       if ((object = vp->v_object) != NULL) {
                vm_object_page_remove(object, 0, 0,
                        (flags & V_SAVE) ? TRUE : FALSE);
        }
@@ -1056,6 +1056,7 @@ vclean(struct vnode *vp, int flags, struct thread *td)
 {
        int active;
        int retflags = 0;
+       vm_object_t object;
 
        /*
         * If the vnode has already been reclaimed we have nothing to do.
@@ -1081,10 +1082,20 @@ vclean(struct vnode *vp, int flags, struct thread *td)
 
        /*
         * Clean out any buffers associated with the vnode and destroy its
-        * object, if it has one.
+        * object, if it has one. 
         */
        vinvalbuf(vp, V_SAVE, td, 0, 0);
-       VOP_DESTROYVOBJECT(vp);
+
+       if ((object = vp->v_object) != NULL) {
+               if (object->ref_count == 0) {
+                       if ((object->flags & OBJ_DEAD) == 0)
+                               vm_object_terminate(object);
+               } else {
+                       vm_pager_deallocate(object);
+               }
+               vp->v_flag &= ~VOBJBUF;
+       }
+       KKASSERT((vp->v_flag & VOBJBUF) == 0);
 
        /*
         * If purging an active vnode, it must be closed and
@@ -1305,6 +1316,58 @@ vcount(struct vnode *vp)
        return(count_dev(vp->v_rdev));
 }
 
+/*
+ * Initialize VMIO for a vnode.  This routine MUST be called from a VFS's
+ * VOP_OPEN function for any vnode on which buffer cache access or memory
+ * mapping will be allowed.
+ */
+int
+vinitvmio(struct vnode *vp)
+{
+       thread_t td = curthread;
+       struct vattr vat;
+       vm_object_t object;
+       int error = 0;
+
+retry:
+       if ((object = vp->v_object) == NULL) {
+               if (vp->v_type == VREG || vp->v_type == VDIR) {
+                       if ((error = VOP_GETATTR(vp, &vat, td)) != 0)
+                               goto retn;
+                       object = vnode_pager_alloc(vp, vat.va_size, 0, 0);
+               } else if (vp->v_rdev && dev_is_good(vp->v_rdev)) {
+                       /*
+                        * XXX v_rdev uses NULL/non-NULL instead of NODEV
+                        *
+                        * This simply allocates the biggest object possible
+                        * for a disk vnode.  This should be fixed, but doesn't
+                        * cause any problems (yet).
+                        */
+                       object = vnode_pager_alloc(vp, IDX_TO_OFF(INT_MAX), 0, 0);
+               } else {
+                       goto retn;
+               }
+               /*
+                * Dereference the reference we just created.  This assumes
+                * that the object is associated with the vp.
+                */
+               object->ref_count--;
+               vp->v_usecount--;
+       } else {
+               if (object->flags & OBJ_DEAD) {
+                       VOP_UNLOCK(vp, 0, td);
+                       tsleep(object, 0, "vodead", 0);
+                       vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
+                       goto retry;
+               }
+       }
+       KASSERT(vp->v_object != NULL, ("vinitvmio: NULL object"));
+       vp->v_flag |= VOBJBUF;
+retn:
+       return (error);
+}
+
+
 /*
  * Print out a description of a vnode.
  */
@@ -1826,9 +1889,8 @@ vfs_msync_scan2(struct mount *mp, struct vnode *vp, void *data)
        if (vp->v_flag & VRECLAIMED)
                return(0);
 
-       if ((mp->mnt_flag & MNT_RDONLY) == 0 &&
-           (vp->v_flag & VOBJDIRTY)) {
-               if (VOP_GETVOBJECT(vp, &obj) == 0) {
+       if ((mp->mnt_flag & MNT_RDONLY) == 0 && (vp->v_flag & VOBJDIRTY)) {
+               if ((obj = vp->v_object) != NULL) {
                        vm_object_page_clean(obj, 0, 0, 
                         flags == MNT_WAIT ? OBJPC_SYNC : OBJPC_NOSYNC);
                }
@@ -1836,20 +1898,6 @@ vfs_msync_scan2(struct mount *mp, struct vnode *vp, void *data)
        return(0);
 }
 
-/*
- * Create the VM object needed for VMIO and mmap support.  This
- * is done for all VREG files in the system.  Some filesystems might
- * afford the additional metadata buffering capability of the
- * VMIO code by making the device node be VMIO mode also.
- *
- * vp must be locked when vfs_object_create is called.
- */
-int
-vfs_object_create(struct vnode *vp, struct thread *td)
-{
-       return (VOP_CREATEVOBJECT(vp, td));
-}
-
 /*
  * Record a process's interest in events which might happen to
  * a vnode.  Because poll uses the historic select-style interface
@@ -2041,3 +2089,4 @@ vop_write_dirent(int *error, struct uio *uio, ino_t d_ino, uint8_t d_type,
 
        return(0);
 }
+
index 15f0a17..3090309 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)vfs_syscalls.c      8.13 (Berkeley) 4/15/94
  * $FreeBSD: src/sys/kern/vfs_syscalls.c,v 1.151.2.18 2003/04/04 20:35:58 tegge Exp $
- * $DragonFly: src/sys/kern/vfs_syscalls.c,v 1.78 2006/03/27 16:18:34 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_syscalls.c,v 1.79 2006/03/29 18:44:50 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -1398,9 +1398,14 @@ kern_open(struct nlookupdata *nd, int oflags, int mode, int *res)
                }
                fp->f_flag |= FHASLOCK;
        }
-       /* assert that vn_open created a backing object if one is needed */
-       KASSERT(!vn_canvmio(vp) || VOP_GETVOBJECT(vp, NULL) == 0,
-               ("open: vmio vnode has no backing object after vn_open"));
+
+#if 0
+       /*
+        * Assert that all regular file vnodes were created with a object.
+        */
+       KASSERT(vp->v_type != VREG || vp->v_object != NULL,
+               ("open: regular file has no backing object after vn_open"));
+#endif
 
        vrele(vp);
 
@@ -2602,7 +2607,7 @@ fsync(struct fsync_args *uap)
                return (error);
        vp = (struct vnode *)fp->f_data;
        vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
-       if (VOP_GETVOBJECT(vp, &obj) == 0)
+       if ((obj = vp->v_object) != NULL)
                vm_object_page_clean(obj, 0, 0, 0);
        if ((error = VOP_FSYNC(vp, MNT_WAIT, td)) == 0 &&
            vp->v_mount && (vp->v_mount->mnt_flag & MNT_SOFTDEP) &&
@@ -3211,14 +3216,12 @@ fhopen(struct fhopen_args *uap)
        vref(vp);
 
        /*
-        * Make sure that a VM object is created for VMIO support.  If this
-        * fails just fdrop() normally to clean up.
+        * Assert that all regular files must be created with a VM object.
         */
-       if (vn_canvmio(vp) == TRUE) {
-               if ((error = vfs_object_create(vp, td)) != 0) {
-                       fdrop(fp, td);
-                       goto bad;
-               }
+       if (vp->v_type == VREG && vp->v_object == NULL) {
+               printf("fhopen: regular file did not have VM object: %p\n", vp);
+               fdrop(fp, td);
+               goto bad;
        }
 
        /*
@@ -3264,8 +3267,6 @@ fhopen(struct fhopen_args *uap)
                vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, td);
                fp->f_flag |= FHASLOCK;
        }
-       if ((vp->v_type == VREG) && (VOP_GETVOBJECT(vp, NULL) != 0))
-               vfs_object_create(vp, td);
 
        vput(vp);
        fdrop(fp, td);
index 37f8975..c751417 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)vfs_vnops.c 8.2 (Berkeley) 1/21/94
  * $FreeBSD: src/sys/kern/vfs_vnops.c,v 1.87.2.13 2002/12/29 18:19:53 dillon Exp $
- * $DragonFly: src/sys/kern/vfs_vnops.c,v 1.35 2006/03/27 16:18:34 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_vnops.c,v 1.36 2006/03/29 18:44:50 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -311,21 +311,13 @@ again:
        if (fmode & FWRITE)
                vp->v_writecount++;
 
+#if 0
        /*
-        * Make sure that a VM object is created for VMIO support.  If this
-        * fails we have to be sure to match VOP_CLOSE's with VOP_OPEN's.
-        * Cleanup the fp so we can just vput() the vp in 'bad'.
+        * Assert that VREG files have been setup for vmio.
         */
-       if (vn_canvmio(vp) == TRUE) {
-               if ((error = vfs_object_create(vp, td)) != 0) {
-                       if (fp) {
-                               fp->f_data = NULL;
-                               fp->f_ops = &badfileops;
-                       }
-                       VOP_CLOSE(vp, fmode, td);
-                       goto bad;
-               }
-       }
+       KASSERT(vp->v_type != VREG || vp->v_object != NULL,
+               ("vn_open: regular file was not VMIO enabled!"));
+#endif
 
        /*
         * Return the vnode.  XXX needs some cleaning up.  The vnode is
index e2dbb48..44e2c87 100644 (file)
@@ -32,7 +32,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  * 
- * $DragonFly: src/sys/kern/vfs_vopops.c,v 1.19 2006/03/27 16:18:34 dillon Exp $
+ * $DragonFly: src/sys/kern/vfs_vopops.c,v 1.20 2006/03/29 18:44:50 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -275,9 +275,6 @@ VNODEOP_DESC_INIT_VP_CRED(setacl);
 VNODEOP_DESC_INIT_VP_CRED(aclcheck);
 VNODEOP_DESC_INIT_VP_CRED(getextattr);
 VNODEOP_DESC_INIT_VP_CRED(setextattr);
-VNODEOP_DESC_INIT_VP(createvobject);
-VNODEOP_DESC_INIT_VP(destroyvobject);
-VNODEOP_DESC_INIT_VP(getvobject);
 VNODEOP_DESC_INIT_SIMPLE(mountctl);
 
 VNODEOP_DESC_INIT_NCP_CRED(nresolve);
@@ -1140,50 +1137,6 @@ vop_setextattr(struct vop_ops *ops, struct vnode *vp, char *name,
        return(error);
 }
 
-int
-vop_createvobject(struct vop_ops *ops, struct vnode *vp, struct thread *td)
-{
-       struct vop_createvobject_args ap;
-       int error;
-
-       ap.a_head.a_desc = &vop_createvobject_desc;
-       ap.a_head.a_ops = ops;
-       ap.a_vp = vp;
-       ap.a_td = td;
-
-       DO_OPS(ops, error, &ap, vop_createvobject);
-       return(error);
-}
-
-int
-vop_destroyvobject(struct vop_ops *ops, struct vnode *vp)
-{
-       struct vop_destroyvobject_args ap;
-       int error;
-
-       ap.a_head.a_desc = &vop_destroyvobject_desc;
-       ap.a_head.a_ops = ops;
-       ap.a_vp = vp;
-
-       DO_OPS(ops, error, &ap, vop_destroyvobject);
-       return(error);
-}
-
-int
-vop_getvobject(struct vop_ops *ops, struct vnode *vp, struct vm_object **objpp)
-{
-       struct vop_getvobject_args ap;
-       int error;
-
-       ap.a_head.a_desc = &vop_getvobject_desc;
-       ap.a_head.a_ops = ops;
-       ap.a_vp = vp;
-       ap.a_objpp = objpp;
-
-       DO_OPS(ops, error, &ap, vop_getvobject);
-       return(error);
-}
-
 int
 vop_mountctl(struct vop_ops *ops, int op, struct file *fp, 
            const void *ctl, int ctllen, void *buf, int buflen, int *res)
@@ -1880,33 +1833,6 @@ vop_setextattr_ap(struct vop_setextattr_args *ap)
        return(error);
 }
 
-int
-vop_createvobject_ap(struct vop_createvobject_args *ap)
-{
-       int error;
-
-       DO_OPS(ap->a_head.a_ops, error, ap, vop_createvobject);
-       return(error);
-}
-
-int
-vop_destroyvobject_ap(struct vop_destroyvobject_args *ap)
-{
-       int error;
-
-       DO_OPS(ap->a_head.a_ops, error, ap, vop_destroyvobject);
-       return(error);
-}
-
-int
-vop_getvobject_ap(struct vop_getvobject_args *ap)
-{
-       int error;
-
-       DO_OPS(ap->a_head.a_ops, error, ap, vop_getvobject);
-       return(error);
-}
-
 int
 vop_mountctl_ap(struct vop_mountctl_args *ap)
 {
index 22e7241..ef6e269 100644 (file)
@@ -31,7 +31,7 @@
  * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * $DragonFly: src/sys/sys/vfsops.h,v 1.17 2006/03/27 16:18:35 dillon Exp $
+ * $DragonFly: src/sys/sys/vfsops.h,v 1.18 2006/03/29 18:44:52 dillon Exp $
  */
 
 /*
@@ -446,23 +446,6 @@ struct vop_setextattr_args {
        struct thread *a_td;
 };
 
-struct vop_createvobject_args {
-       struct vop_generic_args a_head;
-       struct vnode *a_vp;
-       struct thread *a_td;
-};
-
-struct vop_destroyvobject_args {
-       struct vop_generic_args a_head;
-       struct vnode *a_vp;
-};
-
-struct vop_getvobject_args {
-       struct vop_generic_args a_head;
-       struct vnode *a_vp;
-       struct vm_object **a_objpp;
-};
-
 struct vop_mountctl_args {
        struct vop_generic_args a_head;
        int a_op;
@@ -627,9 +610,9 @@ struct vop_ops {
        int     (*vop_aclcheck)(struct vop_aclcheck_args *);
        int     (*vop_getextattr)(struct vop_getextattr_args *);
        int     (*vop_setextattr)(struct vop_setextattr_args *);
-       int     (*vop_createvobject)(struct vop_createvobject_args *);
-       int     (*vop_destroyvobject)(struct vop_destroyvobject_args *);
-       int     (*vop_getvobject)(struct vop_getvobject_args *);
+       int     (*vop_unused05)(void *);
+       int     (*vop_unused06)(void *);
+       int     (*vop_unused07)(void *);
        int     (*vop_mountctl)(struct vop_mountctl_args *);
 
        int     (*vop_nresolve)(struct vop_nresolve_args *);
@@ -715,9 +698,6 @@ union vop_args_union {
        struct vop_aclcheck_args vu_aclcheck;
        struct vop_getextattr_args vu_getextattr;
        struct vop_setextattr_args vu_setextattr;
-       struct vop_createvobject_args vu_createvobject;
-       struct vop_destroyvobject_args vu_destroyvobject;
-       struct vop_getvobject_args vu_getvobject;
        struct vop_mountctl_args vu_mountctl;
 
        struct vop_nresolve_args vu_nresolve;
@@ -837,11 +817,6 @@ int vop_getextattr(struct vop_ops *ops, struct vnode *vp, char *name,
                struct uio *uio, struct ucred *cred, struct thread *td);
 int vop_setextattr(struct vop_ops *ops, struct vnode *vp, char *name, 
                struct uio *uio, struct ucred *cred, struct thread *td);
-int vop_createvobject(struct vop_ops *ops,
-               struct vnode *vp, struct thread *td);
-int vop_destroyvobject(struct vop_ops *ops, struct vnode *vp);
-int vop_getvobject(struct vop_ops *ops,
-               struct vnode *vp, struct vm_object **objpp);
 int vop_mountctl(struct vop_ops *ops, int op, struct file *fp, 
                const void *ctl, int ctllen, void *buf, int buflen, int *res);
 int vop_nresolve(struct vop_ops *ops, struct namecache *ncp,
@@ -926,9 +901,6 @@ int vop_setacl_ap(struct vop_setacl_args *ap);
 int vop_aclcheck_ap(struct vop_aclcheck_args *ap);
 int vop_getextattr_ap(struct vop_getextattr_args *ap);
 int vop_setextattr_ap(struct vop_setextattr_args *ap);
-int vop_createvobject_ap(struct vop_createvobject_args *ap);
-int vop_destroyvobject_ap(struct vop_destroyvobject_args *ap);
-int vop_getvobject_ap(struct vop_getvobject_args *ap);
 int vop_mountctl_ap(struct vop_mountctl_args *ap);
 
 int vop_nresolve_ap(struct vop_nresolve_args *ap);
@@ -995,9 +967,6 @@ extern struct vnodeop_desc vop_setacl_desc;
 extern struct vnodeop_desc vop_aclcheck_desc;
 extern struct vnodeop_desc vop_getextattr_desc;
 extern struct vnodeop_desc vop_setextattr_desc;
-extern struct vnodeop_desc vop_createvobject_desc;
-extern struct vnodeop_desc vop_destroyvobject_desc;
-extern struct vnodeop_desc vop_getvobject_desc;
 extern struct vnodeop_desc vop_mountctl_desc;
 
 extern struct vnodeop_desc vop_nresolve_desc;
@@ -1088,12 +1057,6 @@ extern struct vnodeop_desc vop_nrename_desc;
        vop_getextattr(*(vp)->v_ops, vp, name, uio, cred, td)
 #define VOP_SETEXTATTR(vp, name, uio, cred, td)                \
        vop_setextattr(*(vp)->v_ops, vp, name, uio, cred, td)
-#define VOP_CREATEVOBJECT(vp, td)                      \
-       vop_createvobject(*(vp)->v_ops, vp, td)
-#define VOP_DESTROYVOBJECT(vp)                         \
-       vop_destroyvobject(*(vp)->v_ops, vp)
-#define VOP_GETVOBJECT(vp, objpp)                      \
-       vop_getvobject(*(vp)->v_ops, vp, objpp)
 /* no VOP_VFSSET() */
 /* VOP_STRATEGY - does not exist, use vn_strategy() */
 
index 938e3d9..17a96d3 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)vnode.h     8.7 (Berkeley) 2/4/94
  * $FreeBSD: src/sys/sys/vnode.h,v 1.111.2.19 2002/12/29 18:19:53 dillon Exp $
- * $DragonFly: src/sys/sys/vnode.h,v 1.44 2006/03/27 16:18:35 dillon Exp $
+ * $DragonFly: src/sys/sys/vnode.h,v 1.45 2006/03/29 18:44:52 dillon Exp $
  */
 
 #ifndef _SYS_VNODE_H_
@@ -550,20 +550,6 @@ typedef int (*vocall_func_t)(struct vop_generic_args *);
 #define        VDESC(OP) (& __CONCAT(OP,_desc))
 #define        VOFFSET(OP) (VDESC(OP)->vdesc_offset)
 
-/*
- * VMIO support inline
- */
-
-extern int vmiodirenable;
-static __inline int
-vn_canvmio(struct vnode *vp) 
-{
-    if (vp && (vp->v_type == VREG || (vmiodirenable && vp->v_type == VDIR)))
-        return(TRUE); 
-    return(FALSE); 
-}
-
 /*
  * Public vnode manipulation functions.
  */
@@ -615,6 +601,7 @@ int vtruncbuf (struct vnode *vp, struct thread *td,
 int    vfsync(struct vnode *vp, int waitfor, int passes, off_t loffset,
                int (*checkdef)(struct buf *),
                int (*waitoutput)(struct vnode *, struct thread *));
+int    vinitvmio(struct vnode *vp);
 void   vprint (char *label, struct vnode *vp);
 int    vrecycle (struct vnode *vp, struct thread *td);
 void   vn_strategy(struct vnode *vp, struct bio *bio);
@@ -642,7 +629,6 @@ int vn_rdwr_inchunks (enum uio_rw rw, struct vnode *vp, caddr_t base,
            struct ucred *cred, int *aresid, struct thread *td);
 int    vn_stat (struct vnode *vp, struct stat *sb, struct thread *td);
 dev_t  vn_todev (struct vnode *vp);
-int    vfs_object_create (struct vnode *vp, struct thread *td);
 void   vfs_timestamp (struct timespec *);
 int    vn_writechk (struct vnode *vp);
 int    vop_stdbwrite (struct vop_bwrite_args *ap);
@@ -661,9 +647,6 @@ int vop_enotty (struct vop_generic_args *ap);
 int    vop_defaultop (struct vop_generic_args *ap);
 int    vop_null (struct vop_generic_args *ap);
 int    vop_panic (struct vop_generic_args *ap);
-int    vop_stdcreatevobject (struct vop_createvobject_args *ap);
-int    vop_stddestroyvobject (struct vop_destroyvobject_args *ap);
-int    vop_stdgetvobject (struct vop_getvobject_args *ap);
 int    vop_write_dirent(int *, struct uio *, ino_t, uint8_t, uint16_t,
                         const char *);
 
index 555e03e..65a8507 100644 (file)
@@ -28,7 +28,7 @@
  * 
  *     @(#) src/sys/coda/coda_fbsd.cr,v 1.1.1.1 1998/08/29 21:14:52 rvb Exp $
  * $FreeBSD: src/sys/coda/coda_fbsd.c,v 1.18 1999/09/25 18:23:43 phk Exp $
- * $DragonFly: src/sys/vfs/coda/Attic/coda_fbsd.c,v 1.9 2006/01/13 21:09:26 swildner Exp $
+ * $DragonFly: src/sys/vfs/coda/Attic/coda_fbsd.c,v 1.10 2006/03/29 18:44:53 dillon Exp $
  * 
  */
 
@@ -148,11 +148,10 @@ printf("coda_getp: Internally Opening %p\n", vp);
                return (error);
        }
        if (vp->v_type == VREG) {
-           error = vfs_object_create(vp, p, cred);
-           if (error != 0) {
-               printf("coda_getpage: vfs_object_create() returns %d\n", error);
+           if (vp->v_object == NULL) {
+               printf("coda_getpage: vp %p has no VM object\n", vp);
                vput(vp);
-               return(error);
+               return(EINVAL);
            }
        }
 
index 6207407..0e368e1 100644 (file)
@@ -28,7 +28,7 @@
  * 
  *     @(#) src/sys/coda/coda_vnops.c,v 1.1.1.1 1998/08/29 21:14:52 rvb Exp $
  * $FreeBSD: src/sys/coda/coda_vnops.c,v 1.22.2.1 2001/06/29 16:26:22 shafeeq Exp $
- * $DragonFly: src/sys/vfs/coda/Attic/coda_vnops.c,v 1.31 2006/03/27 16:18:36 dillon Exp $
+ * $DragonFly: src/sys/vfs/coda/Attic/coda_vnops.c,v 1.32 2006/03/29 18:44:53 dillon Exp $
  * 
  */
 
@@ -147,9 +147,6 @@ struct vnodeopv_entry_desc coda_vnodeop_entries[] = {
     { &vop_poll_desc, (vnodeopv_entry_t)vop_stdpoll },         /* poll */
     { &vop_getpages_desc, (vnodeopv_entry_t)coda_fbsd_getpages }, /* pager intf.*/
     { &vop_putpages_desc, (vnodeopv_entry_t)coda_fbsd_putpages }, /* pager intf.*/
-    { &vop_createvobject_desc,      (vnodeopv_entry_t)vop_stdcreatevobject },
-    { &vop_destroyvobject_desc,     (vnodeopv_entry_t)vop_stddestroyvobject },
-    { &vop_getvobject_desc,         (vnodeopv_entry_t)vop_stdgetvobject },
 
 #if    0
 
@@ -298,9 +295,9 @@ coda_open(void *v)
     }
 /* grab (above) does this when it calls newvnode unless it's in the cache*/
     if (vp->v_type == VREG) {
-       error = vfs_object_create(vp, td);
-       if (error != 0) {
-           printf("coda_open: vfs_object_create() returns %d\n", error);
+       if (vp->v_object == NULL) {
+           error = EINVAL;
+           printf("coda_open: cache file vp %p has no VM object!\n", vp);
            vput(vp);
        }
     }
@@ -449,9 +446,9 @@ printf("coda_rdwr: Internally Opening %p\n", vp);
                return (error);
            }
            if (vp->v_type == VREG) {
-               error = vfs_object_create(vp, td);
-               if (error != 0) {
-                   printf("coda_rdwr: vfs_object_create() returns %d\n", error);
+               if (vp->v_object == NULL) {
+                   error = EINVAL;
+                   printf("coda_rdwr: vnode %p has no VM object!\n", vp);
                    vput(vp);
                }
            }
@@ -1578,9 +1575,9 @@ printf("coda_readdir: Internally Opening %p\n", vp);
                return (error);
            }
            if (vp->v_type == VREG) {
-               error = vfs_object_create(vp, td);
-               if (error != 0) {
-                   printf("coda_readdir: vfs_object_create() returns %d\n", error);
+               if (vp->v_object == NULL) {
+                   error = EINVAL;
+                   printf("coda_readdir: vnode %p has no VM object!\n", vp);
                    vput(vp);
                }
            }
index 348ff79..d19917c 100644 (file)
@@ -39,7 +39,7 @@
  *
  *     @(#)cd9660_lookup.c     8.2 (Berkeley) 1/23/94
  * $FreeBSD: src/sys/isofs/cd9660/cd9660_lookup.c,v 1.23.2.2 2001/11/04 06:19:47 dillon Exp $
- * $DragonFly: src/sys/vfs/isofs/cd9660/cd9660_lookup.c,v 1.18 2006/03/24 18:35:33 dillon Exp $
+ * $DragonFly: src/sys/vfs/isofs/cd9660/cd9660_lookup.c,v 1.19 2006/03/29 18:44:55 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -131,6 +131,11 @@ cd9660_lookup(struct vop_old_lookup_args *ap)
        wantparent = flags & (CNP_LOCKPARENT | CNP_WANTPARENT);
        cnp->cn_flags &= ~CNP_PDIRUNLOCK;
 
+       /*
+        * We use the buffer cache on the directory vnode
+        */
+       vinitvmio(vdp);
+
        /*
         * We now have a segment name to search for, and a directory to search.
         */
index 8cbb519..fc37b45 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)cd9660_vnops.c      8.19 (Berkeley) 5/27/95
  * $FreeBSD: src/sys/isofs/cd9660/cd9660_vnops.c,v 1.62 1999/12/15 23:01:51 eivind Exp $
- * $DragonFly: src/sys/vfs/isofs/cd9660/cd9660_vnops.c,v 1.20 2006/03/24 18:35:33 dillon Exp $
+ * $DragonFly: src/sys/vfs/isofs/cd9660/cd9660_vnops.c,v 1.21 2006/03/29 18:44:55 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -69,6 +69,7 @@ static int cd9660_advlock (struct vop_advlock_args *);
 static int cd9660_getattr (struct vop_getattr_args *);
 static int cd9660_ioctl (struct vop_ioctl_args *);
 static int cd9660_pathconf (struct vop_pathconf_args *);
+static int cd9660_open (struct vop_open_args *);
 static int cd9660_read (struct vop_read_args *);
 static int cd9660_setattr (struct vop_setattr_args *);
 struct isoreaddir;
@@ -270,6 +271,22 @@ cd9660_ioctl(struct vop_ioctl_args *ap)
         }
 }
 
+/*
+ * open is called when the kernel intends to read or memory map a vnode.
+ */
+static int
+cd9660_open(struct vop_open_args *ap)
+{
+       struct vnode *vp = ap->a_vp;
+
+       /*
+        * Both regular file and directory operations use the buffer cache.
+        */
+       if (vp->v_type == VREG || vp->v_type == VDIR)
+               vinitvmio(vp);
+       return(0);
+}
+
 /*
  * Vnode op for reading.
  *
@@ -855,6 +872,7 @@ cd9660_advlock(struct vop_advlock_args *ap)
  */
 struct vnodeopv_entry_desc cd9660_vnodeop_entries[] = {
        { &vop_default_desc,            (vnodeopv_entry_t) vop_defaultop },
+       { &vop_open_desc,               (vnodeopv_entry_t) cd9660_open},
        { &vop_access_desc,             (vnodeopv_entry_t) cd9660_access },
        { &vop_advlock_desc,            (vnodeopv_entry_t) cd9660_advlock },
        { &vop_bmap_desc,               (vnodeopv_entry_t) cd9660_bmap },
index bb8c6d2..a89e291 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)mfs_vnops.c 8.11 (Berkeley) 5/22/95
  * $FreeBSD: src/sys/ufs/mfs/mfs_vnops.c,v 1.47.2.1 2001/05/22 02:06:43 bp Exp $
- * $DragonFly: src/sys/vfs/mfs/mfs_vnops.c,v 1.21 2006/03/24 18:35:34 dillon Exp $
+ * $DragonFly: src/sys/vfs/mfs/mfs_vnops.c,v 1.22 2006/03/29 18:44:57 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -74,12 +74,9 @@ static struct vnodeopv_entry_desc mfs_vnodeop_entries[] = {
        { &vop_bmap_desc,               (vnodeopv_entry_t) mfs_bmap },
        { &vop_bwrite_desc,             vop_defaultop },
        { &vop_close_desc,              (vnodeopv_entry_t) mfs_close },
-       { &vop_createvobject_desc,      (vnodeopv_entry_t) vop_stdcreatevobject },
-       { &vop_destroyvobject_desc,     (vnodeopv_entry_t) vop_stddestroyvobject },
        { &vop_freeblks_desc,           (vnodeopv_entry_t) mfs_freeblks },
        { &vop_fsync_desc,              (vnodeopv_entry_t) mfs_fsync },
        { &vop_getpages_desc,           (vnodeopv_entry_t) mfs_getpages },
-       { &vop_getvobject_desc,         (vnodeopv_entry_t) vop_stdgetvobject },
        { &vop_inactive_desc,           (vnodeopv_entry_t) mfs_inactive },
        { &vop_ioctl_desc,              vop_enotty },
        { &vop_islocked_desc,           vop_defaultop },
index f3f931c..f275b97 100644 (file)
@@ -1,5 +1,5 @@
 /* $FreeBSD: src/sys/msdosfs/msdosfs_vnops.c,v 1.95.2.4 2003/06/13 15:05:47 trhodes Exp $ */
-/* $DragonFly: src/sys/vfs/msdosfs/msdosfs_vnops.c,v 1.31 2006/03/24 22:39:22 dillon Exp $ */
+/* $DragonFly: src/sys/vfs/msdosfs/msdosfs_vnops.c,v 1.32 2006/03/29 18:44:59 dillon Exp $ */
 /*     $NetBSD: msdosfs_vnops.c,v 1.68 1998/02/10 14:10:04 mrg Exp $   */
 
 /*-
@@ -84,6 +84,7 @@
  */
 static int msdosfs_create (struct vop_old_create_args *);
 static int msdosfs_mknod (struct vop_old_mknod_args *);
+static int msdosfs_open (struct vop_open_args *);
 static int msdosfs_close (struct vop_close_args *);
 static int msdosfs_access (struct vop_access_args *);
 static int msdosfs_getattr (struct vop_getattr_args *);
@@ -209,6 +210,19 @@ msdosfs_mknod(struct vop_old_mknod_args *ap)
        /* NOTREACHED */
 }
 
+/*
+ * msdosfs_open(struct vnode *a_vp)
+ */
+static int
+msdosfs_open(struct vop_open_args *ap)
+{
+       struct vnode *vp = ap->a_vp;
+
+       if (vp->v_type == VREG || vp->v_type == VDIR)
+               vinitvmio(vp);
+       return(0);
+}
+
 /*
  * msdosfs_close(struct vnode *a_vp, int a_fflag, struct ucred *a_cred,
  *              struct thread *a_td)
@@ -1966,6 +1980,7 @@ struct vnodeopv_entry_desc msdosfs_vnodeop_entries[] = {
        { &vop_access_desc,             (vnodeopv_entry_t) msdosfs_access },
        { &vop_bmap_desc,               (vnodeopv_entry_t) msdosfs_bmap },
        { &vop_old_lookup_desc,         (vnodeopv_entry_t) msdosfs_lookup },
+       { &vop_open_desc,               (vnodeopv_entry_t) msdosfs_open },
        { &vop_close_desc,              (vnodeopv_entry_t) msdosfs_close },
        { &vop_old_create_desc,         (vnodeopv_entry_t) msdosfs_create },
        { &vop_fsync_desc,              (vnodeopv_entry_t) msdosfs_fsync },
index 191b817..7337208 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)nfs_serv.c  8.8 (Berkeley) 7/31/95
  * $FreeBSD: src/sys/nfs/nfs_serv.c,v 1.93.2.6 2002/12/29 18:19:53 dillon Exp $
- * $DragonFly: src/sys/vfs/nfs/nfs_serv.c,v 1.30 2006/03/27 16:18:39 dillon Exp $
+ * $DragonFly: src/sys/vfs/nfs/nfs_serv.c,v 1.31 2006/03/29 18:45:00 dillon Exp $
  */
 
 /*
@@ -1665,7 +1665,8 @@ nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
                        dvp = NULL;
                        error = VOP_NCREATE(nd.nl_ncp, &vp, nd.nl_cred, vap);
                        if (error == 0) {
-                               nfsrv_object_create(vp);
+                               if (vap->va_type == VREG)
+                                       vinitvmio(vp);
                                if (exclusive_flag) {
                                        exclusive_flag = 0;
                                        VATTR_NULL(vap);
index 7d11cdb..7544fe3 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)nfs_subs.c  8.8 (Berkeley) 5/22/95
  * $FreeBSD: /repoman/r/ncvs/src/sys/nfsclient/nfs_subs.c,v 1.128 2004/04/14 23:23:55 peadar Exp $
- * $DragonFly: src/sys/vfs/nfs/nfs_subs.c,v 1.35 2006/03/27 16:18:39 dillon Exp $
+ * $DragonFly: src/sys/vfs/nfs/nfs_subs.c,v 1.36 2006/03/29 18:45:00 dillon Exp $
  */
 
 /*
@@ -1864,7 +1864,8 @@ nfsrv_fhtovp(fhandle_t *fhp, int lockflag, struct vnode **vpp,
        else
                *rdonlyp = 0;
 
-       nfsrv_object_create(*vpp);
+       if ((*vpp)->v_type == VREG && (*vpp)->v_object)
+               vinitvmio(*vpp);
 
        if (!lockflag)
                VOP_UNLOCK(*vpp, 0, td);
@@ -2060,16 +2061,6 @@ nfsrv_errmap(struct nfsrv_descript *nd, int err)
        return (NFSERR_IO);
 }
 
-int
-nfsrv_object_create(struct vnode *vp)
-{
-       struct thread *td = curthread;
-
-       if (vp == NULL || vp->v_type != VREG)
-               return (1);
-       return (vfs_object_create(vp, td));
-}
-
 /*
  * Sort the group list in increasing numerical order.
  * (Insertion sort by Chris Torek, who was grossed out by the bubble sort
index cc1cdf3..a18c0ca 100644 (file)
@@ -35,7 +35,7 @@
  *
  *     @(#)nfs_vnops.c 8.16 (Berkeley) 5/27/95
  * $FreeBSD: src/sys/nfs/nfs_vnops.c,v 1.150.2.5 2001/12/20 19:56:28 dillon Exp $
- * $DragonFly: src/sys/vfs/nfs/nfs_vnops.c,v 1.51 2006/03/27 16:18:39 dillon Exp $
+ * $DragonFly: src/sys/vfs/nfs/nfs_vnops.c,v 1.52 2006/03/29 18:45:00 dillon Exp $
  */
 
 
@@ -485,6 +485,14 @@ nfs_open(struct vop_open_args *ap)
                return (EOPNOTSUPP);
        }
 
+       /*
+        * Regular files are mmapable and we use the buffer cache.  We also
+        * use the buffer cache for directories internally, so those
+        * vnodes need a VM object.
+        */
+       if (vp->v_type == VREG || vp->v_type == VDIR)
+               vinitvmio(vp);
+
        /*
         * Clear the attribute cache only if opening with write access.  It
         * is unclear if we should do this at all here, but we certainly
index c902b3f..a1cd8fd 100644 (file)
@@ -36,7 +36,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/ntfs/ntfs_vnops.c,v 1.9.2.4 2002/08/06 19:35:18 semenu Exp $
- * $DragonFly: src/sys/vfs/ntfs/ntfs_vnops.c,v 1.26 2006/03/24 18:35:34 dillon Exp $
+ * $DragonFly: src/sys/vfs/ntfs/ntfs_vnops.c,v 1.27 2006/03/29 18:45:01 dillon Exp $
  *
  */
 
@@ -519,13 +519,20 @@ ntfs_access(struct vop_access_args *ap)
 static int
 ntfs_open(struct vop_open_args *ap)
 {
-#if NTFS_DEBUG
        struct vnode *vp = ap->a_vp;
+#if NTFS_DEBUG
        struct ntnode *ip = VTONT(vp);
 
        printf("ntfs_open: %d\n",ip->i_number);
 #endif
 
+       /*
+        * We use the buffer cache, so files at least have to have a
+        * VM object.
+        */
+       if (vp->v_type == VREG || vp->v_type == VDIR)
+               vinitvmio(vp);
+
        /*
         * Files marked append-only must be opened for appending.
         */
index 136b2dd..f19ba42 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)spec_vnops.c        8.14 (Berkeley) 5/21/95
  * $FreeBSD: src/sys/miscfs/specfs/spec_vnops.c,v 1.131.2.4 2001/02/26 04:23:20 jlemon Exp $
- * $DragonFly: src/sys/vfs/specfs/spec_vnops.c,v 1.32 2006/03/27 16:18:59 dillon Exp $
+ * $DragonFly: src/sys/vfs/specfs/spec_vnops.c,v 1.33 2006/03/29 18:45:03 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -257,9 +257,14 @@ spec_open(struct vop_open_args *ap)
                }
        }
 
+       /*
+        * If this is 'disk' or disk-like device, associate a VM object
+        * with it.
+        */
        if (vn_isdisk(vp, NULL)) {
                if (!dev->si_bsize_phys)
                        dev->si_bsize_phys = DEV_BSIZE;
+               vinitvmio(vp);
        }
        if ((dev_dflags(dev) & D_DISK) == 0) {
                cp = devtoname(dev);
index b7cd2c7..1a7ea53 100644 (file)
@@ -24,7 +24,7 @@
  * SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/ufs/ffs/ffs_rawread.c,v 1.3.2.2 2003/05/29 06:15:35 alc Exp $
- * $DragonFly: src/sys/vfs/ufs/ffs_rawread.c,v 1.17 2006/03/25 21:31:21 swildner Exp $
+ * $DragonFly: src/sys/vfs/ufs/ffs_rawread.c,v 1.18 2006/03/29 18:45:04 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -111,7 +111,7 @@ ffs_rawread_sync(struct vnode *vp, struct thread *td)
                /* Attempt to msync mmap() regions to clean dirty mmap */ 
                if ((vp->v_flag & VOBJDIRTY) != 0) {
                        struct vm_object *obj;
-                       if (VOP_GETVOBJECT(vp, &obj) == 0)
+                       if ((obj = vp->v_object) != NULL)
                                vm_object_page_clean(obj, 0, 0, OBJPC_SYNC);
                }
 
index 2aae247..83e5d1e 100644 (file)
@@ -32,7 +32,7 @@
  *
  *     @(#)ffs_vfsops.c        8.31 (Berkeley) 5/20/95
  * $FreeBSD: src/sys/ufs/ffs/ffs_vfsops.c,v 1.117.2.10 2002/06/23 22:34:52 iedowse Exp $
- * $DragonFly: src/sys/vfs/ufs/ffs_vfsops.c,v 1.36 2006/03/24 18:35:34 dillon Exp $
+ * $DragonFly: src/sys/vfs/ufs/ffs_vfsops.c,v 1.37 2006/03/29 18:45:04 dillon Exp $
  */
 
 #include "opt_quota.h"
@@ -447,15 +447,13 @@ ffs_reload(struct mount *mp, struct ucred *cred, struct thread *td)
                panic("ffs_reload: dirty1");
 
        dev = devvp->v_rdev;
+
        /*
-        * Only VMIO the backing device if the backing device is a real
-        * block device.  See ffs_mountmfs() for more details.
+        * The backing device must be VMIO-capable because we use getblk().
+        * NOTE: the MFS driver now returns a VMIO-enabled descriptor.
         */
-       if (devvp->v_tag != VT_MFS && vn_isdisk(devvp, NULL)) {
-               vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
-               vfs_object_create(devvp, td);
-               VOP_UNLOCK(devvp, 0, td);
-       }
+       if (devvp->v_object == NULL)
+               panic("ffs_reload: devvp has no VM object!");
 
        /*
         * Step 2: re-read superblock from disk.
@@ -616,18 +614,13 @@ ffs_mountfs(struct vnode *devvp, struct mount *mp, struct thread *td,
                mp->mnt_iosize_max = MAXPHYS;
 
        /*
-        * Only VMIO the backing device if the backing device is a real
-        * block device.  This excludes the original MFS implementation.
-        * Note that it is optional that the backing device be VMIOed.  This
-        * increases the opportunity for metadata caching.
-        *
-        * This call must be made after the VOP_OPEN.
+        * The backing device must be VMIO-capable because we use getblk().
+        * NOTE: the MFS driver now returns a VMIO-enabled descriptor.
+        * The VOP_OPEN() call above should have associated a VM object
+        * with devvp.
         */
-       if (devvp->v_tag != VT_MFS && vn_isdisk(devvp, NULL)) {
-               vn_lock(devvp, LK_EXCLUSIVE | LK_RETRY, td);
-               vfs_object_create(devvp, td);
-               VOP_UNLOCK(devvp, 0, td);
-       }
+       if (devvp->v_object == NULL)
+               panic("ffs_reload: devvp has no VM object!");
 
        if (VOP_IOCTL(devvp, DIOCGPART, (caddr_t)&dpart, FREAD, proc0.p_ucred, td) != 0)
                size = DEV_BSIZE;
index 391392c..200bc2d 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)ufs_lookup.c        8.15 (Berkeley) 6/16/95
  * $FreeBSD: src/sys/ufs/ufs/ufs_lookup.c,v 1.33.2.7 2001/09/22 19:22:13 iedowse Exp $
- * $DragonFly: src/sys/vfs/ufs/ufs_lookup.c,v 1.18 2005/09/14 01:13:48 dillon Exp $
+ * $DragonFly: src/sys/vfs/ufs/ufs_lookup.c,v 1.19 2006/03/29 18:45:04 dillon Exp $
  */
 
 #include "opt_ufs.h"
@@ -154,6 +154,12 @@ ufs_lookup(struct vop_old_lookup_args *ap)
        lockparent = flags & CNP_LOCKPARENT;
        wantparent = flags & (CNP_LOCKPARENT|CNP_WANTPARENT);
 
+       /*
+        * We need to be able to perform buffer cache operations on
+        * the directory.
+        */
+       vinitvmio(vdp);
+
        /*
         * We now have a segment name to search for, and a directory to search.
         *
index 15fac14..4aadfad 100644 (file)
@@ -37,7 +37,7 @@
  *
  *     @(#)ufs_vnops.c 8.27 (Berkeley) 5/27/95
  * $FreeBSD: src/sys/ufs/ufs/ufs_vnops.c,v 1.131.2.8 2003/01/02 17:26:19 bde Exp $
- * $DragonFly: src/sys/vfs/ufs/ufs_vnops.c,v 1.35 2006/03/27 01:54:17 dillon Exp $
+ * $DragonFly: src/sys/vfs/ufs/ufs_vnops.c,v 1.36 2006/03/29 18:45:04 dillon Exp $
  */
 
 #include "opt_quota.h"
@@ -263,12 +263,22 @@ static
 int
 ufs_open(struct vop_open_args *ap)
 {
+       struct vnode *vp = ap->a_vp;
+
        /*
         * Files marked append-only must be opened for appending.
         */
-       if ((VTOI(ap->a_vp)->i_flags & APPEND) &&
-           (ap->a_mode & (FWRITE | O_APPEND)) == FWRITE)
+       if ((VTOI(vp)->i_flags & APPEND) &&
+           (ap->a_mode & (FWRITE | O_APPEND)) == FWRITE) {
                return (EPERM);
+       }
+
+       /*
+        * The buffer cache is used for VREG and VDIR files
+        */
+       if (vp->v_type == VREG || vp->v_type == VDIR)
+               vinitvmio(vp);
+
        return (0);
 }
 
index 13e52b2..b9e12b1 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     @(#)union_subr.c        8.20 (Berkeley) 5/20/95
  * $FreeBSD: src/sys/miscfs/union/union_subr.c,v 1.43.2.2 2001/12/25 01:44:45 dillon Exp $
- * $DragonFly: src/sys/vfs/union/union_subr.c,v 1.20 2006/03/27 16:19:00 dillon Exp $
+ * $DragonFly: src/sys/vfs/union/union_subr.c,v 1.21 2006/03/29 18:45:06 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -746,8 +746,6 @@ union_copyup(struct union_node *un, int docopy, struct ucred *cred,
                 */
                vn_lock(lvp, LK_EXCLUSIVE | LK_RETRY, td);
                error = VOP_OPEN(lvp, FREAD, cred, NULL, td);
-               if (error == 0 && vn_canvmio(lvp) == TRUE)
-                       error = vfs_object_create(lvp, td);
                if (error == 0) {
                        error = union_copyfile(lvp, uvp, cred, td);
                        VOP_UNLOCK(lvp, 0, td);
@@ -777,10 +775,6 @@ union_copyup(struct union_node *un, int docopy, struct ucred *cred,
                        VOP_CLOSE(lvp, FREAD, td);
                        VOP_OPEN(uvp, FREAD, cred, NULL, td);
                }
-               if (un->un_openl) {
-                       if (vn_canvmio(uvp) == TRUE)
-                               error = vfs_object_create(uvp, td);
-               }
                un->un_openl = 0;
        }
 
@@ -1039,8 +1033,6 @@ union_vn_create(struct vnode **vpp, struct union_node *un, struct thread *td)
                return (error);
 
        error = VOP_OPEN(vp, fmode, cred, NULL, td);
-       if (error == 0 && vn_canvmio(vp) == TRUE)
-               error = vfs_object_create(vp, td);
        if (error) {
                vput(vp);
                return (error);
@@ -1253,8 +1245,6 @@ union_dircheck(struct thread *td, struct vnode **vp, struct file *fp)
 
                if (lvp != NULLVP) {
                        error = VOP_OPEN(lvp, FREAD, fp->f_cred, NULL, td);
-                       if (error == 0 && vn_canvmio(lvp) == TRUE)
-                               error = vfs_object_create(lvp, td);
                        if (error) {
                                vput(lvp);
                                return (error);
index ed2ceff..6344a53 100644 (file)
@@ -36,7 +36,7 @@
  *
  *     @(#)union_vnops.c       8.32 (Berkeley) 6/23/95
  * $FreeBSD: src/sys/miscfs/union/union_vnops.c,v 1.72 1999/12/15 23:02:14 eivind Exp $
- * $DragonFly: src/sys/vfs/union/union_vnops.c,v 1.24 2006/03/27 16:19:00 dillon Exp $
+ * $DragonFly: src/sys/vfs/union/union_vnops.c,v 1.25 2006/03/29 18:45:06 dillon Exp $
  */
 
 #include <sys/param.h>
@@ -742,19 +742,14 @@ union_open(struct vop_open_args *ap)
        }
 
        /*
-        * We are holding the correct vnode, open it
+        * We are holding the correct vnode, open it.  Note
+        * that in DragonFly, VOP_OPEN is responsible for associating
+        * a VM object with the vnode if the vnode is mappable or the
+        * underlying filesystem uses buffer cache calls on it.
         */
-
        if (error == 0)
                error = VOP_OPEN(tvp, mode, cred, NULL, td);
 
-       /*
-        * Absolutely necessary or UFS will blowup
-        */
-        if (error == 0 && vn_canvmio(tvp) == TRUE) {
-                error = vfs_object_create(tvp, td);
-        }
-
        /*
         * Release any locks held
         */
index 09d69ef..d0843e3 100644 (file)
@@ -39,7 +39,7 @@
  *
  *     @(#)vm_mmap.c   8.4 (Berkeley) 1/12/94
  * $FreeBSD: src/sys/vm/vm_mmap.c,v 1.108.2.6 2002/07/02 20:06:19 dillon Exp $
- * $DragonFly: src/sys/vm/vm_mmap.c,v 1.24 2006/03/27 01:54:18 dillon Exp $
+ * $DragonFly: src/sys/vm/vm_mmap.c,v 1.25 2006/03/29 18:45:07 dillon Exp $
  */
 
 /*
@@ -264,9 +264,9 @@ kern_mmap(caddr_t uaddr, size_t ulen, int uprot, int uflags, int fd,
                        /*
                         * Get the proper underlying object
                         */
-                       if (VOP_GETVOBJECT(vp, &obj) != 0)
+                       if ((obj = vp->v_object) == NULL)
                                return (EINVAL);
-                       vp = (struct vnode*)obj->handle;
+                       KKASSERT(vp == (struct vnode *)obj->handle);
                }
 
                /*