From 3e45fd85912ad14fa88eb7d16fa1dfe6c3c8664c Mon Sep 17 00:00:00 2001 From: Chaskiel M Grundman Date: Mon, 5 Apr 2004 07:21:33 +0000 Subject: [PATCH] darwin-pageout-limit-to-filesize-20040405 FIXES 3870 previously we weren't limiting to file size, now we are --- src/afs/DARWIN/osi_vnodeops.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/afs/DARWIN/osi_vnodeops.c b/src/afs/DARWIN/osi_vnodeops.c index 61693c7c4..ca2cf2ca6 100644 --- a/src/afs/DARWIN/osi_vnodeops.c +++ b/src/afs/DARWIN/osi_vnodeops.c @@ -576,6 +576,7 @@ afs_vop_pageout(ap) struct iovec aiov; struct uio *uio = &auio; int nocommit = flags & UPL_NOCOMMIT; + int iosize; int code; struct vcache *tvc = VTOAFS(vp); @@ -593,7 +594,7 @@ afs_vop_pageout(ap) } #if 1 { - int lbn, iosize, s; + int lbn, s; struct buf *bp; int biosize = DEV_BSIZE; @@ -642,6 +643,19 @@ afs_vop_pageout(ap) if (f_offset & PAGE_MASK) panic("afs_vop_pageout: offset not page aligned"); + /* size will always be a multiple of PAGE_SIZE */ + /* pageout isn't supposed to extend files */ + if (f_offset + size > tvc->m.Length) + iosize = tvc->m.Length - f_offset; + else + iosize = size; + + if (size > (iosize + (PAGE_SIZE - 1)) & ~PAGE_MASK && !nocommit) { + int iosize_rnd=(iosize + (PAGE_SIZE - 1)) & ~PAGE_MASK; + kernel_upl_abort_range(pl, pl_offset + iosize_rnd, + size - iosize_rnd, + UPL_ABORT_FREE_ON_EMPTY); + } auio.uio_iov = &aiov; auio.uio_iovcnt = 1; auio.uio_offset = f_offset; @@ -650,7 +664,7 @@ afs_vop_pageout(ap) auio.uio_procp = NULL; kernel_upl_map(kernel_map, pl, &ioaddr); ioaddr += pl_offset; - auio.uio_resid = aiov.iov_len = size; + auio.uio_resid = aiov.iov_len = iosize; aiov.iov_base = (caddr_t) ioaddr; #if 1 /* USV [ */ { -- 2.39.5