diff options
author | dyson <dyson@FreeBSD.org> | 1995-12-11 04:58:34 +0000 |
---|---|---|
committer | dyson <dyson@FreeBSD.org> | 1995-12-11 04:58:34 +0000 |
commit | 601ed1a4c089930a40f8f1dedb927f3b5b9f2d90 (patch) | |
tree | 2b7bb6b5f65218fdc977df2e1db5ccaf89d154c6 /sys/kern/vfs_vnops.c | |
parent | 0e4700269e1c805f7d7e0caae28fbaebf096ac31 (diff) | |
download | FreeBSD-src-601ed1a4c089930a40f8f1dedb927f3b5b9f2d90.zip FreeBSD-src-601ed1a4c089930a40f8f1dedb927f3b5b9f2d90.tar.gz |
Changes to support 1Tb filesizes. Pages are now named by an
(object,index) pair instead of (object,offset) pair.
Diffstat (limited to 'sys/kern/vfs_vnops.c')
-rw-r--r-- | sys/kern/vfs_vnops.c | 88 |
1 files changed, 56 insertions, 32 deletions
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c index de25632..9e00801 100644 --- a/sys/kern/vfs_vnops.c +++ b/sys/kern/vfs_vnops.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)vfs_vnops.c 8.2 (Berkeley) 1/21/94 - * $Id: vfs_vnops.c,v 1.19 1995/10/22 09:32:29 davidg Exp $ + * $Id: vfs_vnops.c,v 1.20 1995/12/07 12:47:07 davidg Exp $ */ #include <sys/param.h> @@ -156,26 +156,8 @@ vn_open(ndp, fmode, cmode) * this is here for VMIO support */ if (vp->v_type == VREG) { -retry: - if ((vp->v_flag & VVMIO) == 0) { - error = VOP_GETATTR(vp, vap, cred, p); - if (error) - goto bad; - (void) vnode_pager_alloc(vp, vap->va_size, 0, 0); - vp->v_flag |= VVMIO; - } else { - vm_object_t object; - if ((object = vp->v_object) && - (object->flags & OBJ_DEAD)) { - VOP_UNLOCK(vp); - tsleep(object, PVM, "vodead", 0); - VOP_LOCK(vp); - goto retry; - } - if (!object) - panic("vn_open: VMIO object missing"); - vm_object_reference(object); - } + if ((error = vn_vmio_open(vp, p, cred)) != 0) + goto bad; } if (fmode & FWRITE) vp->v_writecount++; @@ -220,17 +202,7 @@ vn_close(vp, flags, cred, p) if (flags & FWRITE) vp->v_writecount--; error = VOP_CLOSE(vp, flags, cred, p); - /* - * this code is here for VMIO support, will eventually - * be in vfs code. - */ - if (vp->v_flag & VVMIO) { - vrele(vp); - if (vp->v_object == NULL) - panic("vn_close: VMIO object missing"); - vm_object_deallocate(vp->v_object); - } else - vrele(vp); + vn_vmio_close(vp); return (error); } @@ -481,3 +453,55 @@ vn_closefile(fp, p) return (vn_close(((struct vnode *)fp->f_data), fp->f_flag, fp->f_cred, p)); } + +int +vn_vmio_open(vp, p, cred) + struct vnode *vp; + struct proc *p; + struct ucred *cred; +{ + struct vattr vat; + int error; + /* + * this is here for VMIO support + */ + if (vp->v_type == VREG || vp->v_type == VBLK) { +retry: + if ((vp->v_flag & VVMIO) == 0) { + if ((error = VOP_GETATTR(vp, &vat, cred, p)) != 0) + return error; + (void) vnode_pager_alloc(vp, vat.va_size, 0, 0); + vp->v_flag |= VVMIO; + } else { + vm_object_t object; + if ((object = vp->v_object) && + (object->flags & OBJ_DEAD)) { + VOP_UNLOCK(vp); + tsleep(object, PVM, "vodead", 0); + VOP_LOCK(vp); + goto retry; + } + if (!object) + panic("vn_open: VMIO object missing"); + vm_object_reference(object); + } + } + return 0; +} + +void +vn_vmio_close(vp) + struct vnode *vp; +{ + /* + * this code is here for VMIO support, will eventually + * be in vfs code. + */ + if (vp->v_flag & VVMIO) { + vrele(vp); + if (vp->v_object == NULL) + panic("vn_close: VMIO object missing"); + vm_object_deallocate(vp->v_object); + } else + vrele(vp); +} |