summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authordyson <dyson@FreeBSD.org>1995-12-17 23:29:56 +0000
committerdyson <dyson@FreeBSD.org>1995-12-17 23:29:56 +0000
commit9127bd82d9a3fa4f62fc48e6398634249eeca540 (patch)
treef066ee70b0d508105709fbb077e15396f83446af /sys
parent02cbd66c6d015a152ab4b0c15cb19a4d854dc78f (diff)
downloadFreeBSD-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.c46
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;
}
OpenPOWER on IntegriCloud