windows-bulkstat-eaccess-20060628
[openafs.git] / src / WINNT / afsd / cm_scache.c
index cb28ef7..b791099 100644 (file)
@@ -551,6 +551,7 @@ long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp,
 
         lock_ObtainMutex(&cm_Freelance_Lock);
         scp->length.LowPart = (DWORD)strlen(mp)+4;
+        scp->length.HighPart = 0;
         strncpy(scp->mountPointStringp,mp,MOUNTPOINTLEN);
         scp->mountPointStringp[MOUNTPOINTLEN-1] = '\0';
         lock_ReleaseMutex(&cm_Freelance_Lock);
@@ -940,13 +941,13 @@ long cm_SyncOp(cm_scache_t *scp, cm_buf_t *bufp, cm_user_t *userp, cm_req_t *req
                 /* we don't know the required access rights */
                 if (bufLocked) lock_ReleaseMutex(&bufp->mx);
                 code = cm_GetAccessRights(scp, userp, reqp);
-                if (code) 
-                    return code;
                 if (bufLocked) {
                     lock_ReleaseMutex(&scp->mx);
                     lock_ObtainMutex(&bufp->mx);
                     lock_ObtainMutex(&scp->mx);
                 }
+                if (code) 
+                    return code;
                 continue;
             }
         }
@@ -1148,6 +1149,7 @@ void cm_MergeStatus(cm_scache_t *scp, AFSFetchStatus *statusp, AFSVolSync *volp,
         statusp->FileType = CM_SCACHETYPE_DIRECTORY;
         statusp->LinkCount = scp->linkCount;
         statusp->Length = cm_fakeDirSize;
+        statusp->Length_hi = 0;
         statusp->DataVersion = cm_data.fakeDirVersion;
         statusp->Author = 0x1;
         statusp->Owner = 0x0;
@@ -1162,9 +1164,18 @@ void cm_MergeStatus(cm_scache_t *scp, AFSFetchStatus *statusp, AFSVolSync *volp,
         statusp->Group = 0;
         statusp->SyncCounter = 0;
         statusp->dataVersionHigh = 0;
+       statusp->errorCode = 0;
     }
 #endif /* AFS_FREELANCE_CLIENT */
 
+    if (statusp->errorCode != 0) {     
+       scp->flags |= CM_SCACHEFLAG_EACCESS;
+       osi_Log2(afsd_logp, "Merge, Failure scp %x code 0x%x", scp, statusp->errorCode);
+       return;
+    } else {
+       scp->flags &= ~CM_SCACHEFLAG_EACCESS;
+    }
+
     if (!(flags & CM_MERGEFLAG_FORCE)
          && statusp->DataVersion < (unsigned long) scp->dataVersion) {
         struct cm_cell *cellp;
@@ -1220,11 +1231,11 @@ void cm_MergeStatus(cm_scache_t *scp, AFSFetchStatus *statusp, AFSVolSync *volp,
     }
     if (!(scp->mask & CM_SCACHEMASK_LENGTH)) {
         scp->length.LowPart = statusp->Length;
-        scp->length.HighPart = 0;
+        scp->length.HighPart = statusp->Length_hi;
     }
 
     scp->serverLength.LowPart = statusp->Length;
-    scp->serverLength.HighPart = 0;
+    scp->serverLength.HighPart = statusp->Length_hi;
 
     scp->linkCount = statusp->LinkCount;
     scp->dataVersion = statusp->DataVersion;
@@ -1243,8 +1254,8 @@ void cm_MergeStatus(cm_scache_t *scp, AFSFetchStatus *statusp, AFSVolSync *volp,
             scp->fileType = CM_SCACHETYPE_SYMLINK;
     }       
     else {
-        osi_Log1(afsd_logp, "Merge, Invalid File Type, scp %x", scp);
-        scp->fileType = 0;     /* invalid */
+        osi_Log2(afsd_logp, "Merge, Invalid File Type (%d), scp %x", statusp->FileType, scp);
+        scp->fileType = CM_SCACHETYPE_INVALID; /* invalid */
     }
     /* and other stuff */
     scp->parentVnode = statusp->ParentVnode;