summaryrefslogtreecommitdiffstats
path: root/sys/kern
diff options
context:
space:
mode:
authordyson <dyson@FreeBSD.org>1997-09-21 04:49:30 +0000
committerdyson <dyson@FreeBSD.org>1997-09-21 04:49:30 +0000
commitfe4d489758c7073b68fbc213db2daf386df5632c (patch)
tree69691e05dbdc5d8fc6e65a0da5b2eaf09dd72274 /sys/kern
parente64b1984f97c6d987d7d36b61a3afe5028a08312 (diff)
downloadFreeBSD-src-fe4d489758c7073b68fbc213db2daf386df5632c.zip
FreeBSD-src-fe4d489758c7073b68fbc213db2daf386df5632c.tar.gz
Re-institute a bugfix in allocation of anonymous buffer memory.
Diffstat (limited to 'sys/kern')
-rw-r--r--sys/kern/vfs_bio.c43
1 files changed, 36 insertions, 7 deletions
diff --git a/sys/kern/vfs_bio.c b/sys/kern/vfs_bio.c
index fdc9399..0eb9864 100644
--- a/sys/kern/vfs_bio.c
+++ b/sys/kern/vfs_bio.c
@@ -18,7 +18,7 @@
* 5. Modifications may be freely made to this file if the above conditions
* are met.
*
- * $Id: vfs_bio.c,v 1.125 1997/09/07 16:56:29 bde Exp $
+ * $Id: vfs_bio.c,v 1.126 1997/09/10 20:09:22 phk Exp $
*/
/*
@@ -1786,11 +1786,26 @@ biodone(register struct buf * bp)
int iosize;
struct vnode *vp = bp->b_vp;
+ obj = vp->v_object;
+
+#if defined(VFS_BIO_DEBUG)
+ if (vp->v_usecount == 0) {
+ panic("biodone: zero vnode ref count");
+ }
+
+ if (vp->v_object == NULL) {
+ panic("biodone: missing VM object");
+ }
+
+ if ((vp->v_flag & VVMIO) == 0) {
+ panic("biodone: vnode is not setup for merged cache");
+ }
+#endif
+
if (vp->v_type == VBLK)
foff = (vm_ooffset_t) DEV_BSIZE * bp->b_lblkno;
else
foff = (vm_ooffset_t) vp->v_mount->mnt_stat.f_iosize * bp->b_lblkno;
- obj = vp->v_object;
#if !defined(MAX_PERF)
if (!obj) {
panic("biodone: no object");
@@ -2188,7 +2203,8 @@ vm_hold_load_pages(struct buf * bp, vm_offset_t from, vm_offset_t to)
tryagain:
- p = vm_page_alloc(kernel_object, ((pg - VM_MIN_KERNEL_ADDRESS) >> PAGE_SHIFT),
+ p = vm_page_alloc(kernel_object,
+ ((pg - VM_MIN_KERNEL_ADDRESS) >> PAGE_SHIFT),
VM_ALLOC_NORMAL);
if (!p) {
VM_WAIT;
@@ -2199,7 +2215,7 @@ tryagain:
bp->b_pages[index] = p;
PAGE_WAKEUP(p);
}
- bp->b_npages = to >> PAGE_SHIFT;
+ bp->b_npages = index;
}
void
@@ -2207,11 +2223,11 @@ vm_hold_free_pages(struct buf * bp, vm_offset_t from, vm_offset_t to)
{
vm_offset_t pg;
vm_page_t p;
- int index;
+ int index, newnpages;
from = round_page(from);
to = round_page(to);
- index = (from - trunc_page(bp->b_data)) >> PAGE_SHIFT;
+ newnpages = index = (from - trunc_page(bp->b_data)) >> PAGE_SHIFT;
for (pg = from; pg < to; pg += PAGE_SIZE, index++) {
p = bp->b_pages[index];
@@ -2228,7 +2244,7 @@ vm_hold_free_pages(struct buf * bp, vm_offset_t from, vm_offset_t to)
vm_page_free(p);
}
}
- bp->b_npages = from >> PAGE_SHIFT;
+ bp->b_npages = newnpages;
}
@@ -2257,5 +2273,18 @@ DB_SHOW_COMMAND(buffer, db_show_buffer)
"b_blkno = %d, b_pblkno = %d\n",
bp->b_error, bp->b_bufsize, bp->b_bcount, bp->b_resid,
bp->b_dev, bp->b_un.b_addr, bp->b_blkno, bp->b_pblkno);
+ if (bp->b_npages) {
+ int i;
+ db_printf("b_npages = %d, pages(OBJ, IDX, PA): ", bp->b_npages);
+ for (i = 0; i < bp->b_npages; i++) {
+ vm_page_t m;
+ m = bp->b_pages[i];
+ db_printf("(0x%x, 0x%x, 0x%x)", m->object, m->pindex,
+ VM_PAGE_TO_PHYS(m));
+ if ((i + 1) < bp->b_npages)
+ db_printf(",");
+ }
+ db_printf("\n");
+ }
}
#endif /* DDB */
OpenPOWER on IntegriCloud