&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)
}
#endif
- if ((cp->vlServersp == NULL) ||
+ if (cm_IsServerListEmpty(cp->vlServersp) ||
(time(0) > cp->timeout) ||
(cm_dnsEnabled &&
(cp->flags & CM_CELLFLAG_DNS) &&
*
* 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.
*/
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,
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;
*/
}
+ 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
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
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;
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
if (tsrp->status == srv_deleted)
continue;
+ allDeleted = 0;
+
tsp = tsrp->server;
if (reqp->errorServp) {
/*
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));
/*
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,
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);
/* 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 */
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);
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);
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);
#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 */
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)
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 */
&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);
}
&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);
}
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)) {
}
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;
}
}
+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;
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 */
&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)
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);
/*
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:
&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) {
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)
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)
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)
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);
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)
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)
&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);
&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);
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)
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);
*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",
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);
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);
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 */
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
&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)
&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)