From ae25cf277c8d70da0e6666316baf98d5c117a03b Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Wed, 20 Jun 2012 00:05:44 -0400 Subject: [PATCH] Windows: force vldb lookup if server list is empty The Windows cache manager can mark server references as "deleted" which can give the impression that a server reference list is not empty when it is. If the volume list is empty any attempt to issue an RPC would fail with a CM_ERROR_ALLDOWN error. Since the VLDB data is current, this condition will remain for two hours. This patchset adds a new error, CM_ERROR_EMPTY, which is returned when the server reference list is empty. cm_Analyze() is modified to process the CM_ERROR_EMPTY error by attempting to update the server reference list. If the update succeeds and the list is no longer empty, the RPC is retried. Otherwise, the RPC fails as before. Change-Id: I13891c28ec9916bdd03c1b02e1c9049ed0581ed3 Reviewed-on: http://gerrit.openafs.org/7637 Tested-by: BuildBot Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsd/cm_callback.c | 2 +- src/WINNT/afsd/cm_cell.c | 2 +- src/WINNT/afsd/cm_conn.c | 51 ++++++++++++++++++++++++----- src/WINNT/afsd/cm_conn.h | 2 +- src/WINNT/afsd/cm_dcache.c | 10 +++--- src/WINNT/afsd/cm_error.h | 1 + src/WINNT/afsd/cm_ioctl.c | 19 ++++++----- src/WINNT/afsd/cm_server.c | 20 +++++++++++ src/WINNT/afsd/cm_server.h | 2 ++ src/WINNT/afsd/cm_vnodeops.c | 28 ++++++++-------- src/WINNT/afsd/cm_volume.c | 6 ++-- src/WINNT/afsd/cm_volume.h | 3 ++ src/WINNT/afsd/smb.c | 4 ++- src/WINNT/afsrdr/user/RDRFunction.c | 4 +-- 14 files changed, 110 insertions(+), 44 deletions(-) diff --git a/src/WINNT/afsd/cm_callback.c b/src/WINNT/afsd/cm_callback.c index 9604ac1a1..fdcd94767 100644 --- a/src/WINNT/afsd/cm_callback.c +++ b/src/WINNT/afsd/cm_callback.c @@ -1862,7 +1862,7 @@ long cm_GetCallback(cm_scache_t *scp, struct cm_user *userp, &afsStatus, &callback, &volSync); rx_PutConnection(rxconnp); - } while (cm_Analyze(connp, userp, reqp, &sfid, 0, &volSync, NULL, + } while (cm_Analyze(connp, userp, reqp, &sfid, NULL, 0, &volSync, NULL, &cbr, code)); code = cm_MapRPCError(code, reqp); if (code) diff --git a/src/WINNT/afsd/cm_cell.c b/src/WINNT/afsd/cm_cell.c index cf0448f3c..3c344062b 100644 --- a/src/WINNT/afsd/cm_cell.c +++ b/src/WINNT/afsd/cm_cell.c @@ -92,7 +92,7 @@ cm_cell_t *cm_UpdateCell(cm_cell_t * cp, afs_uint32 flags) } #endif - if ((cp->vlServersp == NULL) || + if (cm_IsServerListEmpty(cp->vlServersp) || (time(0) > cp->timeout) || (cm_dnsEnabled && (cp->flags & CM_CELLFLAG_DNS) && diff --git a/src/WINNT/afsd/cm_conn.c b/src/WINNT/afsd/cm_conn.c index 8f865e00d..2f950ae74 100644 --- a/src/WINNT/afsd/cm_conn.c +++ b/src/WINNT/afsd/cm_conn.c @@ -286,7 +286,7 @@ cm_ResetServerBusyStatus(cm_serverRef_t *serversp) * * If the error code is from cm_ConnFromFID() or friends, connp will be NULL. * - * For VLDB calls, fidp will be NULL. + * For VLDB calls, fidp will be NULL and cellp will not be. * * volSyncp and/or cbrp may also be NULL. */ @@ -295,6 +295,7 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp, struct cm_fid *fidp, + cm_cell_t *cellp, afs_uint32 storeOp, AFSVolSync *volSyncp, cm_serverRef_t * serversp, @@ -304,7 +305,6 @@ cm_Analyze(cm_conn_t *connp, cm_server_t *serverp = NULL; cm_serverRef_t **serverspp = NULL; cm_serverRef_t *tsrp; - cm_cell_t *cellp = NULL; cm_ucell_t *ucellp; cm_volume_t * volp = NULL; cm_vol_state_t *statep = NULL; @@ -404,6 +404,38 @@ cm_Analyze(cm_conn_t *connp, */ } + else if (errorCode == CM_ERROR_EMPTY) { + /* + * The server list is empty (or all entries have been deleted). + * If fidp is NULL, this was a vlServer list and we can attempt + * to force a cell lookup. If fidp is not NULL, we can attempt + * to refresh the volume location list. + */ + if (fidp) { + code = cm_FindVolumeByID(cellp, fidp->volume, userp, reqp, + CM_GETVOL_FLAG_NO_LRU_UPDATE, + &volp); + if (code == 0) { + if (cm_UpdateVolumeLocation(cellp, userp, reqp, volp) == 0) { + code = cm_GetServerList(fidp, userp, reqp, &replicated, &serverspp); + if (code == 0) { + if (!cm_IsServerListEmpty(*serverspp)) + retry = 1; + cm_FreeServerList(serverspp, 0); + } + } + + lock_ObtainRead(&cm_volumeLock); + cm_PutVolume(volp); + lock_ReleaseRead(&cm_volumeLock); + volp = NULL; + } + } else { + cm_cell_t * newCellp = cm_UpdateCell( cellp, 0); + if (newCellp) + retry = 1; + } + } else if (errorCode == CM_ERROR_ALLDOWN) { /* Servers marked DOWN will be restored by the background daemon * thread as they become available. The volume status is @@ -419,7 +451,6 @@ cm_Analyze(cm_conn_t *connp, osi_Log0(afsd_logp, "cm_Analyze passed CM_ERROR_ALLDOWN (VL Server)"); } } - else if (errorCode == CM_ERROR_ALLOFFLINE) { /* Volume instances marked offline will be restored by the * background daemon thread as they become available @@ -1079,7 +1110,7 @@ cm_Analyze(cm_conn_t *connp, errorCode); if (!dead_session) { lock_ObtainMutex(&userp->mx); - ucellp = cm_GetUCell(userp, serverp->cellp); + ucellp = cm_GetUCell(userp, cellp); if (ucellp->ticketp) { free(ucellp->ticketp); ucellp->ticketp = NULL; @@ -1295,15 +1326,15 @@ long cm_ConnByMServers(cm_serverRef_t *serversp, afs_uint32 replicated, cm_user_ cm_serverRef_t *tsrp; cm_server_t *tsp; long firstError = 0; - int someBusy = 0, someOffline = 0, allOffline = 1, allBusy = 1, allDown = 1; + int someBusy = 0, someOffline = 0, allOffline = 1, allBusy = 1, allDown = 1, allDeleted = 1; #ifdef SET_RX_TIMEOUTS_TO_TIMELEFT long timeUsed, timeLeft, hardTimeLeft; #endif *connpp = NULL; if (serversp == NULL) { - osi_Log1(afsd_logp, "cm_ConnByMServers returning 0x%x", CM_ERROR_ALLDOWN); - return CM_ERROR_ALLDOWN; + osi_Log1(afsd_logp, "cm_ConnByMServers returning 0x%x", CM_ERROR_EMPTY); + return CM_ERROR_EMPTY; } #ifdef SET_RX_TIMEOUTS_TO_TIMELEFT @@ -1319,6 +1350,8 @@ long cm_ConnByMServers(cm_serverRef_t *serversp, afs_uint32 replicated, cm_user_ if (tsrp->status == srv_deleted) continue; + allDeleted = 0; + tsp = tsrp->server; if (reqp->errorServp) { /* @@ -1376,7 +1409,9 @@ long cm_ConnByMServers(cm_serverRef_t *serversp, afs_uint32 replicated, cm_user_ lock_ReleaseRead(&cm_serverLock); if (firstError == 0) { - if (allDown) { + if (allDeleted) { + firstError = CM_ERROR_EMPTY; + } else if (allDown) { firstError = (reqp->tokenError ? reqp->tokenError : (reqp->idleError ? RX_CALL_TIMEOUT : CM_ERROR_ALLDOWN)); /* diff --git a/src/WINNT/afsd/cm_conn.h b/src/WINNT/afsd/cm_conn.h index b995f2767..ea5c0f5af 100644 --- a/src/WINNT/afsd/cm_conn.h +++ b/src/WINNT/afsd/cm_conn.h @@ -138,7 +138,7 @@ extern void cm_InitConn(void); extern void cm_InitReq(cm_req_t *reqp); extern int cm_Analyze(cm_conn_t *connp, struct cm_user *up, struct cm_req *reqp, - struct cm_fid *fidp, + struct cm_fid *fidp, struct cm_cell *cellp, afs_uint32 storeOp, struct AFSVolSync *volInfop, cm_serverRef_t * serversp, diff --git a/src/WINNT/afsd/cm_dcache.c b/src/WINNT/afsd/cm_dcache.c index 3ee073d66..3517ea065 100644 --- a/src/WINNT/afsd/cm_dcache.c +++ b/src/WINNT/afsd/cm_dcache.c @@ -375,7 +375,7 @@ long cm_BufWrite(void *vscp, osi_hyper_t *offsetp, long length, long flags, osi_Log2(afsd_logp, "rx_EndCall converted 0x%x to 0x%x", code, code1); code = code1; } - } while (cm_Analyze(connp, userp, reqp, &scp->fid, 1, &volSync, NULL, NULL, code)); + } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 1, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); @@ -564,7 +564,7 @@ long cm_StoreMini(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp) /* prefer StoreData error over rx_EndCall error */ if (code == 0 && code1 != 0) code = code1; - } while (cm_Analyze(connp, userp, reqp, &scp->fid, 1, &volSync, NULL, NULL, code)); + } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 1, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); /* now, clean up our state */ @@ -2167,7 +2167,7 @@ long cm_GetBuffer(cm_scache_t *scp, cm_buf_t *bufp, int *cpffp, cm_user_t *userp code = code1; osi_Log0(afsd_logp, "CALL FetchData DONE"); - } while (cm_Analyze(connp, userp, reqp, &scp->fid, 0, &volSync, NULL, NULL, code)); + } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 0, &volSync, NULL, NULL, code)); fetchingcompleted: code = cm_MapRPCError(code, reqp); @@ -2545,7 +2545,7 @@ long cm_GetData(cm_scache_t *scp, osi_hyper_t *offsetp, char *datap, int data_le code = code1; osi_Log0(afsd_logp, "CALL FetchData DONE"); - } while (cm_Analyze(connp, userp, reqp, &scp->fid, 0, &volSync, NULL, NULL, code)); + } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 0, &volSync, NULL, NULL, code)); fetchingcompleted: code = cm_MapRPCError(code, reqp); @@ -2765,7 +2765,7 @@ cm_VerifyStoreData(cm_bulkIO_t *biod, cm_scache_t *savedScp) code = code1; osi_Log0(afsd_logp, "CALL FetchData DONE"); - } while (cm_Analyze(connp, userp, reqp, &scp->fid, 0, &volSync, NULL, NULL, code)); + } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 0, &volSync, NULL, NULL, code)); fetchingcompleted: code = cm_MapRPCError(code, reqp); diff --git a/src/WINNT/afsd/cm_error.h b/src/WINNT/afsd/cm_error.h index 782bea847..6715552ef 100644 --- a/src/WINNT/afsd/cm_error.h +++ b/src/WINNT/afsd/cm_error.h @@ -76,6 +76,7 @@ #define CM_ERROR_BADFORMAT (CM_ERROR_BASE+62) #define CM_ERROR_RPC_MOREDATA (CM_ERROR_BASE+63) #define CM_ERROR_BUFFER_OVERFLOW (CM_ERROR_BASE+64) +#define CM_ERROR_EMPTY (CM_ERROR_BASE+65) #endif /* OPENAFS_WINNT_AFSD_CM_ERROR_H */ diff --git a/src/WINNT/afsd/cm_ioctl.c b/src/WINNT/afsd/cm_ioctl.c index a0b7c12f3..1fc3abf6e 100644 --- a/src/WINNT/afsd/cm_ioctl.c +++ b/src/WINNT/afsd/cm_ioctl.c @@ -439,7 +439,7 @@ cm_IoctlGetACL(cm_ioctl_t *ioctlp, cm_user_t *userp, cm_scache_t *scp, cm_req_t code = RXAFS_FetchACL(rxconnp, &afid, &acl, &fileStatus, &volSync); rx_PutConnection(rxconnp); - } while (cm_Analyze(connp, userp, reqp, &scp->fid, 0, &volSync, NULL, NULL, code)); + } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 0, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); if (code) @@ -537,7 +537,7 @@ cm_IoctlSetACL(struct cm_ioctl *ioctlp, struct cm_user *userp, cm_scache_t *scp, code = RXAFS_StoreACL(rxconnp, &fid, &acl, &fileStatus, &volSync); rx_PutConnection(rxconnp); - } while (cm_Analyze(connp, userp, reqp, &scp->fid, 1, &volSync, NULL, NULL, code)); + } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 1, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); /* invalidate cache info, since we just trashed the ACL cache */ @@ -710,7 +710,7 @@ cm_IoctlSetVolumeStatus(struct cm_ioctl *ioctlp, struct cm_user *userp, cm_scach &storeStat, volName, offLineMsg, motd); rx_PutConnection(rxconnp); - } while (cm_Analyze(tcp, userp, reqp, &scp->fid, 1, NULL, NULL, NULL, code)); + } while (cm_Analyze(tcp, userp, reqp, &scp->fid, NULL, 1, NULL, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); } @@ -786,7 +786,7 @@ cm_IoctlGetVolumeStatus(struct cm_ioctl *ioctlp, struct cm_user *userp, cm_scach &volStat, &Name, &OfflineMsg, &MOTD); rx_PutConnection(rxconnp); - } while (cm_Analyze(connp, userp, reqp, &scp->fid, 0, NULL, NULL, NULL, code)); + } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 0, NULL, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); } @@ -3324,17 +3324,18 @@ cm_CheckServersStatus(cm_serverRef_t *serversp) afs_int32 code = 0; cm_serverRef_t *tsrp; cm_server_t *tsp; - int someBusy = 0, someOffline = 0, allOffline = 1, allBusy = 1, allDown = 1; + int someBusy = 0, someOffline = 0, allOffline = 1, allBusy = 1, allDown = 1, allDeleted = 1; if (serversp == NULL) { - osi_Log1(afsd_logp, "cm_CheckServersStatus returning 0x%x", CM_ERROR_ALLDOWN); - return CM_ERROR_ALLDOWN; + osi_Log1(afsd_logp, "cm_CheckServersStatus returning 0x%x", CM_ERROR_EMPTY); + return CM_ERROR_EMPTY; } lock_ObtainRead(&cm_serverLock); for (tsrp = serversp; tsrp; tsrp=tsrp->next) { if (tsrp->status == srv_deleted) continue; + allDeleted = 0; if (tsp = tsrp->server) { cm_GetServerNoLock(tsp); if (!(tsp->flags & CM_SERVERFLAG_DOWN)) { @@ -3357,7 +3358,9 @@ cm_CheckServersStatus(cm_serverRef_t *serversp) } lock_ReleaseRead(&cm_serverLock); - if (allDown) + if (allDeleted) + code = CM_ERROR_EMPTY; + else if (allDown) code = CM_ERROR_ALLDOWN; else if (allBusy) code = CM_ERROR_ALLBUSY; diff --git a/src/WINNT/afsd/cm_server.c b/src/WINNT/afsd/cm_server.c index 8aaf01262..614ba723a 100644 --- a/src/WINNT/afsd/cm_server.c +++ b/src/WINNT/afsd/cm_server.c @@ -1345,6 +1345,26 @@ void cm_RemoveVolumeFromServer(cm_server_t * serverp, afs_uint32 volID) } } +int cm_IsServerListEmpty(cm_serverRef_t *serversp) +{ + cm_serverRef_t *tsrp; + int allDeleted = 1; + + if (serversp == NULL) + return CM_ERROR_EMPTY; + + lock_ObtainRead(&cm_serverLock); + for (tsrp = serversp; tsrp; tsrp=tsrp->next) { + if (tsrp->status == srv_deleted) + continue; + allDeleted = 0; + break; + } + lock_ReleaseRead(&cm_serverLock); + + return ( allDeleted ? CM_ERROR_EMPTY : 0 ); +} + void cm_FreeServerList(cm_serverRef_t** list, afs_uint32 flags) { cm_serverRef_t **current; diff --git a/src/WINNT/afsd/cm_server.h b/src/WINNT/afsd/cm_server.h index 8e39721f8..2202ff824 100644 --- a/src/WINNT/afsd/cm_server.h +++ b/src/WINNT/afsd/cm_server.h @@ -147,6 +147,8 @@ extern int cm_DumpServers(FILE *outputFile, char *cookie, int lock); extern int cm_ServerEqual(cm_server_t *srv1, cm_server_t *srv2); +extern int cm_IsServerListEmpty(cm_serverRef_t *serversp); + /* Protected by cm_syscfgLock (rw) */ extern int cm_noIPAddr; /* number of client network interfaces */ extern int cm_IPAddr[CM_MAXINTERFACE_ADDR]; /* client's IP address in host order */ diff --git a/src/WINNT/afsd/cm_vnodeops.c b/src/WINNT/afsd/cm_vnodeops.c index 36cefd47c..f7e4be1d7 100644 --- a/src/WINNT/afsd/cm_vnodeops.c +++ b/src/WINNT/afsd/cm_vnodeops.c @@ -1680,7 +1680,7 @@ long cm_Unlink(cm_scache_t *dscp, fschar_t *fnamep, clientchar_t * cnamep, &newDirStatus, &volSync); rx_PutConnection(rxconnp); - } while (cm_Analyze(connp, userp, reqp, &dscp->fid, 1, &volSync, NULL, NULL, code)); + } while (cm_Analyze(connp, userp, reqp, &dscp->fid, NULL, 1, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); if (code) @@ -2484,7 +2484,7 @@ cm_TryBulkStatRPC(cm_scache_t *dscp, cm_bulkStat_t *bbp, cm_user_t *userp, cm_re code = (&bbp->stats[0])->errorCode; } } - } while (cm_Analyze(connp, userp, reqp, &tfid, 0, &volSync, NULL, &cbReq, code)); + } while (cm_Analyze(connp, userp, reqp, &tfid, NULL, 0, &volSync, NULL, &cbReq, code)); code = cm_MapRPCError(code, reqp); /* @@ -2515,7 +2515,7 @@ cm_TryBulkStatRPC(cm_scache_t *dscp, cm_bulkStat_t *bbp, cm_user_t *userp, cm_re if (inlinebulk && (&bbp->stats[j])->errorCode) { cm_req_t treq = *reqp; - cm_Analyze(NULL, userp, &treq, &tfid, 0, &volSync, NULL, &cbReq, (&bbp->stats[j])->errorCode); + cm_Analyze(NULL, userp, &treq, &tfid, NULL, 0, &volSync, NULL, &cbReq, (&bbp->stats[j])->errorCode); switch ((&bbp->stats[j])->errorCode) { case EACCES: case UAEACCES: @@ -2705,7 +2705,7 @@ cm_IsSpaceAvailable(cm_fid_t * fidp, osi_hyper_t *sizep, cm_user_t *userp, cm_re &volStat, &Name, &OfflineMsg, &MOTD); rx_PutConnection(rxconnp); - } while (cm_Analyze(connp, userp, reqp, fidp, 0, NULL, NULL, NULL, code)); + } while (cm_Analyze(connp, userp, reqp, fidp, NULL, 0, NULL, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); if (code == 0) { if (volStat.MaxQuota) { @@ -2887,7 +2887,7 @@ long cm_SetAttr(cm_scache_t *scp, cm_attr_t *attrp, cm_user_t *userp, rx_PutConnection(rxconnp); } while (cm_Analyze(connp, userp, reqp, - &scp->fid, 1, &volSync, NULL, NULL, code)); + &scp->fid, NULL, 1, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); if (code) @@ -2999,7 +2999,7 @@ long cm_Create(cm_scache_t *dscp, clientchar_t *cnamep, long flags, cm_attr_t *a rx_PutConnection(rxconnp); } while (cm_Analyze(connp, userp, reqp, - &dscp->fid, 1, &volSync, NULL, &cbReq, code)); + &dscp->fid, NULL, 1, &volSync, NULL, &cbReq, code)); code = cm_MapRPCError(code, reqp); if (code) @@ -3191,7 +3191,7 @@ long cm_MakeDir(cm_scache_t *dscp, clientchar_t *cnamep, long flags, cm_attr_t * rx_PutConnection(rxconnp); } while (cm_Analyze(connp, userp, reqp, - &dscp->fid, 1, &volSync, NULL, &cbReq, code)); + &dscp->fid, NULL, 1, &volSync, NULL, &cbReq, code)); code = cm_MapRPCError(code, reqp); if (code) @@ -3322,7 +3322,7 @@ long cm_Link(cm_scache_t *dscp, clientchar_t *cnamep, cm_scache_t *sscp, long fl rx_PutConnection(rxconnp); osi_Log1(afsd_logp," RXAFS_Link returns 0x%x", code); - } while (cm_Analyze(connp, userp, reqp, &dscp->fid, 1, &volSync, NULL, NULL, code)); + } while (cm_Analyze(connp, userp, reqp, &dscp->fid, NULL, 1, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); @@ -3438,7 +3438,7 @@ long cm_SymLink(cm_scache_t *dscp, clientchar_t *cnamep, fschar_t *contentsp, lo rx_PutConnection(rxconnp); } while (cm_Analyze(connp, userp, reqp, - &dscp->fid, 1, &volSync, NULL, NULL, code)); + &dscp->fid, NULL, 1, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); if (code) @@ -3595,7 +3595,7 @@ long cm_RemoveDir(cm_scache_t *dscp, fschar_t *fnamep, clientchar_t *cnamep, cm_ rx_PutConnection(rxconnp); } while (cm_Analyze(connp, userp, reqp, - &dscp->fid, 1, &volSync, NULL, NULL, code)); + &dscp->fid, NULL, 1, &volSync, NULL, NULL, code)); code = cm_MapRPCErrorRmdir(code, reqp); if (code) @@ -3941,7 +3941,7 @@ long cm_Rename(cm_scache_t *oldDscp, fschar_t *oldNamep, clientchar_t *cOldNamep &volSync); rx_PutConnection(rxconnp); - } while (cm_Analyze(connp, userp, reqp, &oldDscp->fid, 1, + } while (cm_Analyze(connp, userp, reqp, &oldDscp->fid, NULL, 1, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); @@ -4643,7 +4643,7 @@ long cm_IntSetLock(cm_scache_t * scp, cm_user_t * userp, int lockType, &volSync); rx_PutConnection(rxconnp); - } while (cm_Analyze(connp, userp, reqp, &cfid, 1, &volSync, + } while (cm_Analyze(connp, userp, reqp, &cfid, NULL, 1, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); @@ -4705,7 +4705,7 @@ long cm_IntReleaseLock(cm_scache_t * scp, cm_user_t * userp, code = RXAFS_ReleaseLock(rxconnp, &tfid, &volSync); rx_PutConnection(rxconnp); - } while (cm_Analyze(connp, userp, reqp, &cfid, 1, &volSync, + } while (cm_Analyze(connp, userp, reqp, &cfid, NULL, 1, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, reqp); if (code) @@ -5699,7 +5699,7 @@ void cm_CheckLocks() osi_Log1(afsd_logp, " ExtendLock returns %d", code); } while (cm_Analyze(connp, userp, &req, - &cfid, 1, &volSync, NULL, NULL, + &cfid, NULL, 1, &volSync, NULL, NULL, code)); code = cm_MapRPCError(code, &req); diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index e99d0240d..c5e4bda15 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -203,7 +203,7 @@ cm_GetEntryByName( struct cm_cell *cellp, const char *name, *methodp = 0; } rx_PutConnection(rxconnp); - } while (cm_Analyze(connp, userp, reqp, NULL, 0, NULL, cellp->vlServersp, NULL, code)); + } while (cm_Analyze(connp, userp, reqp, NULL, cellp, 0, NULL, cellp->vlServersp, NULL, code)); code = cm_MapVLRPCError(code, reqp); if ( code ) osi_Log3(afsd_logp, "CALL VL_GetEntryByName{UNO} name %s:%s FAILURE, code 0x%x", @@ -449,7 +449,7 @@ long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t * rxconnp = cm_GetRxConn(connp); code = VL_GetAddrsU(rxconnp, &attrs, &uuid, &unique, &nentries, &addrs); rx_PutConnection(rxconnp); - } while (cm_Analyze(connp, userp, reqp, NULL, 0, NULL, cellp->vlServersp, NULL, code)); + } while (cm_Analyze(connp, userp, reqp, NULL, cellp, 0, NULL, cellp->vlServersp, NULL, code)); if ( code ) { code = cm_MapVLRPCError(code, reqp); @@ -1323,7 +1323,7 @@ cm_CheckOfflineVolumeState(cm_volume_t *volp, cm_vol_state_t *statep, afs_uint32 code = RXAFS_GetVolumeStatus(rxconnp, statep->ID, &volStat, &Name, &OfflineMsg, &MOTD); rx_PutConnection(rxconnp); - } while (cm_Analyze(connp, cm_rootUserp, &req, &fid, 0, NULL, NULL, NULL, code)); + } while (cm_Analyze(connp, cm_rootUserp, &req, &fid, NULL, 0, NULL, NULL, NULL, code)); code = cm_MapRPCError(code, &req); lock_ObtainWrite(&volp->rw); diff --git a/src/WINNT/afsd/cm_volume.h b/src/WINNT/afsd/cm_volume.h index e17dd2a9e..3addb4e19 100644 --- a/src/WINNT/afsd/cm_volume.h +++ b/src/WINNT/afsd/cm_volume.h @@ -163,5 +163,8 @@ extern cm_vol_state_t * cm_VolumeStateByName(cm_volume_t *volp, char *volname); extern afs_int32 cm_VolumeType(cm_volume_t *volp, afs_uint32 id); +extern long cm_UpdateVolumeLocation(struct cm_cell *cellp, cm_user_t *userp, cm_req_t *reqp, + cm_volume_t *volp); + extern osi_rwlock_t cm_volumeLock; #endif /* OPENAFS_WINNT_AFSD_CM_VOLUME_H */ diff --git a/src/WINNT/afsd/smb.c b/src/WINNT/afsd/smb.c index 7610a88ea..8d699a450 100644 --- a/src/WINNT/afsd/smb.c +++ b/src/WINNT/afsd/smb.c @@ -3260,7 +3260,9 @@ void smb_MapNTError(long code, unsigned long *NTStatusp, afs_uint32 redir) NTStatus = 0xC0020018L; /* RPC_NT_SERVER_TOO_BUSY */ #endif } - else if (code == CM_ERROR_ALLOFFLINE || code == CM_ERROR_ALLDOWN) { + else if (code == CM_ERROR_ALLOFFLINE || + code == CM_ERROR_ALLDOWN || + code == CM_ERROR_EMPTY) { #ifdef COMMENT NTStatus = 0xC000003AL; /* Path not found */ #else diff --git a/src/WINNT/afsrdr/user/RDRFunction.c b/src/WINNT/afsrdr/user/RDRFunction.c index a53dcf6f9..849bd1465 100644 --- a/src/WINNT/afsrdr/user/RDRFunction.c +++ b/src/WINNT/afsrdr/user/RDRFunction.c @@ -5078,7 +5078,7 @@ RDR_GetVolumeInfo( IN cm_user_t *userp, &volStat, &Name, &OfflineMsg, &MOTD); rx_PutConnection(rxconnp); - } while (cm_Analyze(connp, userp, &req, &scp->fid, 0, NULL, NULL, NULL, code)); + } while (cm_Analyze(connp, userp, &req, &scp->fid, NULL, 0, NULL, NULL, NULL, code)); code = cm_MapRPCError(code, &req); if (code == 0) { if (volStat.MaxQuota) @@ -5245,7 +5245,7 @@ RDR_GetVolumeSizeInfo( IN cm_user_t *userp, &volStat, &Name, &OfflineMsg, &MOTD); rx_PutConnection(rxconnp); - } while (cm_Analyze(connp, userp, &req, &scp->fid, 0, NULL, NULL, NULL, code)); + } while (cm_Analyze(connp, userp, &req, &scp->fid, NULL, 0, NULL, NULL, NULL, code)); code = cm_MapRPCError(code, &req); if (code == 0) { if (volStat.MaxQuota) -- 2.39.5