diff options
author | dyson <dyson@FreeBSD.org> | 1995-12-17 23:29:56 +0000 |
---|---|---|
committer | dyson <dyson@FreeBSD.org> | 1995-12-17 23:29:56 +0000 |
commit | 9127bd82d9a3fa4f62fc48e6398634249eeca540 (patch) | |
tree | f066ee70b0d508105709fbb077e15396f83446af /sys | |
parent | 02cbd66c6d015a152ab4b0c15cb19a4d854dc78f (diff) | |
download | FreeBSD-src-9127bd82d9a3fa4f62fc48e6398634249eeca540.zip FreeBSD-src-9127bd82d9a3fa4f62fc48e6398634249eeca540.tar.gz |
Fix paging from ext2fs (and other fs w/block size < PAGE_SIZE). This
should fix kern/900.
Diffstat (limited to 'sys')
-rw-r--r-- | sys/vm/vnode_pager.c | 46 |
1 files changed, 31 insertions, 15 deletions
diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index 8223df5..873b20ce 100644 --- a/sys/vm/vnode_pager.c +++ b/sys/vm/vnode_pager.c @@ -38,7 +38,7 @@ * SUCH DAMAGE. * * from: @(#)vnode_pager.c 7.5 (Berkeley) 4/20/91 - * $Id: vnode_pager.c,v 1.55 1995/12/11 04:58:32 dyson Exp $ + * $Id: vnode_pager.c,v 1.56 1995/12/14 09:55:14 phk Exp $ */ /* @@ -210,7 +210,7 @@ vnode_pager_haspage(object, pindex, before, after) daddr_t reqblock; int poff; int bsize; - int pagesperblock; + int pagesperblock, blocksperpage; /* * If filesystem no longer mounted or offset beyond end of file we do @@ -222,26 +222,42 @@ vnode_pager_haspage(object, pindex, before, after) bsize = vp->v_mount->mnt_stat.f_iosize; pagesperblock = bsize / PAGE_SIZE; - reqblock = pindex / pagesperblock; + blocksperpage = 0; + if (pagesperblock > 0) { + reqblock = pindex / pagesperblock; + } else { + blocksperpage = (PAGE_SIZE / bsize); + reqblock = pindex * blocksperpage; + } err = VOP_BMAP(vp, reqblock, (struct vnode **) 0, &bn, after, before); if (err) return TRUE; if ( bn == -1) return FALSE; - poff = pindex - (reqblock * pagesperblock); - if (before) { - *before *= pagesperblock; - *before += poff; - } - if (after) { - int numafter; - *after *= pagesperblock; - numafter = pagesperblock - (poff + 1); - if (IDX_TO_OFF(pindex + numafter) > object->un_pager.vnp.vnp_size) { - numafter = OFF_TO_IDX((object->un_pager.vnp.vnp_size - IDX_TO_OFF(pindex))); + if (pagesperblock > 0) { + poff = pindex - (reqblock * pagesperblock); + if (before) { + *before *= pagesperblock; + *before += poff; + } + if (after) { + int numafter; + *after *= pagesperblock; + numafter = pagesperblock - (poff + 1); + if (IDX_TO_OFF(pindex + numafter) > object->un_pager.vnp.vnp_size) { + numafter = OFF_TO_IDX((object->un_pager.vnp.vnp_size - IDX_TO_OFF(pindex))); + } + *after += numafter; + } + } else { + if (before) { + *before /= blocksperpage; + } + + if (after) { + *after /= blocksperpage; } - *after += numafter; } return TRUE; } |