return CM_ERROR_INVAL;
}
- cellp = cm_FindCellByID(fidp->cell);
+ cellp = cm_FindCellByID(fidp->cell, 0);
if (!cellp)
return CM_ERROR_NOSUCHCELL;
}
}
if (cellp == NULL && fidp) {
- cellp = cm_FindCellByID(fidp->cell);
+ cellp = cm_FindCellByID(fidp->cell, 0);
}
}
* background daemon thread as they become available
*/
if (timeLeft > 7 && fidp) {
- cm_volume_t *volp;
- cm_vol_state_t *statep;
-
thrd_Sleep(5000);
code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp,
else if (fidp->volume == volp->bk.ID)
statep = &volp->bk;
- if (statep->state != vl_offline) {
+ if (statep->state != vl_offline && statep->state != vl_unknown) {
retry = 1;
} else {
if (cm_CheckOfflineVolume(volp, statep->ID))
else if (fidp->volume == volp->bk.ID)
statep = &volp->bk;
- if (statep->state != vl_offline && statep->state != vl_busy) {
+ if (statep->state != vl_offline &&
+ statep->state != vl_busy &&
+ statep->state != vl_unknown) {
retry = 1;
} else {
if (!serversp) {
else if (fidp->volume == volp->bk.ID)
statep = &volp->bk;
}
-
- cm_PutVolume(volp);
}
break;
}
}
lock_ReleaseWrite(&cm_serverLock);
- if (statep)
+ if (statep) {
cm_UpdateVolumeStatus(volp, statep->ID);
-
+ cm_PutVolume(volp);
+ }
+
if (free_svr_list) {
cm_FreeServerList(&serversp, 0);
*serverspp = serversp;
break;
}
- /* Log server being offline for this volume */
- sprintf(addr, "%d.%d.%d.%d",
- ((serverp->addr.sin_addr.s_addr & 0xff)),
- ((serverp->addr.sin_addr.s_addr & 0xff00)>> 8),
- ((serverp->addr.sin_addr.s_addr & 0xff0000)>> 16),
- ((serverp->addr.sin_addr.s_addr & 0xff000000)>> 24));
+ if (serverp && fidp) {
+ /* Log server being offline for this volume */
+ sprintf(addr, "%d.%d.%d.%d",
+ ((serverp->addr.sin_addr.s_addr & 0xff)),
+ ((serverp->addr.sin_addr.s_addr & 0xff00)>> 8),
+ ((serverp->addr.sin_addr.s_addr & 0xff0000)>> 16),
+ ((serverp->addr.sin_addr.s_addr & 0xff000000)>> 24));
- osi_Log2(afsd_logp, format, osi_LogSaveString(afsd_logp,addr), fidp->volume);
- LogEvent(EVENTLOG_WARNING_TYPE, msgID, addr, fidp->volume);
+ osi_Log2(afsd_logp, format, osi_LogSaveString(afsd_logp,addr), fidp->volume);
+ LogEvent(EVENTLOG_WARNING_TYPE, msgID, addr, fidp->volume);
+ }
/* Mark server offline for this volume */
if (!serversp && fidp) {
free_svr_list = 1;
}
}
+
+ lock_ObtainWrite(&cm_serverLock);
for (tsrp = serversp; tsrp; tsrp=tsrp->next) {
if (tsrp->server == serverp) {
/* REDIRECT */
- if (errorCode == VNOVOL || errorCode == VMOVED) {
+ if (errorCode == VMOVED) {
tsrp->status = srv_deleted;
- if (fidp) {
- cm_ForceUpdateVolume(fidp, userp, reqp);
- }
- } else
+ } else {
tsrp->status = srv_offline;
+ }
+
+ if (fidp) { /* File Server query */
+ code = cm_GetVolumeByID(cellp, fidp->volume, userp, reqp,
+ CM_GETVOL_FLAG_NO_LRU_UPDATE,
+ &volp);
+ if (code == 0) {
+ if (fidp->volume == volp->rw.ID)
+ statep = &volp->rw;
+ else if (fidp->volume == volp->ro.ID)
+ statep = &volp->ro;
+ else if (fidp->volume == volp->bk.ID)
+ statep = &volp->bk;
+ }
+ }
}
}
+ lock_ReleaseWrite(&cm_serverLock);
+
+ if (fidp && errorCode == VMOVED)
+ cm_ForceUpdateVolume(fidp, userp, reqp);
+
+ if (statep) {
+ cm_UpdateVolumeStatus(volp, statep->ID);
+ cm_PutVolume(volp);
+ }
+
if (free_svr_list) {
cm_FreeServerList(&serversp, 0);
*serverspp = serversp;
lock_ObtainWrite(&cm_scacheLock);
cm_RemoveSCacheFromHashTable(scp);
lock_ReleaseWrite(&cm_scacheLock);
+ cm_LockMarkSCacheLost(scp);
scp->flags |= CM_SCACHEFLAG_DELETED;
lock_ReleaseMutex(&scp->mx);
cm_ReleaseSCache(scp);
if (reqp->flags & CM_REQ_NEW_CONN_FORCED) {
if (!(serverp->flags & CM_SERVERFLAG_DOWN)) {
serverp->flags |= CM_SERVERFLAG_DOWN;
- serverp->downTime = osi_Time();
+ serverp->downTime = time(NULL);
}
} else {
reqp->flags |= CM_REQ_NEW_CONN_FORCED;
if ( timeLeft > 2 )
retry = 1;
}
- else if (errorCode == RXKADEXPIRED || errorCode == RXKADBADTICKET) {
+ else if (errorCode == RXKADEXPIRED) {
if (!dead_session) {
lock_ObtainMutex(&userp->mx);
ucellp = cm_GetUCell(userp, serverp->cellp);