From 59008d86e5a87c7501cdf816ebea2cc510e9e2c6 Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 7 Feb 2007 17:35:16 +0000 Subject: [PATCH] DEVEL15-windows-merge-parent-fid-20070207 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 | 4 ++-- src/WINNT/afsd/cm_dcache.c | 6 +++--- src/WINNT/afsd/cm_scache.c | 22 +++++++++++++++++++++- src/WINNT/afsd/cm_scache.h | 7 +++++-- src/WINNT/afsd/cm_vnodeops.c | 29 +++++++++++++++-------------- 5 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/WINNT/afsd/cm_callback.c b/src/WINNT/afsd/cm_callback.c index ddaa15b57..4cb7b8dc2 100644 --- a/src/WINNT/afsd/cm_callback.c +++ b/src/WINNT/afsd/cm_callback.c @@ -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); } diff --git a/src/WINNT/afsd/cm_dcache.c b/src/WINNT/afsd/cm_dcache.c index f0ca4e270..36840fb1d 100644 --- a/src/WINNT/afsd/cm_dcache.c +++ b/src/WINNT/afsd/cm_dcache.c @@ -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; } diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index fc19dc671..71968ca8a 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -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; } diff --git a/src/WINNT/afsd/cm_scache.h b/src/WINNT/afsd/cm_scache.h index 2592637dd..c9c9ec5a3 100644 --- a/src/WINNT/afsd/cm_scache.h +++ b/src/WINNT/afsd/cm_scache.h @@ -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 *); diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index 97619330b..6d33c4ae9 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -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); -- 2.39.5