From 45f0a9ba7f139749a969e73362194b380988116d Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Thu, 8 Nov 2012 00:24:14 -0500 Subject: [PATCH] Windows: cm_MergeStatus now returns an error code cm_MergeStatus() can fail if the AFSFetchStatus InterfaceVersion field does not have the value 0x1 as that is the only version that is defined by the protocol. The return code will be CM_ERROR_INVAL. cm_MergeStatus() returns 0 on success. Update all of the call sites. Change-Id: Iddf56f68dfa26b0f11744b905a70d7d39ad853d1 Reviewed-on: http://gerrit.openafs.org/8402 Tested-by: BuildBot Reviewed-by: Jeffrey Altman --- src/WINNT/afsd/cm_callback.c | 4 ++-- src/WINNT/afsd/cm_dcache.c | 10 ++++----- src/WINNT/afsd/cm_scache.c | 15 ++++++++------ src/WINNT/afsd/cm_scache.h | 2 +- src/WINNT/afsd/cm_vnodeops.c | 40 ++++++++++++++++++------------------ 5 files changed, 37 insertions(+), 34 deletions(-) diff --git a/src/WINNT/afsd/cm_callback.c b/src/WINNT/afsd/cm_callback.c index 5e27a843e..036fe89ba 100644 --- a/src/WINNT/afsd/cm_callback.c +++ b/src/WINNT/afsd/cm_callback.c @@ -1824,7 +1824,7 @@ long cm_GetCallback(cm_scache_t *scp, struct cm_user *userp, InterlockedIncrement(&scp->activeRPCs); // Fetch the status info - cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, reqp, 0); + code = cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, reqp, 0); } goto done; } @@ -1879,7 +1879,7 @@ long cm_GetCallback(cm_scache_t *scp, struct cm_user *userp, if (code == 0) { int lostRace = cm_EndCallbackGrantingCall(scp, &cbr, &callback, &volSync, 0); if (!lostRace) - cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, reqp, 0); + code = cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, reqp, 0); } else { cm_EndCallbackGrantingCall(NULL, &cbr, NULL, NULL, 0); InterlockedDecrement(&scp->activeRPCs); diff --git a/src/WINNT/afsd/cm_dcache.c b/src/WINNT/afsd/cm_dcache.c index 7cf934be2..6140240bb 100644 --- a/src/WINNT/afsd/cm_dcache.c +++ b/src/WINNT/afsd/cm_dcache.c @@ -418,7 +418,7 @@ long cm_BufWrite(void *vscp, osi_hyper_t *offsetp, long length, long flags, if (LargeIntegerGreaterThanOrEqualTo(t, scp->length)) _InterlockedAnd(&scp->mask, ~CM_SCACHEMASK_LENGTH); - cm_MergeStatus(NULL, scp, &outStatus, &volSync, userp, reqp, CM_MERGEFLAG_STOREDATA); + code = cm_MergeStatus(NULL, scp, &outStatus, &volSync, userp, reqp, CM_MERGEFLAG_STOREDATA); } else { InterlockedDecrement(&scp->activeRPCs); if (code == CM_ERROR_SPACE) @@ -585,7 +585,7 @@ long cm_StoreMini(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp) if (LargeIntegerGreaterThanOrEqualTo(t, scp->length)) _InterlockedAnd(&scp->mask, ~CM_SCACHEMASK_LENGTH); - cm_MergeStatus(NULL, scp, &outStatus, &volSync, userp, reqp, CM_MERGEFLAG_STOREDATA); + code = cm_MergeStatus(NULL, scp, &outStatus, &volSync, userp, reqp, CM_MERGEFLAG_STOREDATA); } else { InterlockedDecrement(&scp->activeRPCs); } @@ -2205,7 +2205,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *userp } if (code == 0) - cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, reqp, CM_MERGEFLAG_FETCHDATA); + code = cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, reqp, CM_MERGEFLAG_FETCHDATA); else InterlockedDecrement(&scp->activeRPCs); @@ -2567,7 +2567,7 @@ long cm_GetData(cm_scache_t *scp, osi_hyper_t *offsetp, char *datap, int data_le lock_ObtainWrite(&scp->rw); if (code == 0) - cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, reqp, CM_MERGEFLAG_FETCHDATA); + code = cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, reqp, CM_MERGEFLAG_FETCHDATA); else InterlockedDecrement(&scp->activeRPCs); @@ -2791,7 +2791,7 @@ cm_VerifyStoreData(cm_bulkIO_t *biod, cm_scache_t *savedScp) lock_ObtainWrite(&scp->rw); if (code == 0) - cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, reqp, CM_MERGEFLAG_FETCHDATA); + code = cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, reqp, CM_MERGEFLAG_FETCHDATA); else InterlockedDecrement(&scp->activeRPCs); diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index 44e61472d..c10de8b62 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -1623,7 +1623,7 @@ dv_diff(afs_uint64 dv1, afs_uint64 dv2) * 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 *dscp, +long cm_MergeStatus(cm_scache_t *dscp, cm_scache_t *scp, AFSFetchStatus *statusp, AFSVolSync *volsyncp, cm_user_t *userp, cm_req_t *reqp, afs_uint32 flags) @@ -1674,10 +1674,11 @@ void cm_MergeStatus(cm_scache_t *dscp, } #endif /* AFS_FREELANCE_CLIENT */ - if (statusp->InterfaceVersion != 0x1) { - osi_Log2(afsd_logp, "Merge, Failure scp 0x%p Invalid InterfaceVersion %u", - scp, statusp->InterfaceVersion); - return; + if (statusp->InterfaceVersion != 0x1 || + !(statusp->FileType > 0 && statusp->FileType <= SymbolicLink)) { + osi_Log3(afsd_logp, "Merge, Failure scp 0x%p Invalid InterfaceVersion %d FileType %d", + scp, statusp->InterfaceVersion, statusp->FileType); + return CM_ERROR_INVAL; } if (statusp->errorCode != 0) { @@ -1693,7 +1694,7 @@ void cm_MergeStatus(cm_scache_t *dscp, if (scp->fid.vnode & 0x1) scp->fileType = CM_SCACHETYPE_DIRECTORY; else - scp->fileType = 0; /* unknown */ + scp->fileType = CM_SCACHETYPE_UNKNOWN; scp->serverModTime = 0; scp->clientModTime = 0; @@ -2009,6 +2010,8 @@ void cm_MergeStatus(cm_scache_t *dscp, scp->fileType, AFS_INVALIDATE_DATA_VERSION); lock_ObtainWrite(&scp->rw); } + + return 0; } /* note that our stat cache info is incorrect, so force us eventually diff --git a/src/WINNT/afsd/cm_scache.h b/src/WINNT/afsd/cm_scache.h index b6bc8111a..c933e53e8 100644 --- a/src/WINNT/afsd/cm_scache.h +++ b/src/WINNT/afsd/cm_scache.h @@ -392,7 +392,7 @@ 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 * dscp, cm_scache_t * scp, +extern long cm_MergeStatus(cm_scache_t * dscp, cm_scache_t * scp, struct AFSFetchStatus * statusp, struct AFSVolSync * volsyncp, struct cm_user *userp, diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index a9f6eadac..eb12ee527 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -1707,7 +1707,7 @@ long cm_Unlink(cm_scache_t *dscp, fschar_t *fnamep, clientchar_t * cnamep, lock_ObtainWrite(&dscp->rw); cm_dnlcRemove(dscp, cnamep); if (code == 0) { - cm_MergeStatus(NULL, dscp, &newDirStatus, &volSync, userp, reqp, CM_MERGEFLAG_DIROP); + code = cm_MergeStatus(NULL, dscp, &newDirStatus, &volSync, userp, reqp, CM_MERGEFLAG_DIROP); invalidate = 1; if (cm_CheckDirOpForSingleChange(&dirop) && cnamep) { lock_ReleaseWrite(&dscp->rw); @@ -2575,7 +2575,7 @@ cm_TryBulkStatRPC(cm_scache_t *dscp, cm_bulkStat_t *bbp, cm_user_t *userp, cm_re CM_CALLBACK_MAINTAINCOUNT|CM_CALLBACK_BULKSTAT); InterlockedIncrement(&scp->activeRPCs); if (!lostRace) - cm_MergeStatus(dscp, scp, &bbp->stats[j], &volSync, userp, reqp, CM_MERGEFLAG_BULKSTAT); + code = cm_MergeStatus(dscp, scp, &bbp->stats[j], &volSync, userp, reqp, CM_MERGEFLAG_BULKSTAT); lock_ReleaseWrite(&scp->rw); } else { lock_ReleaseRead(&scp->rw); @@ -2927,8 +2927,8 @@ long cm_SetAttr(cm_scache_t *scp, cm_attr_t *attrp, cm_user_t *userp, lock_ObtainWrite(&scp->rw); if (code == 0) - cm_MergeStatus(NULL, scp, &afsOutStatus, &volSync, userp, reqp, - CM_MERGEFLAG_FORCE|CM_MERGEFLAG_STOREDATA); + code = cm_MergeStatus( NULL, scp, &afsOutStatus, &volSync, userp, reqp, + CM_MERGEFLAG_FORCE|CM_MERGEFLAG_STOREDATA); else InterlockedDecrement(&scp->activeRPCs); cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_STORESTATUS); @@ -3043,7 +3043,7 @@ long cm_Create(cm_scache_t *dscp, clientchar_t *cnamep, long flags, cm_attr_t *a } lock_ObtainWrite(&dscp->rw); if (code == 0) { - cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, reqp, CM_MERGEFLAG_DIROP); + code = cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, reqp, CM_MERGEFLAG_DIROP); cm_SetFid(&newFid, dscp->fid.cell, dscp->fid.volume, newAFSFid.Vnode, newAFSFid.Unique); if (cm_CheckDirOpForSingleChange(&dirop)) { lock_ReleaseWrite(&dscp->rw); @@ -3074,8 +3074,8 @@ long cm_Create(cm_scache_t *dscp, clientchar_t *cnamep, long flags, cm_attr_t *a &newFileCallback, &volSync, 0); InterlockedIncrement(&scp->activeRPCs); if (!lostRace) - cm_MergeStatus(dscp, scp, &newFileStatus, &volSync, - userp, reqp, 0); + code = cm_MergeStatus( dscp, scp, &newFileStatus, &volSync, + userp, reqp, 0); didEnd = 1; } lock_ReleaseWrite(&scp->rw); @@ -3235,7 +3235,7 @@ long cm_MakeDir(cm_scache_t *dscp, clientchar_t *cnamep, long flags, cm_attr_t * } lock_ObtainWrite(&dscp->rw); if (code == 0) { - cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, reqp, CM_MERGEFLAG_DIROP); + code = cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, reqp, CM_MERGEFLAG_DIROP); cm_SetFid(&newFid, dscp->fid.cell, dscp->fid.volume, newAFSFid.Vnode, newAFSFid.Unique); if (cm_CheckDirOpForSingleChange(&dirop)) { lock_ReleaseWrite(&dscp->rw); @@ -3265,8 +3265,8 @@ long cm_MakeDir(cm_scache_t *dscp, clientchar_t *cnamep, long flags, cm_attr_t * &newDirCallback, &volSync, 0); InterlockedIncrement(&scp->activeRPCs); if (!lostRace) - cm_MergeStatus(dscp, scp, &newDirStatus, &volSync, - userp, reqp, 0); + code = cm_MergeStatus( dscp, scp, &newDirStatus, &volSync, + userp, reqp, 0); didEnd = 1; } lock_ReleaseWrite(&scp->rw); @@ -3367,7 +3367,7 @@ long cm_Link(cm_scache_t *dscp, clientchar_t *cnamep, cm_scache_t *sscp, long fl } lock_ObtainWrite(&dscp->rw); if (code == 0) { - cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, reqp, CM_MERGEFLAG_DIROP); + code = cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, reqp, CM_MERGEFLAG_DIROP); invalidate = 1; if (cm_CheckDirOpForSingleChange(&dirop)) { @@ -3395,7 +3395,7 @@ long cm_Link(cm_scache_t *dscp, clientchar_t *cnamep, cm_scache_t *sscp, long fl if (code == 0) { lock_ObtainWrite(&sscp->rw); InterlockedIncrement(&sscp->activeRPCs); - cm_MergeStatus(NULL, sscp, &newLinkStatus, &volSync, userp, reqp, 0); + code = cm_MergeStatus(NULL, sscp, &newLinkStatus, &volSync, userp, reqp, 0); lock_ReleaseWrite(&sscp->rw); } @@ -3482,7 +3482,7 @@ long cm_SymLink(cm_scache_t *dscp, clientchar_t *cnamep, fschar_t *contentsp, lo } lock_ObtainWrite(&dscp->rw); if (code == 0) { - cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, reqp, CM_MERGEFLAG_DIROP); + code = cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, reqp, CM_MERGEFLAG_DIROP); cm_SetFid(&newFid, dscp->fid.cell, dscp->fid.volume, newAFSFid.Vnode, newAFSFid.Unique); if (cm_CheckDirOpForSingleChange(&dirop)) { lock_ReleaseWrite(&dscp->rw); @@ -3513,8 +3513,8 @@ long cm_SymLink(cm_scache_t *dscp, clientchar_t *cnamep, fschar_t *contentsp, lo lock_ObtainWrite(&scp->rw); if (!cm_HaveCallback(scp)) { InterlockedIncrement(&scp->activeRPCs); - cm_MergeStatus(dscp, scp, &newLinkStatus, &volSync, - userp, reqp, 0); + code = cm_MergeStatus( dscp, scp, &newLinkStatus, &volSync, + userp, reqp, 0); } lock_ReleaseWrite(&scp->rw); @@ -3640,7 +3640,7 @@ long cm_RemoveDir(cm_scache_t *dscp, fschar_t *fnamep, clientchar_t *cnamep, cm_ lock_ObtainWrite(&dscp->rw); if (code == 0) { cm_dnlcRemove(dscp, cnamep); - cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, reqp, CM_MERGEFLAG_DIROP); + code = cm_MergeStatus(NULL, dscp, &updatedDirStatus, &volSync, userp, reqp, CM_MERGEFLAG_DIROP); if (cm_CheckDirOpForSingleChange(&dirop) && cnamep != NULL) { lock_ReleaseWrite(&dscp->rw); cm_DirDeleteEntry(&dirop, fnamep); @@ -3988,8 +3988,8 @@ long cm_Rename(cm_scache_t *oldDscp, fschar_t *oldNamep, clientchar_t *cOldNamep lock_ObtainWrite(&oldDscp->rw); if (code == 0) { - cm_MergeStatus(NULL, oldDscp, &updatedOldDirStatus, &volSync, - userp, reqp, CM_MERGEFLAG_DIROP); + code = cm_MergeStatus( NULL, oldDscp, &updatedOldDirStatus, &volSync, + userp, reqp, CM_MERGEFLAG_DIROP); if (cm_CheckDirOpForSingleChange(&oldDirOp)) { lock_ReleaseWrite(&oldDscp->rw); if (bTargetExists && oneDir) { @@ -4041,8 +4041,8 @@ long cm_Rename(cm_scache_t *oldDscp, fschar_t *oldNamep, clientchar_t *cOldNamep } lock_ObtainWrite(&newDscp->rw); if (code == 0) { - cm_MergeStatus(NULL, newDscp, &updatedNewDirStatus, &volSync, - userp, reqp, CM_MERGEFLAG_DIROP); + code = cm_MergeStatus( NULL, newDscp, &updatedNewDirStatus, &volSync, + userp, reqp, CM_MERGEFLAG_DIROP); /* * we only make the local change if we successfully made -- 2.39.5