vnode_pager.c (ad5dd2341c0ff5e5a092ae21b2c275a0608fc701) | vnode_pager.c (aa8de40ae504c80301d07b7a4cfa74359792cc72) |
---|---|
1/* 2 * Copyright (c) 1990 University of Utah. 3 * Copyright (c) 1991 The Regents of the University of California. 4 * All rights reserved. 5 * Copyright (c) 1993, 1994 John S. Dyson 6 * Copyright (c) 1995, David Greenman 7 * 8 * This code is derived from software contributed to Berkeley by --- 24 unchanged lines hidden (view full) --- 33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 36 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 37 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 38 * SUCH DAMAGE. 39 * 40 * from: @(#)vnode_pager.c 7.5 (Berkeley) 4/20/91 | 1/* 2 * Copyright (c) 1990 University of Utah. 3 * Copyright (c) 1991 The Regents of the University of California. 4 * All rights reserved. 5 * Copyright (c) 1993, 1994 John S. Dyson 6 * Copyright (c) 1995, David Greenman 7 * 8 * This code is derived from software contributed to Berkeley by --- 24 unchanged lines hidden (view full) --- 33 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 34 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 35 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 36 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 37 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 38 * SUCH DAMAGE. 39 * 40 * from: @(#)vnode_pager.c 7.5 (Berkeley) 4/20/91 |
41 * $Id: vnode_pager.c,v 1.58 1996/01/19 04:00:31 dyson Exp $ | 41 * $Id: vnode_pager.c,v 1.59 1996/03/19 05:13:22 dyson Exp $ |
42 */ 43 44/* 45 * Page to/from files (vnodes). 46 */ 47 48/* 49 * TODO: --- 240 unchanged lines hidden (view full) --- 290 if (nsize == object->un_pager.vnp.vnp_size) 291 return; 292 293 /* 294 * File has shrunk. Toss any cached pages beyond the new EOF. 295 */ 296 if (nsize < object->un_pager.vnp.vnp_size) { 297 vm_ooffset_t nsizerounded; | 42 */ 43 44/* 45 * Page to/from files (vnodes). 46 */ 47 48/* 49 * TODO: --- 240 unchanged lines hidden (view full) --- 290 if (nsize == object->un_pager.vnp.vnp_size) 291 return; 292 293 /* 294 * File has shrunk. Toss any cached pages beyond the new EOF. 295 */ 296 if (nsize < object->un_pager.vnp.vnp_size) { 297 vm_ooffset_t nsizerounded; |
298 nsizerounded = IDX_TO_OFF(OFF_TO_IDX(nsize + PAGE_SIZE - 1)); | 298 nsizerounded = IDX_TO_OFF(OFF_TO_IDX(nsize + PAGE_MASK)); |
299 if (nsizerounded < object->un_pager.vnp.vnp_size) { 300 vm_object_page_remove(object, | 299 if (nsizerounded < object->un_pager.vnp.vnp_size) { 300 vm_object_page_remove(object, |
301 OFF_TO_IDX(nsize + PAGE_SIZE - 1), | 301 OFF_TO_IDX(nsize + PAGE_MASK), |
302 OFF_TO_IDX(object->un_pager.vnp.vnp_size), 303 FALSE); 304 } 305 /* 306 * this gets rid of garbage at the end of a page that is now 307 * only partially backed by the vnode... 308 */ 309 if (nsize & PAGE_MASK) { --- 5 unchanged lines hidden (view full) --- 315 kva = vm_pager_map_page(m); 316 bzero((caddr_t) kva + (nsize & PAGE_MASK), 317 (int) (round_page(nsize) - nsize)); 318 vm_pager_unmap_page(kva); 319 } 320 } 321 } 322 object->un_pager.vnp.vnp_size = nsize; | 302 OFF_TO_IDX(object->un_pager.vnp.vnp_size), 303 FALSE); 304 } 305 /* 306 * this gets rid of garbage at the end of a page that is now 307 * only partially backed by the vnode... 308 */ 309 if (nsize & PAGE_MASK) { --- 5 unchanged lines hidden (view full) --- 315 kva = vm_pager_map_page(m); 316 bzero((caddr_t) kva + (nsize & PAGE_MASK), 317 (int) (round_page(nsize) - nsize)); 318 vm_pager_unmap_page(kva); 319 } 320 } 321 } 322 object->un_pager.vnp.vnp_size = nsize; |
323 object->size = OFF_TO_IDX(nsize + PAGE_SIZE - 1); | 323 object->size = OFF_TO_IDX(nsize + PAGE_MASK); |
324} 325 326void 327vnode_pager_umount(mp) 328 register struct mount *mp; 329{ 330 struct vnode *vp, *nvp; 331 --- 181 unchanged lines hidden (view full) --- 513 514 /* 515 * free the buffer header back to the swap buffer pool 516 */ 517 relpbuf(bp); 518 if (error) 519 break; 520 | 324} 325 326void 327vnode_pager_umount(mp) 328 register struct mount *mp; 329{ 330 struct vnode *vp, *nvp; 331 --- 181 unchanged lines hidden (view full) --- 513 514 /* 515 * free the buffer header back to the swap buffer pool 516 */ 517 relpbuf(bp); 518 if (error) 519 break; 520 |
521 vm_page_set_validclean(m, (i * bsize) & (PAGE_SIZE-1), bsize); | 521 vm_page_set_validclean(m, (i * bsize) & PAGE_MASK, bsize); |
522 } else { | 522 } else { |
523 vm_page_set_validclean(m, (i * bsize) & (PAGE_SIZE-1), bsize); | 523 vm_page_set_validclean(m, (i * bsize) & PAGE_MASK, bsize); |
524 bzero((caddr_t) kva + i * bsize, bsize); 525 } 526 } 527 vm_pager_unmap_page(kva); 528 pmap_clear_modify(VM_PAGE_TO_PHYS(m)); 529 m->flags &= ~PG_ZERO; 530 if (error) { 531 return VM_PAGER_ERROR; --- 360 unchanged lines hidden (view full) --- 892 ncount = count; 893 894 poffset = IDX_TO_OFF(m[0]->pindex); 895 if (maxsize + poffset > object->un_pager.vnp.vnp_size) { 896 if (object->un_pager.vnp.vnp_size > poffset) 897 maxsize = object->un_pager.vnp.vnp_size - poffset; 898 else 899 maxsize = 0; | 524 bzero((caddr_t) kva + i * bsize, bsize); 525 } 526 } 527 vm_pager_unmap_page(kva); 528 pmap_clear_modify(VM_PAGE_TO_PHYS(m)); 529 m->flags &= ~PG_ZERO; 530 if (error) { 531 return VM_PAGER_ERROR; --- 360 unchanged lines hidden (view full) --- 892 ncount = count; 893 894 poffset = IDX_TO_OFF(m[0]->pindex); 895 if (maxsize + poffset > object->un_pager.vnp.vnp_size) { 896 if (object->un_pager.vnp.vnp_size > poffset) 897 maxsize = object->un_pager.vnp.vnp_size - poffset; 898 else 899 maxsize = 0; |
900 ncount = (maxsize + PAGE_SIZE - 1) / PAGE_SIZE; | 900 ncount = btoc(maxsize); |
901 if (ncount < count) { 902 for (i = ncount; i < count; i++) { 903 rtvals[i] = VM_PAGER_BAD; 904 } 905#ifdef BOGUS 906 if (ncount == 0) { 907 printf("vnode_pager_putpages: write past end of file: %d, %lu\n", 908 poffset, --- 56 unchanged lines hidden --- | 901 if (ncount < count) { 902 for (i = ncount; i < count; i++) { 903 rtvals[i] = VM_PAGER_BAD; 904 } 905#ifdef BOGUS 906 if (ncount == 0) { 907 printf("vnode_pager_putpages: write past end of file: %d, %lu\n", 908 poffset, --- 56 unchanged lines hidden --- |