windows-undo-20050531
[openafs.git] / src / WINNT / afsd / cm_dcache.c
index 274c61e..d5d7c70 100644 (file)
@@ -56,6 +56,7 @@ long cm_BufWrite(void *vfidp, osi_hyper_t *offsetp, long length, long flags,
     AFSVolSync volSync;
     AFSFid tfid;
     struct rx_call *callp;
+    struct rx_connection *rxconnp;
     osi_queueData_t *qdp;
     cm_buf_t *bufp;
     long wbytes;
@@ -129,11 +130,11 @@ long cm_BufWrite(void *vfidp, osi_hyper_t *offsetp, long length, long flags,
         if (code) 
             continue;
                
-        lock_ObtainMutex(&connp->mx);
-        callp = rx_NewCall(connp->callp);
-        lock_ReleaseMutex(&connp->mx);
+        rxconnp = cm_GetRxConn(connp);
+        callp = rx_NewCall(rxconnp);
+        rx_PutConnection(rxconnp);
 
-        osi_Log3(afsd_logp, "CALL StoreData vp %x, off 0x%x, size 0x%x",
+        osi_Log3(afsd_logp, "CALL StoreData scp 0x%x, off 0x%x, size 0x%x",
                  (long) scp, biod.offset.LowPart, nbytes);
 
         code = StartRXAFS_StoreData(callp, &tfid, &inStatus,
@@ -151,8 +152,8 @@ long cm_BufWrite(void *vfidp, osi_hyper_t *offsetp, long length, long flags,
                 bufp = osi_GetQData(qdp);
                 bufferp = bufp->datap;
                 wbytes = nbytes;
-                if (wbytes > buf_bufferSize) 
-                    wbytes = buf_bufferSize;
+                if (wbytes > cm_data.buf_blockSize) 
+                    wbytes = cm_data.buf_blockSize;
 
                 /* write out wbytes of data from bufferp */
                 temp = rx_Write(callp, bufferp, wbytes);
@@ -175,11 +176,15 @@ long cm_BufWrite(void *vfidp, osi_hyper_t *offsetp, long length, long flags,
                 osi_Log1(afsd_logp, "EndRXAFS_StoreData failed (%lX)",code);
         }
         code = rx_EndCall(callp, code);
-        osi_Log0(afsd_logp, "CALL StoreData DONE");
                 
     } while (cm_Analyze(connp, userp, reqp, &scp->fid, &volSync, NULL, NULL, code));
     code = cm_MapRPCError(code, reqp);
         
+    if (code)
+        osi_Log1(afsd_logp, "CALL StoreData FAILURE, code 0x%x", code);
+    else
+        osi_Log0(afsd_logp, "CALL StoreData SUCCESS");
+
     /* now, clean up our state */
     lock_ObtainMutex(&scp->mx);
 
@@ -235,6 +240,7 @@ long cm_StoreMini(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp)
     long truncPos;
     cm_conn_t *connp;
     struct rx_call *callp;
+    struct rx_connection *rxconnp;
 
     /* Serialize StoreData RPC's; for rationale see cm_scache.c */
     (void) cm_SyncOp(scp, NULL, userp, reqp, 0,
@@ -262,9 +268,9 @@ long cm_StoreMini(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp)
         if (code) 
             continue;
                
-        lock_ObtainMutex(&connp->mx);
-        callp = rx_NewCall(connp->callp);
-        lock_ReleaseMutex(&connp->mx);
+        rxconnp = cm_GetRxConn(connp);
+        callp = rx_NewCall(rxconnp);
+        rx_PutConnection(rxconnp);
 
         code = StartRXAFS_StoreData(callp, &tfid, &inStatus,
                                     0, 0, truncPos);
@@ -296,7 +302,7 @@ long cm_StoreMini(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp)
 
 long cm_BufRead(cm_buf_t *bufp, long nbytes, long *bytesReadp, cm_user_t *userp)
 {
-    *bytesReadp = buf_bufferSize;
+    *bytesReadp = cm_data.buf_blockSize;
 
     /* now return a code that means that I/O is done */
     return 0;
@@ -343,12 +349,20 @@ cm_buf_ops_t cm_bufOps = {
     cm_BufUnstabilize
 };
 
-int cm_InitDCache(long chunkSize, long nbuffers)
+long cm_ValidateDCache(void)
+{
+    return buf_ValidateBuffers();
+}
+
+long cm_ShutdownDCache(void)
+{
+    return 0;
+}
+
+int cm_InitDCache(int newFile, long chunkSize, long nbuffers)
 {
     lock_InitializeMutex(&cm_bufGetMutex, "buf_Get mutex");
-    if (nbuffers) 
-        buf_nbuffers = nbuffers;
-    return buf_Init(&cm_bufOps);
+    return buf_Init(newFile, &cm_bufOps, nbuffers);
 }
 
 /* check to see if we have an up-to-date buffer.  The buffer must have
@@ -444,10 +458,10 @@ long cm_CheckFetchRange(cm_scache_t *scp, osi_hyper_t *startBasep, long length,
         if (stop) 
             break;
                 
-        toffset.LowPart = buf_bufferSize;
+        toffset.LowPart = cm_data.buf_blockSize;
         toffset.HighPart = 0;
         tbase = LargeIntegerAdd(toffset, tbase);
-        length -= buf_bufferSize;
+        length -= cm_data.buf_blockSize;
     }
         
     /* if we get here, either everything is fine or stop stopped us at a
@@ -623,11 +637,11 @@ long cm_SetupStoreBIOD(cm_scache_t *scp, osi_hyper_t *inOffsetp, long inSize,
 
     /* reserve a chunk's worth of buffers */
     lock_ReleaseMutex(&scp->mx);
-    buf_ReserveBuffers(cm_chunkSize / buf_bufferSize);
+    buf_ReserveBuffers(cm_chunkSize / cm_data.buf_blockSize);
     lock_ObtainMutex(&scp->mx);
 
     bufp = NULL;
-    for (temp = 0; temp < inSize; temp += buf_bufferSize, bufp = NULL) {
+    for (temp = 0; temp < inSize; temp += cm_data.buf_blockSize, bufp = NULL) {
         thyper.HighPart = 0;
         thyper.LowPart = temp;
         tbase = LargeIntegerAdd(*inOffsetp, thyper);
@@ -647,7 +661,7 @@ long cm_SetupStoreBIOD(cm_scache_t *scp, osi_hyper_t *inOffsetp, long inSize,
             if (code) {
                 lock_ReleaseMutex(&bufp->mx);
                 buf_Release(bufp);
-                buf_UnreserveBuffers(cm_chunkSize / buf_bufferSize);
+                buf_UnreserveBuffers(cm_chunkSize / cm_data.buf_blockSize);
                 return code;
             }   
                         
@@ -685,7 +699,7 @@ long cm_SetupStoreBIOD(cm_scache_t *scp, osi_hyper_t *inOffsetp, long inSize,
     osi_QAddH((osi_queue_t **) &biop->bufListp,
               (osi_queue_t **) &biop->bufListEndp,
               &qdp->q);
-    biop->length = buf_bufferSize;
+    biop->length = cm_data.buf_blockSize;
     firstModOffset = bufp->offset;
     biop->offset = firstModOffset;
 
@@ -703,8 +717,8 @@ long cm_SetupStoreBIOD(cm_scache_t *scp, osi_hyper_t *inOffsetp, long inSize,
         | CM_SCACHESYNC_NOWAIT;
 
     /* start by looking backwards until scanStart */
-    thyper.HighPart = 0;               /* hyper version of buf_bufferSize */
-    thyper.LowPart = buf_bufferSize;
+    thyper.HighPart = 0;               /* hyper version of cm_data.buf_blockSize */
+    thyper.LowPart = cm_data.buf_blockSize;
     tbase = LargeIntegerSubtract(firstModOffset, thyper);
     while(LargeIntegerGreaterThanOrEqualTo(tbase, scanStart)) {
         /* see if we can find the buffer */
@@ -713,7 +727,9 @@ long cm_SetupStoreBIOD(cm_scache_t *scp, osi_hyper_t *inOffsetp, long inSize,
             break;
 
         /* try to lock it, and quit if we can't (simplifies locking) */
+        lock_ReleaseMutex(&scp->mx);
         code = lock_TryMutex(&bufp->mx);
+        lock_ObtainMutex(&scp->mx);
         if (code == 0) {
             buf_Release(bufp);
             break;
@@ -750,15 +766,15 @@ long cm_SetupStoreBIOD(cm_scache_t *scp, osi_hyper_t *inOffsetp, long inSize,
 
         /* update biod info describing the transfer */
         biop->offset = LargeIntegerSubtract(biop->offset, thyper);
-        biop->length += buf_bufferSize;
+        biop->length += cm_data.buf_blockSize;
 
         /* update loop pointer */
         tbase = LargeIntegerSubtract(tbase, thyper);
     }  /* while loop looking for pages preceding the one we found */
 
     /* now, find later dirty, contiguous pages, and add them to the list */
-    thyper.HighPart = 0;               /* hyper version of buf_bufferSize */
-    thyper.LowPart = buf_bufferSize;
+    thyper.HighPart = 0;               /* hyper version of cm_data.buf_blockSize */
+    thyper.LowPart = cm_data.buf_blockSize;
     tbase = LargeIntegerAdd(firstModOffset, thyper);
     while(LargeIntegerLessThan(tbase, scanEnd)) {
         /* see if we can find the buffer */
@@ -767,7 +783,9 @@ long cm_SetupStoreBIOD(cm_scache_t *scp, osi_hyper_t *inOffsetp, long inSize,
             break;
 
         /* try to lock it, and quit if we can't (simplifies locking) */
+        lock_ReleaseMutex(&scp->mx);
         code = lock_TryMutex(&bufp->mx);
+        lock_ObtainMutex(&scp->mx);
         if (code == 0) {
             buf_Release(bufp);
             break;
@@ -803,7 +821,7 @@ long cm_SetupStoreBIOD(cm_scache_t *scp, osi_hyper_t *inOffsetp, long inSize,
                   &qdp->q);
 
         /* update biod info describing the transfer */
-        biop->length += buf_bufferSize;
+        biop->length += cm_data.buf_blockSize;
                 
         /* update loop pointer */
         tbase = LargeIntegerAdd(tbase, thyper);
@@ -876,35 +894,37 @@ long cm_SetupFetchBIOD(cm_scache_t *scp, osi_hyper_t *offsetp,
      * sequence at a time.
      */
 
+    // lock_ObtainMutex(&cm_bufGetMutex);
     /* first hold all buffers, since we can't hold any locks in buf_Get */
     while (1) {
         /* stop at chunk boundary */
-        if (collected >= cm_chunkSize) break;
+        if (collected >= cm_chunkSize) 
+            break;
                 
         /* see if the next page would be past EOF */
-        if (LargeIntegerGreaterThanOrEqualTo(pageBase, fileSize)) break;
-
-        lock_ObtainMutex(&cm_bufGetMutex);
+        if (LargeIntegerGreaterThanOrEqualTo(pageBase, fileSize)) 
+            break;
 
         code = buf_Get(scp, &pageBase, &tbp);
         if (code) {
             lock_ReleaseMutex(&cm_bufGetMutex);
             lock_ObtainMutex(&scp->mx);
+            cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
             return code;
         }
                 
         buf_Release(tbp);
 
-        lock_ReleaseMutex(&cm_bufGetMutex);
-
         toffset.HighPart = 0;
-        toffset.LowPart = buf_bufferSize;
+        toffset.LowPart = cm_data.buf_blockSize;
         pageBase = LargeIntegerAdd(toffset, pageBase);
-        collected += buf_bufferSize;
+        collected += cm_data.buf_blockSize;
     }
 
     /* reserve a chunk's worth of buffers if possible */
-    reserving = buf_TryReserveBuffers(cm_chunkSize / buf_bufferSize);
+    reserving = buf_TryReserveBuffers(cm_chunkSize / cm_data.buf_blockSize);
+
+    // lock_ReleaseMutex(&cm_bufGetMutex);
 
     pageBase = *offsetp;
     collected = pageBase.LowPart & (cm_chunkSize - 1);
@@ -933,9 +953,9 @@ long cm_SetupFetchBIOD(cm_scache_t *scp, osi_hyper_t *offsetp,
         if (!reserving) 
             break;
 
-        collected += buf_bufferSize;
+        collected += cm_data.buf_blockSize;
         toffset.HighPart = 0;
-        toffset.LowPart = buf_bufferSize;
+        toffset.LowPart = cm_data.buf_blockSize;
         pageBase = LargeIntegerAdd(toffset, pageBase);
     }
 
@@ -1004,7 +1024,7 @@ long cm_SetupFetchBIOD(cm_scache_t *scp, osi_hyper_t *offsetp,
          * we still do the I/O to whatever we've already managed to collect.
          */
         isFirst = 0;
-        collected += buf_bufferSize;
+        collected += cm_data.buf_blockSize;
     }
         
     /* now, we've held in biop->bufListp all the buffer's we're really
@@ -1026,7 +1046,7 @@ long cm_SetupFetchBIOD(cm_scache_t *scp, osi_hyper_t *offsetp,
      * caller requires to make any progress.  Give up now.
      */
     if (code && isFirst) {
-        buf_UnreserveBuffers(cm_chunkSize / buf_bufferSize);
+        buf_UnreserveBuffers(cm_chunkSize / cm_data.buf_blockSize);
         return code;
     }
         
@@ -1051,7 +1071,7 @@ void cm_ReleaseBIOD(cm_bulkIO_t *biop, int isStore)
 
     /* Give back reserved buffers */
     if (biop->reserved)
-        buf_UnreserveBuffers(cm_chunkSize / buf_bufferSize);
+        buf_UnreserveBuffers(cm_chunkSize / cm_data.buf_blockSize);
         
     flags = CM_SCACHESYNC_NEEDCALLBACK;
     if (isStore)
@@ -1109,6 +1129,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *up,
     osi_queueData_t *qdp;              /* q element we're scanning */
     AFSFid tfid;
     struct rx_call *callp;
+    struct rx_connection *rxconnp;
     cm_bulkIO_t biod;          /* bulk IO descriptor */
     cm_conn_t *connp;
     int getroot;
@@ -1125,9 +1146,9 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *up,
     // handle it differently, since it's local rather than on any
     // server
 
-    getroot = (scp==cm_rootSCachep);
+    getroot = (scp==cm_data.rootSCachep);
     if (getroot)
-        osi_Log1(afsd_logp,"GetBuffer returns cm_rootSCachep=%x",cm_rootSCachep);
+        osi_Log1(afsd_logp,"GetBuffer returns cm_data.rootSCachep=%x",cm_data.rootSCachep);
 #endif
 
     cm_AFSFidFromFid(&tfid, &scp->fid);
@@ -1154,7 +1175,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *up,
              && LargeIntegerGreaterThanOrEqualTo(bufp->offset,
                                                  scp->serverLength)) {
             if (bufp->dataVersion == -1)
-                memset(bufp->datap, 0, buf_bufferSize);
+                memset(bufp->datap, 0, cm_data.buf_blockSize);
             bufp->dataVersion = scp->dataVersion;
         }
         lock_ReleaseMutex(&scp->mx);
@@ -1182,7 +1203,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *up,
         afsStatus.FileType = 0x2;
         afsStatus.LinkCount = scp->linkCount;
         afsStatus.Length = cm_fakeDirSize;
-        afsStatus.DataVersion = scp->dataVersion;
+        afsStatus.DataVersion = cm_data.fakeDirVersion;
         afsStatus.Author = 0x1;
         afsStatus.Owner = 0x0;
         afsStatus.CallerAccess = 0x9;
@@ -1191,11 +1212,14 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *up,
         afsStatus.ParentVnode = 0x1;
         afsStatus.ParentUnique = 0x1;
         afsStatus.ResidencyMask = 0;
-        afsStatus.ClientModTime = FakeFreelanceModTime;
-        afsStatus.ServerModTime = FakeFreelanceModTime;
+        afsStatus.ClientModTime = (afs_uint32)FakeFreelanceModTime;
+        afsStatus.ServerModTime = (afs_uint32)FakeFreelanceModTime;
         afsStatus.Group = 0;
         afsStatus.SyncCounter = 0;
         afsStatus.dataVersionHigh = 0;
+        afsStatus.lockCount = 0;
+        afsStatus.Length_hi = 0;
+        afsStatus.errorCode = 0;
        
         // once we're done setting up the status info,
         // we just fill the buffer pages with fakedata
@@ -1208,9 +1232,9 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *up,
         while (qdp) {
             tbufp = osi_GetQData(qdp);
             bufferp=tbufp->datap;
-            memset(bufferp, 0, buf_bufferSize);
+            memset(bufferp, 0, cm_data.buf_blockSize);
             t2 = cm_fakeDirSize - t1;
-            if (t2>buf_bufferSize) t2=buf_bufferSize;
+            if (t2>cm_data.buf_blockSize) t2=cm_data.buf_blockSize;
             if (t2 > 0) {
                 memcpy(bufferp, cm_FakeRootDir+t1, t2);
             } else {
@@ -1236,10 +1260,10 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *up,
         code = cm_Conn(&scp->fid, up, reqp, &connp);
         if (code) 
             continue;
-               
-        lock_ObtainMutex(&connp->mx);
-        callp = rx_NewCall(connp->callp);
-        lock_ReleaseMutex(&connp->mx);
+       
+        rxconnp = cm_GetRxConn(connp);
+        callp = rx_NewCall(rxconnp);
+        rx_PutConnection(rxconnp);
 
         osi_Log3(afsd_logp, "CALL FetchData vp %x, off 0x%x, size 0x%x",
                   (long) scp, biod.offset.LowPart, biod.length);
@@ -1280,7 +1304,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *up,
                 osi_assert(bufferp != NULL);
 
                 /* read rbytes of data */
-                rbytes = (nbytes > buf_bufferSize? buf_bufferSize : nbytes);
+                rbytes = (nbytes > cm_data.buf_blockSize? cm_data.buf_blockSize : nbytes);
                 temp = rx_Read(callp, bufferp, rbytes);
                 if (temp < rbytes) {
                     code = (callp->error < 0) ? callp->error : -1;
@@ -1329,7 +1353,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *up,
             /* bytes fetched */
             rbytes = bufferp - tbufp->datap;
             /* bytes left to zero */
-            rbytes = buf_bufferSize - rbytes;
+            rbytes = cm_data.buf_blockSize - rbytes;
             while(qdp) {
                 if (rbytes != 0)
                     memset(bufferp, 0, rbytes);
@@ -1339,7 +1363,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *up,
                 tbufp = osi_GetQData(qdp);
                 bufferp = tbufp->datap;
                 /* bytes to clear in this page */
-                rbytes = buf_bufferSize;
+                rbytes = cm_data.buf_blockSize;
             }   
         }
 
@@ -1358,6 +1382,9 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *up,
     code = cm_MapRPCError(code, reqp);
 
     lock_ObtainMutex(&scp->mx);
+    
+    cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_FETCHSTATUS);
+
     /* we know that no one else has changed the buffer, since we still have
      * the fetching flag on the buffers, and we have the scp locked again.
      * Copy in the version # into the buffer if we got code 0 back from the
@@ -1372,7 +1399,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *up,
 
 #ifdef DISKCACHE95
             /* write buffer out to disk cache */
-            diskcache_Update(tbufp->dcp, tbufp->datap, buf_bufferSize,
+            diskcache_Update(tbufp->dcp, tbufp->datap, cm_data.buf_blockSize,
                               tbufp->dataVersion);
 #endif /* DISKCACHE95 */
         }