summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/vfs_bio.c23
-rw-r--r--sys/kern/vfs_export.c7
-rw-r--r--sys/kern/vfs_extattr.c4
-rw-r--r--sys/kern/vfs_subr.c7
-rw-r--r--sys/kern/vfs_syscalls.c4
-rw-r--r--sys/kern/vfs_vnops.c35
6 files changed, 59 insertions, 21 deletions
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c
index 197c906..cb02373 100644
--- a/sys/kern/vfs_bio.c
+++ b/sys/kern/vfs_bio.c
@@ -16,7 +16,7 @@
* 4. Modifications may be freely made to this file if the above conditions
* are met.
*
- * $Id: vfs_bio.c,v 1.12 1994/09/25 19:33:51 phk Exp $
+ * $Id: vfs_bio.c,v 1.13 1994/10/04 03:10:47 davidg Exp $
*/
#include <sys/param.h>
@@ -60,6 +60,7 @@ bufinit()
{
struct buf *bp;
int i;
+ caddr_t baddr;
TAILQ_INIT(&bswlist);
LIST_INIT(&invalhash);
@@ -72,6 +73,7 @@ bufinit()
for(i=0;i<BUFFER_QUEUES;i++)
TAILQ_INIT(&bufqueues[i]);
+ baddr = (caddr_t)kmem_alloc_pageable(buffer_map, MAXBSIZE * nbuf);
/* finally, initialize each buffer header and stick on empty q */
for(i=0;i<nbuf;i++) {
bp = &buf[i];
@@ -83,7 +85,7 @@ bufinit()
bp->b_wcred = NOCRED;
bp->b_qindex = QUEUE_EMPTY;
bp->b_vnbufs.le_next = NOLIST;
- bp->b_data = (caddr_t)kmem_alloc_pageable(buffer_map, MAXBSIZE);
+ bp->b_data = baddr + i * MAXBSIZE;
TAILQ_INSERT_TAIL(&bufqueues[QUEUE_EMPTY], bp, b_freelist);
LIST_INSERT_HEAD(&invalhash, bp, b_hash);
}
@@ -446,11 +448,13 @@ incore(struct vnode *vp, daddr_t blkno)
/* Search hash chain */
while (bp) {
+#ifdef DEBUG
if( (bp < buf) || (bp >= buf + nbuf)) {
printf("incore: buf out of range: %p, hash: %d\n",
bp, bh - bufhashtbl);
panic("incore: buf fault");
}
+#endif
/* hit */
if (bp->b_lblkno == blkno && bp->b_vp == vp
&& (bp->b_flags & B_INVAL) == 0) {
@@ -494,25 +498,14 @@ loop:
goto loop;
}
} else {
-
if ((bp = getnewbuf(0, 0)) == 0)
goto loop;
- allocbuf(bp, size);
- /*
- * have to check again, because of a possible
- * race condition.
- */
- if (incore( vp, blkno)) {
- allocbuf(bp, 0);
- bp->b_flags |= B_INVAL;
- brelse(bp);
- goto loop;
- }
bp->b_blkno = bp->b_lblkno = blkno;
bgetvp(vp, bp);
LIST_REMOVE(bp, b_hash);
bh = BUFHASH(vp, blkno);
LIST_INSERT_HEAD(bh, bp, b_hash);
+ allocbuf(bp, size);
}
splx(s);
return (bp);
@@ -664,11 +657,13 @@ vfs_update() {
}
}
+#if 0
#define MAXFREEBP 128
#define LDFREE_BUSY 1
#define LDFREE_WANT 2
int loadfreeing;
struct buf *freebp[MAXFREEBP];
+#endif
/*
* these routines are not in the correct place (yet)
* also they work *ONLY* for kernel_pmap!!!
diff --git a/sys/kern/vfs_export.c b/sys/kern/vfs_export.c
index eda779b..d79aae1 100644
--- a/sys/kern/vfs_export.c
+++ b/sys/kern/vfs_export.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_subr.c 8.13 (Berkeley) 4/18/94
- * $Id: vfs_subr.c,v 1.9 1994/09/25 19:33:52 phk Exp $
+ * $Id: vfs_subr.c,v 1.10 1994/10/02 17:35:38 phk Exp $
*/
/*
@@ -491,7 +491,10 @@ vinvalbuf(vp, flags, cred, p, slpflag, slptimeo)
}
}
- pager = (vm_pager_t)vp->v_vmdata;
+ pager = NULL;
+ object = (vm_object_t)vp->v_vmdata;
+ if( object != NULL)
+ pager = object->pager;
if (pager != NULL) {
object = vm_object_lookup(pager);
if (object) {
diff --git a/sys/kern/vfs_extattr.c b/sys/kern/vfs_extattr.c
index ea4b9ef..0a85336 100644
--- a/sys/kern/vfs_extattr.c
+++ b/sys/kern/vfs_extattr.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_syscalls.c 8.13 (Berkeley) 4/15/94
- * $Id: vfs_syscalls.c,v 1.9 1994/09/28 16:45:11 dfr Exp $
+ * $Id: vfs_syscalls.c,v 1.10 1994/10/02 17:35:39 phk Exp $
*/
#include <sys/param.h>
@@ -2224,6 +2224,8 @@ revoke(p, uap, retval)
if (p->p_ucred->cr_uid != vattr.va_uid &&
(error = suser(p->p_ucred, &p->p_acflag)))
goto out;
+ if( vp->v_vmdata)
+ vnode_pager_uncache( vp);
if (vp->v_usecount > 1 || (vp->v_flag & VALIASED))
vgoneall(vp);
out:
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index eda779b..d79aae1 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_subr.c 8.13 (Berkeley) 4/18/94
- * $Id: vfs_subr.c,v 1.9 1994/09/25 19:33:52 phk Exp $
+ * $Id: vfs_subr.c,v 1.10 1994/10/02 17:35:38 phk Exp $
*/
/*
@@ -491,7 +491,10 @@ vinvalbuf(vp, flags, cred, p, slpflag, slptimeo)
}
}
- pager = (vm_pager_t)vp->v_vmdata;
+ pager = NULL;
+ object = (vm_object_t)vp->v_vmdata;
+ if( object != NULL)
+ pager = object->pager;
if (pager != NULL) {
object = vm_object_lookup(pager);
if (object) {
diff --git a/sys/kern/vfs_syscalls.c b/sys/kern/vfs_syscalls.c
index ea4b9ef..0a85336 100644
--- a/sys/kern/vfs_syscalls.c
+++ b/sys/kern/vfs_syscalls.c
@@ -36,7 +36,7 @@
* SUCH DAMAGE.
*
* @(#)vfs_syscalls.c 8.13 (Berkeley) 4/15/94
- * $Id: vfs_syscalls.c,v 1.9 1994/09/28 16:45:11 dfr Exp $
+ * $Id: vfs_syscalls.c,v 1.10 1994/10/02 17:35:39 phk Exp $
*/
#include <sys/param.h>
@@ -2224,6 +2224,8 @@ revoke(p, uap, retval)
if (p->p_ucred->cr_uid != vattr.va_uid &&
(error = suser(p->p_ucred, &p->p_acflag)))
goto out;
+ if( vp->v_vmdata)
+ vnode_pager_uncache( vp);
if (vp->v_usecount > 1 || (vp->v_flag & VALIASED))
vgoneall(vp);
out:
diff --git a/sys/kern/vfs_vnops.c b/sys/kern/vfs_vnops.c
index de89705..79b92cb 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.4 1994/08/18 03:53:38 davidg Exp $
+ * $Id: vfs_vnops.c,v 1.5 1994/10/02 17:35:40 phk Exp $
*/
#include <sys/param.h>
@@ -152,6 +152,30 @@ vn_open(ndp, fmode, cmode)
goto bad;
if (fmode & FWRITE)
vp->v_writecount++;
+ /*
+ * this is here for VMIO support
+ */
+ if( vp->v_type == VREG) {
+ vm_object_t object;
+ vm_pager_t pager;
+ if( (vp->v_flag & VVMIO) == 0) {
+ pager = (vm_pager_t) vnode_pager_alloc(vp, 0, 0, 0);
+ object = (vm_object_t) vp->v_vmdata;
+ if( object->pager != pager)
+ panic("ufs_open: pager/object mismatch");
+ (void) vm_object_lookup( pager);
+ pager_cache( object, TRUE);
+ vp->v_flag |= VVMIO;
+ } else {
+ object = (vm_object_t) vp->v_vmdata;
+ if( !object)
+ panic("ufs_open: VMIO object missing");
+ pager = object->pager;
+ if( !pager)
+ panic("ufs_open: VMIO pager missing");
+ (void) vm_object_lookup( pager);
+ }
+ }
return (0);
bad:
vput(vp);
@@ -206,6 +230,15 @@ 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) {
+ if( vp->v_vmdata == NULL)
+ panic("ufs_close: VMIO object missing");
+ vm_object_deallocate( (vm_object_t) vp->v_vmdata);
+ }
vrele(vp);
return (error);
}
OpenPOWER on IntegriCloud