diff options
Diffstat (limited to 'sys/kern/vfs_cluster.c')
| -rw-r--r-- | sys/kern/vfs_cluster.c | 57 | 
1 files changed, 26 insertions, 31 deletions
diff --git a/sys/kern/vfs_cluster.c b/sys/kern/vfs_cluster.c index 2895b09746d3..b232071698d0 100644 --- a/sys/kern/vfs_cluster.c +++ b/sys/kern/vfs_cluster.c @@ -33,7 +33,7 @@   * SUCH DAMAGE.   *   *	@(#)vfs_cluster.c	8.7 (Berkeley) 2/13/94 - * $Id: vfs_cluster.c,v 1.30 1995/12/11 04:56:07 dyson Exp $ + * $Id: vfs_cluster.c,v 1.31 1995/12/22 16:06:46 bde Exp $   */  #include <sys/param.h> @@ -149,8 +149,7 @@ cluster_read(vp, filesize, lblkno, size, cred, bpp)  			vp->v_ralen >>= RA_SHIFTDOWN;  			return 0;  		} else if( vp->v_maxra > lblkno) { -			if ( (vp->v_maxra + (vp->v_ralen / RA_MULTIPLE_SLOW)) >= -					(lblkno + vp->v_ralen)) { +			if ( vp->v_maxra > lblkno + (vp->v_ralen / RA_MULTIPLE_SLOW) ) {  				if ((vp->v_ralen + 1) < RA_MULTIPLE_FAST*(MAXPHYS / size))  					++vp->v_ralen;  				return 0; @@ -192,18 +191,13 @@ cluster_read(vp, filesize, lblkno, size, cred, bpp)  		 * ahead too much, and we need to back-off, otherwise we might  		 * try to read more.  		 */ -		for (i = 0; i < vp->v_ralen; i++) { +		for (i = 0; i < vp->v_maxra - lblkno; i++) {  			rablkno = lblkno + i; -			alreadyincore = (int) gbincore(vp, rablkno); +			alreadyincore = (int) incore(vp, rablkno);  			if (!alreadyincore) { -				if (rablkno < vp->v_maxra) { -					vp->v_maxra = rablkno; -					vp->v_ralen >>= RA_SHIFTDOWN; -					alreadyincore = 1; -				} -				break; -			} else if (vp->v_maxra < rablkno) { -				vp->v_maxra = rablkno + 1; +				vp->v_maxra = rablkno; +				vp->v_ralen >>= RA_SHIFTDOWN; +				alreadyincore = 1;  			}  		}  	} @@ -248,9 +242,12 @@ cluster_read(vp, filesize, lblkno, size, cred, bpp)  	 */  	if (rbp) {  		vp->v_maxra = rbp->b_lblkno + rbp->b_bcount / size; -		if (error || (rbp->b_flags & B_CACHE)) { +		if (error) {  			rbp->b_flags &= ~(B_ASYNC | B_READ);  			brelse(rbp); +		} else if (rbp->b_flags & B_CACHE) { +			rbp->b_flags &= ~(B_ASYNC | B_READ); +			bqrelse(rbp);  		} else {  			if ((rbp->b_flags & B_CLUSTER) == 0)  				vfs_busy_pages(rbp, 0); @@ -328,14 +325,14 @@ cluster_rbuild(vp, filesize, lbn, blkno, size, run)  				round_page(size) > MAXPHYS)  				break; -			if (gbincore(vp, lbn + i)) +			if (incore(vp, lbn + i))  				break;  			tbp = getblk(vp, lbn + i, size, 0, 0);  			if ((tbp->b_flags & B_CACHE) ||  				(tbp->b_flags & B_VMIO) == 0) { -				brelse(tbp); +				bqrelse(tbp);  				break;  			} @@ -532,10 +529,7 @@ cluster_write(bp, filesize)  		vp->v_clen = maxclen;  		if (!async && maxclen == 0) {	/* I/O not contiguous */  			vp->v_cstart = lbn + 1; -			if (!async) -				bawrite(bp); -			else -				bdwrite(bp); +			bawrite(bp);  		} else {	/* Wait for rest of cluster */  			vp->v_cstart = lbn;  			bdwrite(bp); @@ -545,8 +539,7 @@ cluster_write(bp, filesize)  		 * At end of cluster, write it out.  		 */  		bdwrite(bp); -		cluster_wbuild(vp, lblocksize, vp->v_cstart, -		    vp->v_clen + 1); +		cluster_wbuild(vp, lblocksize, vp->v_cstart, vp->v_clen + 1);  		vp->v_clen = 0;  		vp->v_cstart = lbn + 1;  	} else @@ -653,15 +646,17 @@ cluster_wbuild(vp, size, start_lbn, len)  				tbp->b_flags &= ~B_DONE;  				splx(s);  			} -			for (j = 0; j < tbp->b_npages; j += 1) { -				vm_page_t m; -				m = tbp->b_pages[j]; -				++m->busy; -				++m->object->paging_in_progress; -				if ((bp->b_npages == 0) || -					(bp->b_pages[bp->b_npages - 1] != m)) { -					bp->b_pages[bp->b_npages] = m; -					bp->b_npages++; +			if (tbp->b_flags & B_VMIO) { +				for (j = 0; j < tbp->b_npages; j += 1) { +					vm_page_t m; +					m = tbp->b_pages[j]; +					++m->busy; +					++m->object->paging_in_progress; +					if ((bp->b_npages == 0) || +						(bp->b_pages[bp->b_npages - 1] != m)) { +						bp->b_pages[bp->b_npages] = m; +						bp->b_npages++; +					}  				}  			}  			bp->b_bcount += size;  | 
