]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
DEVEL15-windows-merge-parent-fid-20070207
authorJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 7 Feb 2007 17:35:16 +0000 (17:35 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Wed, 7 Feb 2007 17:35:16 +0000 (17:35 +0000)
modify cm_MergeStatus to take a pointer to the parent stat cache entry
so that the parent fid can be set when bulk status returns an error.

(cherry picked from commit 0cc59928b980fbd89e3ed06e04474762655791ef)

src/WINNT/afsd/cm_callback.c
src/WINNT/afsd/cm_dcache.c
src/WINNT/afsd/cm_scache.c
src/WINNT/afsd/cm_scache.h
src/WINNT/afsd/cm_vnodeops.c

index ddaa15b57c51cb9c81cdf1256aabf4402bfc13e4..4cb7b8dc26fd2a00df4a0c66d35f359245e632c4 100644 (file)
@@ -1651,7 +1651,7 @@ long cm_GetCallback(cm_scache_t *scp, struct cm_user *userp,
             lock_ReleaseMutex(&cm_Freelance_Lock);
 
             // Fetch the status info 
-            cm_MergeStatus(scp, &afsStatus, &volSync, userp, 0);
+            cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, 0);
 
             // Indicate that the callback is not done
             lock_ObtainMutex(&cm_Freelance_Lock);
@@ -1719,7 +1719,7 @@ long cm_GetCallback(cm_scache_t *scp, struct cm_user *userp,
         lock_ObtainMutex(&scp->mx);
         if (code == 0) {
             cm_EndCallbackGrantingCall(scp, &cbr, &callback, 0);
-            cm_MergeStatus(scp, &afsStatus, &volSync, userp, 0);
+            cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, 0);
         } else {
             cm_EndCallbackGrantingCall(NULL, &cbr, NULL, 0);
         }
index f0ca4e270ec2f4a572c71543035c75e9bde19d99..36840fb1d09792ce63c16027f100669c9897537f 100644 (file)
@@ -297,7 +297,7 @@ long cm_BufWrite(void *vscp, osi_hyper_t *offsetp, long length, long flags,
         if (LargeIntegerGreaterThanOrEqualTo(t, scp->length))
             scp->mask &= ~CM_SCACHEMASK_LENGTH;
 
-        cm_MergeStatus(scp, &outStatus, &volSync, userp, CM_MERGEFLAG_STOREDATA);
+        cm_MergeStatus(NULL, scp, &outStatus, &volSync, userp, CM_MERGEFLAG_STOREDATA);
     } else {
         if (code == CM_ERROR_SPACE)
             scp->flags |= CM_SCACHEFLAG_OUTOFSPACE;
@@ -420,7 +420,7 @@ long cm_StoreMini(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp)
 
         if (LargeIntegerGreaterThanOrEqualTo(t, scp->length))
             scp->mask &= ~CM_SCACHEMASK_LENGTH;
-        cm_MergeStatus(scp, &outStatus, &volSync, userp, CM_MERGEFLAG_STOREDATA);
+        cm_MergeStatus(NULL, scp, &outStatus, &volSync, userp, CM_MERGEFLAG_STOREDATA);
     }
 
     return code;
@@ -1656,7 +1656,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *up,
     lock_ObtainMutex(&scp->mx);
 
     if (code == 0) 
-        cm_MergeStatus(scp, &afsStatus, &volSync, up, 0);
+        cm_MergeStatus(NULL, scp, &afsStatus, &volSync, up, 0);
     
     return code;
 }
index fc19dc6712caea8b1aa7b20ce958f816de33f1af..71968ca8af8a7c1e6ada55eebb9569167528d985 100644 (file)
@@ -1281,7 +1281,9 @@ void cm_SyncOpDone(cm_scache_t *scp, cm_buf_t *bufp, afs_uint32 flags)
  * handled after the callback breaking is done, but only one of whose calls
  * started before that, can cause old info to be merged from the first call.
  */
