Clean up the prefetch code for Linux, by calling afs_PrefetchChunk
authorChas Williams <chas@cmf.nrl.navy.mil>
Tue, 6 Aug 2002 20:49:00 +0000 (20:49 +0000)
committerNickolai Zeldovich <kolya@mit.edu>
Tue, 6 Aug 2002 20:49:00 +0000 (20:49 +0000)
directly rather than changing the ifdef's in afs_UFSRead.

src/afs/LINUX/osi_vnodeops.c
src/afs/VNOPS/afs_vnop_read.c

index ae11f4e..8e2264c 100644 (file)
@@ -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,
index 55d4160..142c686 100644 (file)
@@ -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))