From: Chas Williams Date: Tue, 6 Aug 2002 20:49:00 +0000 (+0000) Subject: Clean up the prefetch code for Linux, by calling afs_PrefetchChunk X-Git-Tag: openafs-devel_1_3_3~21 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=08c2c637ab0acda9b1319333d74850214dd5917d Clean up the prefetch code for Linux, by calling afs_PrefetchChunk directly rather than changing the ifdef's in afs_UFSRead. --- diff --git a/src/afs/LINUX/osi_vnodeops.c b/src/afs/LINUX/osi_vnodeops.c index ae11f4e..8e2264c 100644 --- a/src/afs/LINUX/osi_vnodeops.c +++ b/src/afs/LINUX/osi_vnodeops.c @@ -1352,6 +1352,7 @@ int afs_linux_readpage(struct file *fp, struct page *pp) struct iovec iovec; struct inode *ip = FILE_INODE(fp); int cnt = atomic_read(&pp->count); + struct vcache *avc = ITOAFS(ip); AFS_GLOCK(); afs_Trace4(afs_iclSetp, CM_TRACE_READPAGE, @@ -1372,7 +1373,7 @@ int afs_linux_readpage(struct file *fp, struct page *pp) setup_uio(&tuio, &iovec, (char*)address, offset, PAGESIZE, UIO_READ, AFS_UIOSYS); - code = afs_rdwr(ITOAFS(ip), &tuio, UIO_READ, 0, credp); + code = afs_rdwr(avc, &tuio, UIO_READ, 0, credp); #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0) unlock_kernel(); #endif @@ -1398,6 +1399,22 @@ int afs_linux_readpage(struct file *fp, struct page *pp) free_page(address); #endif + if (!code && AFS_CHUNKOFFSET(offset) == 0) { + struct dcache *tdc; + struct vrequest treq; + + code = afs_InitReq(&treq, credp); + if (!code && !NBObtainWriteLock(&avc->lock, 534)) { + tdc = afs_FindDCache(avc, offset); + if (tdc) { + if (!(tdc->mflags & DFNextStarted)) + afs_PrefetchChunk(avc, tdc, credp, &treq); + afs_PutDCache(tdc); + } + ReleaseWriteLock(&avc->lock); + } + } + crfree(credp); afs_Trace4(afs_iclSetp, CM_TRACE_READPAGE, ICL_TYPE_POINTER, ip, diff --git a/src/afs/VNOPS/afs_vnop_read.c b/src/afs/VNOPS/afs_vnop_read.c index 55d4160..142c686 100644 --- a/src/afs/VNOPS/afs_vnop_read.c +++ b/src/afs/VNOPS/afs_vnop_read.c @@ -330,7 +330,7 @@ tagain: */ if (tdc) { ReleaseReadLock(&tdc->lock); -#if !defined(AFS_VM_RDWR_ENV) || defined(AFS_LINUX22_ENV) +#if !defined(AFS_VM_RDWR_ENV) /* try to queue prefetch, if needed */ if (!noLock) { afs_PrefetchChunk(avc, tdc, acred, &treq); @@ -559,7 +559,7 @@ afs_UFSReadFast(avc, auio, acred, albn, abpp, noLock) if (!noLock) { ReleaseReadLock(&avc->lock); -#if !defined(AFS_VM_RDWR_ENV) || defined(AFS_LINUX22_ENV) +#if !defined(AFS_VM_RDWR_ENV) if (!(code = afs_InitReq(&treq, acred))) { if (!(tdc->mflags & DFNextStarted)) afs_PrefetchChunk(avc, tdc, acred, &treq); @@ -982,7 +982,7 @@ tagain: */ if (tdc) { ReleaseReadLock(&tdc->lock); -#if !defined(AFS_VM_RDWR_ENV) || defined(AFS_LINUX22_ENV) +#if !defined(AFS_VM_RDWR_ENV) /* try to queue prefetch, if needed */ if (!noLock) { if (!(tdc->mflags & DFNextStarted))