-void cm_MergeStatus(cm_scache_t *scp, AFSFetchStatus *statusp, AFSVolSync *volp,
+void cm_MergeStatus(cm_scache_t *dscp, 
+                   cm_scache_t *scp, AFSFetchStatus *statusp, 
+                   AFSVolSync *volsyncp,
                     cm_user_t *userp, afs_uint32 flags)
 {
     // yj: i want to create some fake status for the /afs directory and the
@@ -1315,6 +1317,24 @@ void cm_MergeStatus(cm_scache_t *scp, AFSFetchStatus *statusp, AFSVolSync *volp,
     if (statusp->errorCode != 0) {     
        scp->flags |= CM_SCACHEFLAG_EACCESS;
        osi_Log2(afsd_logp, "Merge, Failure scp %x code 0x%x", scp, statusp->errorCode);
+
+       scp->serverModTime = 0;
+       scp->clientModTime = 0;
+       scp->length.LowPart = 0;
+       scp->length.HighPart = 0;
+       scp->serverLength.LowPart = 0;
+       scp->serverLength.HighPart = 0;
+       scp->linkCount = 0;
+       scp->owner = 0;
+       scp->group = 0;
+       scp->unixModeBits = 0;
+       scp->anyAccess = 0;
+       scp->dataVersion = 0;
+
+       scp->parentVnode = dscp->fid.vnode;
+       scp->parentUnique = dscp->fid.unique;
+
+       return;
     } else {
        scp->flags &= ~CM_SCACHEFLAG_EACCESS;
     }
index 2592637ddc4b74b4f3e8eb791614ab9d7eb9bc6e..c9c9ec5a348a5d93f0133dacb2982f88de0d4bea 100644 (file)
@@ -328,8 +328,11 @@ extern long cm_SyncOp(cm_scache_t *, struct cm_buf *, struct cm_user *,
 
 extern void cm_SyncOpDone(cm_scache_t *, struct cm_buf *, afs_uint32);
 
-extern void cm_MergeStatus(cm_scache_t *, struct AFSFetchStatus *, struct AFSVolSync *,
-       struct cm_user *, afs_uint32 flags);
+extern void cm_MergeStatus(cm_scache_t * dscp, cm_scache_t * scp, 
+                          struct AFSFetchStatus * statusp, 
+                          struct AFSVolSync * volsyncp,
+                          struct cm_user *userp, 
+                          afs_uint32 flags);
 
 extern void cm_AFSFidFromFid(struct AFSFid *, cm_fid_t *);
 
index 97619330b9c0fe61afd012e23adacffc5b1a1a87..6d33c4ae9076deaa180d6270c7e55c7eb6421ea0 100644 (file)
@@ -1404,7 +1404,7 @@ long cm_Unlink(cm_scache_t *dscp, char *namep, cm_user_t *userp, cm_req_t *reqp)
     cm_dnlcRemove(dscp, namep);
     cm_SyncOpDone(dscp, NULL, sflags);
     if (code == 0) 
-        cm_MergeStatus(dscp, &newDirStatus, &volSync, userp, 0);
+        cm_MergeStatus(NULL, dscp, &newDirStatus, &volSync, userp, 0);
     else if (code == CM_ERROR_NOSUCHFILE) {
        /* windows would not have allowed the request to delete the file 
         * if it did not believe the file existed.  therefore, we must 
@@ -2102,7 +2102,7 @@ cm_TryBulkStat(cm_scache_t *dscp, osi_hyper_t *offsetp, cm_user_t *userp,
                 cm_EndCallbackGrantingCall(scp, &cbReq,
                                             &bb.callbacks[j],
                                             CM_CALLBACK_MAINTAINCOUNT);
-                cm_MergeStatus(scp, &bb.stats[j], &volSync, userp, 0);
+                cm_MergeStatus(dscp, scp, &bb.stats[j], &volSync, userp, 0);
             }       
             lock_ReleaseMutex(&scp->mx);
             cm_ReleaseSCache(scp);
@@ -2312,13 +2312,14 @@ long cm_SetAttr(cm_scache_t *scp, cm_attr_t *attrp, cm_user_t *userp,
     lock_ObtainMutex(&scp->mx);
     cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_STORESTATUS);
     if (code == 0)
-        cm_MergeStatus(scp, &afsOutStatus, &volSync, userp,
+        cm_MergeStatus(NULL, scp, &afsOutStatus, &volSync, userp,
                         CM_MERGEFLAG_FORCE|CM_MERGEFLAG_STOREDATA);
        
     /* if we're changing the mode bits, discard the ACL cache, 
      * since we changed the mode bits.
      */
-    if (afsInStatus.Mask & AFS_SETMODE) cm_FreeAllACLEnts(scp);
+    if (afsInStatus.Mask & AFS_SETMODE) 
+       cm_FreeAllACLEnts(scp);
     lock_ReleaseMutex(&scp->mx);
     return code;
 }       
@@ -2395,7 +2396,7 @@ long cm_Create(cm_scache_t *dscp, char *namep, long flags, cm_attr_t *attrp,
     lock_ObtainMutex(&dscp->mx);
     cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA);
     if (code == 0) {
-        cm_MergeStatus(dscp, &updatedDirStatus, &volSync, userp, 0);
+        cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, 0);
     }
     lock_ReleaseMutex(&dscp->mx);
 
@@ -2414,7 +2415,7 @@ long cm_Create(cm_scache_t *dscp, char *namep, long flags, cm_attr_t *attrp,
             lock_ObtainMutex(&scp->mx);
            scp->creator = userp;               /* remember who created it */
             if (!cm_HaveCallback(scp)) {
-                cm_MergeStatus(scp, &newFileStatus, &volSync,
+                cm_MergeStatus(dscp, scp, &newFileStatus, &volSync,
                                 userp, 0);
                 cm_EndCallbackGrantingCall(scp, &cbReq,
                                             &newFileCallback, 0);
@@ -2529,7 +2530,7 @@ long cm_MakeDir(cm_scache_t *dscp, char *namep, long flags, cm_attr_t *attrp,
     lock_ObtainMutex(&dscp->mx);
     cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA);
     if (code == 0) {
-        cm_MergeStatus(dscp, &updatedDirStatus, &volSync, userp, 0);
+        cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, 0);
     }
     lock_ReleaseMutex(&dscp->mx);
 
@@ -2547,7 +2548,7 @@ long cm_MakeDir(cm_scache_t *dscp, char *namep, long flags, cm_attr_t *attrp,
         if (code == 0) {
             lock_ObtainMutex(&scp->mx);
             if (!cm_HaveCallback(scp)) {
-                cm_MergeStatus(scp, &newDirStatus, &volSync,
+                cm_MergeStatus(dscp, scp, &newDirStatus, &volSync,
                                 userp, 0);
                 cm_EndCallbackGrantingCall(scp, &cbReq,
                                             &newDirCallback, 0);
@@ -2623,7 +2624,7 @@ long cm_Link(cm_scache_t *dscp, char *namep, cm_scache_t *sscp, long flags,
     lock_ObtainMutex(&dscp->mx);
     cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA);
     if (code == 0) {
-        cm_MergeStatus(dscp, &updatedDirStatus, &volSync, userp, 0);
+        cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, 0);
     }
     lock_ReleaseMutex(&dscp->mx);
 
@@ -2687,7 +2688,7 @@ long cm_SymLink(cm_scache_t *dscp, char *namep, char *contentsp, long flags,
     lock_ObtainMutex(&dscp->mx);
     cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA);
     if (code == 0) {
-        cm_MergeStatus(dscp, &updatedDirStatus, &volSync, userp, 0);
+        cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, 0);
     }
     lock_ReleaseMutex(&dscp->mx);
 
@@ -2705,7 +2706,7 @@ long cm_SymLink(cm_scache_t *dscp, char *namep, char *contentsp, long flags,
         if (code == 0) {
             lock_ObtainMutex(&scp->mx);
             if (!cm_HaveCallback(scp)) {
-                cm_MergeStatus(scp, &newLinkStatus, &volSync,
+                cm_MergeStatus(dscp, scp, &newLinkStatus, &volSync,
                                 userp, 0);
             }       
             lock_ReleaseMutex(&scp->mx);
@@ -2769,7 +2770,7 @@ long cm_RemoveDir(cm_scache_t *dscp, char *namep, cm_user_t *userp,
     cm_SyncOpDone(dscp, NULL, CM_SCACHESYNC_STOREDATA);
     if (code == 0) {
         cm_dnlcRemove(dscp, namep); 
-        cm_MergeStatus(dscp, &updatedDirStatus, &volSync, userp, 0);
+        cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, 0);
     }
     lock_ReleaseMutex(&dscp->mx);
 
@@ -2926,7 +2927,7 @@ long cm_Rename(cm_scache_t *oldDscp, char *oldNamep, cm_scache_t *newDscp,
     lock_ObtainMutex(&oldDscp->mx);
     cm_SyncOpDone(oldDscp, NULL, CM_SCACHESYNC_STOREDATA);
     if (code == 0) {
-        cm_MergeStatus(oldDscp, &updatedOldDirStatus, &volSync,
+        cm_MergeStatus(NULL, oldDscp, &updatedOldDirStatus, &volSync,
                         userp, 0);
     }
     lock_ReleaseMutex(&oldDscp->mx);
@@ -2936,7 +2937,7 @@ long cm_Rename(cm_scache_t *oldDscp, char *oldNamep, cm_scache_t *newDscp,
         lock_ObtainMutex(&newDscp->mx);
         cm_SyncOpDone(newDscp, NULL, CM_SCACHESYNC_STOREDATA);
         if (code == 0) {
-            cm_MergeStatus(newDscp, &updatedNewDirStatus, &volSync,
+            cm_MergeStatus(NULL, newDscp, &updatedNewDirStatus, &volSync,
                             userp, 0);
         }
         lock_ReleaseMutex(&newDscp->mx);