In message <[EMAIL PROTECTED]>,Nickolai Zel
dovich writes:
>On a slightly related note, I also noticed that the Linux client never
>calls afs_PrefetchChunk.  We probably want to copy the afs_PrefetchChunk
>invocation from some other VM-based platform into afs_linux_read or
>somesuch..

how 'bout this?

Index: src/afs/LINUX/osi_vnodeops.c
===================================================================
RCS file: /cvs/openafs/src/afs/LINUX/osi_vnodeops.c,v
retrieving revision 1.29.2.17
diff -u -d -b -w -r1.29.2.17 osi_vnodeops.c
--- src/afs/LINUX/osi_vnodeops.c        2002/08/01 19:12:01     1.29.2.17
+++ src/afs/LINUX/osi_vnodeops.c        2002/08/02 22:24:58
@@ -1254,6 +1254,7 @@
     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,
@@ -1275,7 +1276,7 @@
 
     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
@@ -1300,6 +1301,20 @@
     wake_up(&pp->wait);
     free_page(address);
 #endif
+
+    if (!code && AFS_CHUNKOFFSET(offset) == 0) {
+       struct dcache *tdc;
+       struct vrequest treq;
+
+       ObtainWriteLock(&avc->lock, 534);
+       tdc = afs_FindDCache(avc, offset);
+       if (tdc) {
+           if (!(tdc->flags & DFNextStarted))
+               afs_PrefetchChunk(avc, tdc, credp, &treq);
+           afs_PutDCache(tdc);
+       }
+       ReleaseWriteLock(&avc->lock);
+    }
 
     crfree(credp);
     afs_Trace4(afs_iclSetp, CM_TRACE_READPAGE,
_______________________________________________
OpenAFS-devel mailing list
[EMAIL PROTECTED]
https://lists.openafs.org/mailman/listinfo/openafs-devel

Reply via email to