summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2015-11-22 09:48:03 +0000
committerkib <kib@FreeBSD.org>2015-11-22 09:48:03 +0000
commit0ae248d3d05b861f09fca72e01acf60789357e4e (patch)
tree64ea56baf7de91a56e11c24a7b4c74d48519eaed /sys/vm
parenta7bfea84af3452826c8a78ce3dfb68723af50ea3 (diff)
downloadFreeBSD-src-0ae248d3d05b861f09fca72e01acf60789357e4e.zip
FreeBSD-src-0ae248d3d05b861f09fca72e01acf60789357e4e.tar.gz
Noted by: glebius
Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week
Diffstat (limited to 'sys/vm')
-rw-r--r--sys/vm/vnode_pager.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c
index c3eebc3..ba6a059 100644
--- a/sys/vm/vnode_pager.c
+++ b/sys/vm/vnode_pager.c
@@ -770,7 +770,7 @@ vnode_pager_generic_getpages(struct vnode *vp, vm_page_t *m, int bytecount,
struct bufobj *bo;
struct buf *bp;
daddr_t firstaddr, reqblock;
- off_t foff;
+ off_t foff, pib;
int pbefore, pafter, i, size, bsize, first, last, *freecnt;
int count, error, before, after, secmask;
@@ -864,8 +864,9 @@ vnode_pager_generic_getpages(struct vnode *vp, vm_page_t *m, int bytecount,
VM_OBJECT_WUNLOCK(object);
}
- pbefore = (daddr_t)before * bsize / PAGE_SIZE;
- pafter = (daddr_t)after * bsize / PAGE_SIZE;
+ pib = IDX_TO_OFF(m[reqpage]->pindex) % bsize;
+ pbefore = ((daddr_t)before * bsize + pib) / PAGE_SIZE;
+ pafter = ((daddr_t)(after + 1) * bsize - pib) / PAGE_SIZE - 1;
first = reqpage < pbefore ? 0 : reqpage - pbefore;
last = reqpage + pafter >= count ? count - 1 : reqpage + pafter;
if (first > 0 || last + 1 < count) {
@@ -887,7 +888,7 @@ vnode_pager_generic_getpages(struct vnode *vp, vm_page_t *m, int bytecount,
* here on direct device I/O
*/
firstaddr = reqblock;
- firstaddr += (IDX_TO_OFF(m[reqpage]->pindex) % bsize) / DEV_BSIZE;
+ firstaddr += pib / DEV_BSIZE;
firstaddr -= IDX_TO_OFF(reqpage - first) / DEV_BSIZE;
/*
OpenPOWER on IntegriCloud