Windows: cm_MergeStatus use new DV to purge buffers
[openafs.git] / src / WINNT / afsd / cm_scache.c
index b5666ad..1a8def9 100644 (file)
@@ -753,7 +753,6 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp,
             scp = cm_GetNewSCache(FALSE);    /* returns scp->rw held */
             if (scp == NULL) {
                 osi_Log0(afsd_logp,"cm_GetSCache unable to obtain *new* scache entry");
-                lock_ReleaseWrite(&cm_scacheLock);
                 return CM_ERROR_WOULDBLOCK;
             }
         } else {
@@ -1568,7 +1567,6 @@ void cm_MergeStatus(cm_scache_t *dscp,
 #endif /* AFS_FREELANCE_CLIENT */
 
     if (statusp->errorCode != 0) {
-       _InterlockedOr(&scp->flags, CM_SCACHEFLAG_EACCESS);
         switch (statusp->errorCode) {
         case EACCES:
         case UAEACCES:
@@ -1605,7 +1603,9 @@ void cm_MergeStatus(cm_scache_t *dscp,
             scp->parentVnode = 0;
             scp->parentUnique = 0;
        }
-       goto done;
+
+        if (RDR_Initialized)
+            rdr_invalidate = 1;
     } else {
        _InterlockedAnd(&scp->flags, ~CM_SCACHEFLAG_EACCESS);
     }
@@ -1710,7 +1710,7 @@ void cm_MergeStatus(cm_scache_t *dscp,
         cm_AddACLCache(scp, userp, statusp->CallerAccess);
     }
 
-    if (scp->dataVersion != 0 &&
+    if (dataVersion != 0 &&
         (!(flags & (CM_MERGEFLAG_DIROP|CM_MERGEFLAG_STOREDATA)) && dataVersion != scp->dataVersion ||
          (flags & (CM_MERGEFLAG_DIROP|CM_MERGEFLAG_STOREDATA)) && dataVersion - scp->dataVersion > activeRPCs)) {
         /*
@@ -1806,8 +1806,10 @@ void cm_MergeStatus(cm_scache_t *dscp,
          scp->bufDataVersionLow == 0)
         scp->bufDataVersionLow = dataVersion;
 
-    if (RDR_Initialized && scp->dataVersion != CM_SCACHE_VERSION_BAD) {
-        if ( ( !(reqp->flags & CM_REQ_SOURCE_REDIR) || !(flags & (CM_MERGEFLAG_DIROP|CM_MERGEFLAG_STOREDATA))) &&
+    if (RDR_Initialized) {
+        if (scp->dataVersion != CM_SCACHE_VERSION_BAD) {
+            rdr_invalidate = 1;
+        } else if ( ( !(reqp->flags & CM_REQ_SOURCE_REDIR) || !(flags & (CM_MERGEFLAG_DIROP|CM_MERGEFLAG_STOREDATA))) &&
              scp->dataVersion != dataVersion && (dataVersion - scp->dataVersion > activeRPCs - 1)) {
             rdr_invalidate = 1;
         } else if ( (reqp->flags & CM_REQ_SOURCE_REDIR) && (flags & (CM_MERGEFLAG_DIROP|CM_MERGEFLAG_STOREDATA)) &&