diff options
author | luoqi <luoqi@FreeBSD.org> | 1998-08-25 13:47:37 +0000 |
---|---|---|
committer | luoqi <luoqi@FreeBSD.org> | 1998-08-25 13:47:37 +0000 |
commit | 920e5f64ff6371aab643ceb4b3469afefc986eca (patch) | |
tree | abdacc9c2d05318c421caa530bbccdc1f372e8cc /sys/vm | |
parent | 553a8d11c169dfcf52e87f456152a2177eae37f1 (diff) | |
download | FreeBSD-src-920e5f64ff6371aab643ceb4b3469afefc986eca.zip FreeBSD-src-920e5f64ff6371aab643ceb4b3469afefc986eca.tar.gz |
Fix a rounding problem that causes vnode pager to fail to remove the last
partially filled page during a truncation.
PR: kern/7422
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/vnode_pager.c | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c index 50b77a0..90570c6 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.94 1998/07/11 11:30:46 bde Exp $ + * $Id: vnode_pager.c,v 1.95 1998/08/24 08:39:38 dfr Exp $ */ /* @@ -253,6 +253,7 @@ vnode_pager_setsize(vp, nsize) struct vnode *vp; vm_ooffset_t nsize; { + vm_pindex_t nobjsize; vm_object_t object = vp->v_object; if (object == NULL) @@ -264,19 +265,16 @@ vnode_pager_setsize(vp, nsize) if (nsize == object->un_pager.vnp.vnp_size) return; + nobjsize = OFF_TO_IDX(nsize + PAGE_MASK); + /* * File has shrunk. Toss any cached pages beyond the new EOF. */ if (nsize < object->un_pager.vnp.vnp_size) { - vm_ooffset_t nsizerounded; - nsizerounded = IDX_TO_OFF(OFF_TO_IDX(nsize + PAGE_MASK)); - if (nsizerounded < object->un_pager.vnp.vnp_size) { - vm_pindex_t st, end; - st = OFF_TO_IDX(nsize + PAGE_MASK); - end = OFF_TO_IDX(object->un_pager.vnp.vnp_size); - - vm_freeze_copyopts(object, OFF_TO_IDX(nsize), object->size); - vm_object_page_remove(object, st, end, FALSE); + vm_freeze_copyopts(object, OFF_TO_IDX(nsize), object->size); + if (nobjsize < object->size) { + vm_object_page_remove(object, nobjsize, object->size, + FALSE); } /* * this gets rid of garbage at the end of a page that is now @@ -296,7 +294,7 @@ vnode_pager_setsize(vp, nsize) } } object->un_pager.vnp.vnp_size = nsize; - object->size = OFF_TO_IDX(nsize + PAGE_MASK); + object->size = nobjsize; } void |