diff options
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/vfs_bio.c | 23 | ||||
-rw-r--r-- | sys/kern/vfs_export.c | 7 | ||||
-rw-r--r-- | sys/kern/vfs_extattr.c | 4 | ||||
-rw-r--r-- | sys/kern/vfs_subr.c | 7 | ||||
-rw-r--r-- | sys/kern/vfs_syscalls.c | 4 | ||||
-rw-r--r-- | sys/kern/vfs_vnops.c | 35 |
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); } |