From 0cc59928b980fbd89e3ed06e04474762655791ef Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 7 Feb 2007 17:34:09 +0000 Subject: [PATCH] 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. --- 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 309c6aa1f..9d6c0a1d1 100644 --- a/src/WINNT/afsd/cm_callback.c +++ b/src/WINNT/afsd/cm_callback.c @@ -1647,7 +1647,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); @@ -1715,7 +1715,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 7c3b55421..9feaf1b1a 100644 --- a/src/WINNT/afsd/cm_dcache.c +++ b/src/WINNT/afsd/cm_dcache.c @@ -295,7 +295,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; @@ -418,7 +418,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; @@ -1654,7 +1654,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 8d32b4e72..9431712be 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -1279,7 +1279,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 @@ -1313,6 +1315,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 cb14dfe55..8d9d07829 100644 --- a/src/WINNT/afsd/cm_scache.h +++ b/src/WINNT/afsd/cm_scache.h @@ -324,8 +324,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 496cba450..bcb96c5af 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -1402,7 +1402,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 @@ -2100,7 +2100,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); @@ -2310,13 +2310,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; } @@ -2393,7 +2394,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); @@ -2412,7 +2413,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); @@ -2527,7 +2528,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); @@ -2545,7 +2546,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); @@ -2621,7 +2622,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); @@ -2685,7 +2686,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); @@ -2703,7 +2704,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); @@ -2767,7 +2768,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); @@ -2924,7 +2925,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); @@ -2934,7 +2935,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