Index: arlad/inter.c =================================================================== RCS file: /afs/stacken.kth.se/src/SourceRepository/arla/arlad/inter.c,v retrieving revision 1.111 diff -u -r1.111 inter.c --- inter.c 2001/02/28 22:41:42 1.111 +++ inter.c 2001/03/04 02:19:41 @@ -208,19 +208,20 @@ fcache_cache_handle *cache_handle, char *cache_name, size_t cache_name_sz, - size_t length) + size_t *length) { FCacheEntry *entry; Result ret; u_long mask; int error; - error = fcache_get_data (&entry, fid, ce, length); + error = fcache_get_data (&entry, fid, ce, *length); if (error) { ret.res = -1; ret.error = error; return ret; } + *length = entry->fetched_length; switch(tokens) { case XFS_DATA_R: Index: arlad/inter.h =================================================================== RCS file: /afs/stacken.kth.se/src/SourceRepository/arla/arlad/inter.h,v retrieving revision 1.25 diff -u -r1.25 inter.h --- inter.h 2001/02/28 22:41:43 1.25 +++ inter.h 2001/03/04 02:19:56 @@ -61,7 +61,7 @@ Result cm_open (VenusFid *fid, CredCacheEntry **ce, u_int tokens, - fcache_cache_handle *, char *, size_t, size_t); + fcache_cache_handle *, char *, size_t, size_t *); Result cm_close (VenusFid fid, int flag, AFSStoreStatus *, CredCacheEntry *ce); Index: arlad/messages.c =================================================================== RCS file: /afs/stacken.kth.se/src/SourceRepository/arla/arlad/messages.c,v retrieving revision 1.237 diff -u -r1.237 messages.c --- messages.c 2001/02/28 22:41:44 1.237 +++ messages.c 2001/03/06 15:25:10 @@ -1715,6 +1715,7 @@ struct xfs_message_header *h0 = NULL; size_t h0_len = 0; fcache_cache_handle cache_handle; + size_t offset; fid = (VenusFid *)&h->handle; arla_warnx (ADEBMSG, "getdata (%ld.%lu.%lu.%lu)", @@ -1755,6 +1756,7 @@ if (ret == 0) { msg.node.tokens = res.tokens; msg.cache_handle = cache_handle.xfs_handle; + msg.offset = entry->fetched_length; msg.flag = XFS_ID_INVALID_DNLC; if (cache_handle.valid) msg.flag |= XFS_ID_HANDLE_VALID; @@ -1763,9 +1765,15 @@ } fcache_release(entry); } else { + if (h->offset) + offset = ((h->offset - 1) & ~65535) + 65536; + else + offset = 65536; + arla_warnx (ADEBMSG, " requested %d fetching %d", + h->offset, offset); do { res = cm_open (fid, &ce, h->tokens, &cache_handle, - msg.cache_name, sizeof(msg.cache_name), 0 /* XXX */); + msg.cache_name, sizeof(msg.cache_name), &offset); if (res.res) ret = res.error; else @@ -1777,6 +1785,8 @@ if (cache_handle.valid) msg.flag |= XFS_ID_HANDLE_VALID; msg.node.tokens = res.tokens; + arla_warnx (ADEBMSG, " got %d", offset); + msg.offset = offset; fcacheentry2xfsnode (fid, &real_fid, &status, &msg.node, ae, FCACHE2XFSNODE_ALL); @@ -1789,6 +1799,25 @@ h0 = (struct xfs_message_header *)&msg; h0_len = sizeof(msg); } + xfs_send_message_wakeup_multiple (fd, + h->header.sequence_num, + ret, + h0, h0_len, + NULL, 0); + + if (status.FileType == TYPE_FILE) { + offset = offset + 65536; + arla_warnx (ADEBMSG, " prefetching to %d", offset); + res = cm_open (fid, &ce, h->tokens, &cache_handle, + msg.cache_name, sizeof(msg.cache_name), &offset); + if (res.res) + ret = res.error; + else + ret = res.res; + } + + cred_free (ce); + return ret; out: cred_free (ce); Index: xfs/include/xfs/xfs_message.h =================================================================== RCS file: /afs/stacken.kth.se/src/SourceRepository/arla/xfs/include/xfs/xfs_message.h,v retrieving revision 1.45 diff -u -r1.45 xfs_message.h --- xfs_message.h 2001/02/01 03:52:19 1.45 +++ xfs_message.h 2001/03/04 02:01:10 @@ -38,7 +38,7 @@ /* bump this for any incompatible changes */ -#define XFS_VERSION 17 +#define XFS_VERSION 18 #if defined(WIN32) #ifdef i386 @@ -299,6 +299,8 @@ xfs_handle handle; u_int32_t tokens; u_int32_t pad1; + u_int32_t offset; + u_int32_t pad2; }; /* XFS_MESSAGE_INSTALLDATA */ @@ -309,6 +311,8 @@ struct xfs_cache_handle cache_handle; u_int32_t flag; u_int32_t pad1; + u_int32_t offset; + u_int32_t pad2; }; /* XFS_MSG_INACTIVENODE */