summaryrefslogtreecommitdiffstats
path: root/sys/kern/vfs_vnops.c
diff options
context:
space:
mode:
authordyson <dyson@FreeBSD.org>1995-12-11 04:58:34 +0000
committerdyson <dyson@FreeBSD.org>1995-12-11 04:58:34 +0000
commit601ed1a4c089930a40f8f1dedb927f3b5b9f2d90 (patch)
tree2b7bb6b5f65218fdc977df2e1db5ccaf89d154c6 /sys/kern/vfs_vnops.c
parent0e4700269e1c805f7d7e0caae28fbaebf096ac31 (diff)
downloadFreeBSD-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.c88
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);
+}
OpenPOWER on IntegriCloud