vnode_pager.c (91406) | vnode_pager.c (92029) |
---|---|
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 * $FreeBSD: head/sys/vm/vnode_pager.c 91406 2002-02-27 18:32:23Z jhb $ | 41 * $FreeBSD: head/sys/vm/vnode_pager.c 92029 2002-03-10 21:52:48Z eivind $ |
42 */ 43 44/* 45 * Page to/from files (vnodes). 46 */ 47 48/* 49 * TODO: --- 174 unchanged lines hidden (view full) --- 224 } else { 225 blocksperpage = (PAGE_SIZE / bsize); 226 reqblock = pindex * blocksperpage; 227 } 228 err = VOP_BMAP(vp, reqblock, (struct vnode **) 0, &bn, 229 after, before); 230 if (err) 231 return TRUE; | 42 */ 43 44/* 45 * Page to/from files (vnodes). 46 */ 47 48/* 49 * TODO: --- 174 unchanged lines hidden (view full) --- 224 } else { 225 blocksperpage = (PAGE_SIZE / bsize); 226 reqblock = pindex * blocksperpage; 227 } 228 err = VOP_BMAP(vp, reqblock, (struct vnode **) 0, &bn, 229 after, before); 230 if (err) 231 return TRUE; |
232 if ( bn == -1) | 232 if (bn == -1) |
233 return FALSE; 234 if (pagesperblock > 0) { 235 poff = pindex - (reqblock * pagesperblock); 236 if (before) { 237 *before *= pagesperblock; 238 *before += poff; 239 } 240 if (after) { --- 147 unchanged lines hidden (view full) --- 388 voffset = address % bsize; 389 390 err = VOP_BMAP(vp, vblock, &rtvp, &block, run, NULL); 391 392 if (err || (block == -1)) 393 rtaddress = -1; 394 else { 395 rtaddress = block + voffset / DEV_BSIZE; | 233 return FALSE; 234 if (pagesperblock > 0) { 235 poff = pindex - (reqblock * pagesperblock); 236 if (before) { 237 *before *= pagesperblock; 238 *before += poff; 239 } 240 if (after) { --- 147 unchanged lines hidden (view full) --- 388 voffset = address % bsize; 389 390 err = VOP_BMAP(vp, vblock, &rtvp, &block, run, NULL); 391 392 if (err || (block == -1)) 393 rtaddress = -1; 394 else { 395 rtaddress = block + voffset / DEV_BSIZE; |
396 if( run) { | 396 if (run) { |
397 *run += 1; 398 *run *= bsize/PAGE_SIZE; 399 *run -= voffset/PAGE_SIZE; 400 } 401 } 402 403 return rtaddress; 404} --- 271 unchanged lines hidden (view full) --- 676 return vnode_pager_input_smlfs(object, m[reqpage]); 677 } 678 679 /* 680 * If we have a completely valid page available to us, we can 681 * clean up and return. Otherwise we have to re-read the 682 * media. 683 */ | 397 *run += 1; 398 *run *= bsize/PAGE_SIZE; 399 *run -= voffset/PAGE_SIZE; 400 } 401 } 402 403 return rtaddress; 404} --- 271 unchanged lines hidden (view full) --- 676 return vnode_pager_input_smlfs(object, m[reqpage]); 677 } 678 679 /* 680 * If we have a completely valid page available to us, we can 681 * clean up and return. Otherwise we have to re-read the 682 * media. 683 */ |
684 | |
685 if (m[reqpage]->valid == VM_PAGE_BITS_ALL) { 686 for (i = 0; i < count; i++) { 687 if (i != reqpage) 688 vm_page_free(m[i]); 689 } 690 return VM_PAGER_OK; 691 } 692 m[reqpage]->valid = 0; 693 694 /* 695 * here on direct device I/O 696 */ | 684 if (m[reqpage]->valid == VM_PAGE_BITS_ALL) { 685 for (i = 0; i < count; i++) { 686 if (i != reqpage) 687 vm_page_free(m[i]); 688 } 689 return VM_PAGER_OK; 690 } 691 m[reqpage]->valid = 0; 692 693 /* 694 * here on direct device I/O 695 */ |
697 | |
698 firstaddr = -1; | 696 firstaddr = -1; |
697 |
|
699 /* 700 * calculate the run that includes the required page 701 */ | 698 /* 699 * calculate the run that includes the required page 700 */ |
702 for(first = 0, i = 0; i < count; i = runend) { | 701 for (first = 0, i = 0; i < count; i = runend) { |
703 firstaddr = vnode_pager_addr(vp, 704 IDX_TO_OFF(m[i]->pindex), &runpg); 705 if (firstaddr == -1) { 706 if (i == reqpage && foff < object->un_pager.vnp.vnp_size) { 707 /* XXX no %qd in kernel. */ 708 panic("vnode_pager_getpages: unexpected missing page: firstaddr: %d, foff: 0x%lx%08lx, vnp_size: 0x%lx%08lx", 709 firstaddr, (u_long)(foff >> 32), 710 (u_long)(u_int32_t)foff, --- 204 unchanged lines hidden (view full) --- 915 */ 916 917 if ((cnt.v_free_count + cnt.v_cache_count) < cnt.v_pageout_free_min) 918 sync |= OBJPC_SYNC; 919 920 /* 921 * Call device-specific putpages function 922 */ | 702 firstaddr = vnode_pager_addr(vp, 703 IDX_TO_OFF(m[i]->pindex), &runpg); 704 if (firstaddr == -1) { 705 if (i == reqpage && foff < object->un_pager.vnp.vnp_size) { 706 /* XXX no %qd in kernel. */ 707 panic("vnode_pager_getpages: unexpected missing page: firstaddr: %d, foff: 0x%lx%08lx, vnp_size: 0x%lx%08lx", 708 firstaddr, (u_long)(foff >> 32), 709 (u_long)(u_int32_t)foff, --- 204 unchanged lines hidden (view full) --- 914 */ 915 916 if ((cnt.v_free_count + cnt.v_cache_count) < cnt.v_pageout_free_min) 917 sync |= OBJPC_SYNC; 918 919 /* 920 * Call device-specific putpages function 921 */ |
923 | |
924 vp = object->handle; 925 if (vp->v_type != VREG) 926 mp = NULL; 927 (void)vn_start_write(vp, &mp, V_WAIT); 928 rtval = VOP_PUTPAGES(vp, m, bytes, sync, rtvals, 0); 929 KASSERT(rtval != EOPNOTSUPP, 930 ("vnode_pager: stale FS putpages\n")); 931 vn_finished_write(mp); --- 144 unchanged lines hidden --- | 922 vp = object->handle; 923 if (vp->v_type != VREG) 924 mp = NULL; 925 (void)vn_start_write(vp, &mp, V_WAIT); 926 rtval = VOP_PUTPAGES(vp, m, bytes, sync, rtvals, 0); 927 KASSERT(rtval != EOPNOTSUPP, 928 ("vnode_pager: stale FS putpages\n")); 929 vn_finished_write(mp); --- 144 unchanged lines hidden --- |