windows-do-not-discard-badtickets-20080218
[openafs.git] / src / WINNT / afsd / cm_conn.c
index dfcc93c..87e3db4 100644 (file)
@@ -116,7 +116,7 @@ static long cm_GetServerList(struct cm_fid *fidp, struct cm_user *userp,
         return CM_ERROR_INVAL;
     }
 
-    cellp = cm_FindCellByID(fidp->cell);
+    cellp = cm_FindCellByID(fidp->cell, 0);
     if (!cellp) 
         return CM_ERROR_NOSUCHCELL;
 
@@ -215,7 +215,7 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
             }
         } 
         if (cellp == NULL && fidp) {
-            cellp = cm_FindCellByID(fidp->cell);
+            cellp = cm_FindCellByID(fidp->cell, 0);
         }
     }
 
@@ -267,9 +267,6 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
          * 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, 
@@ -283,7 +280,7 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *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))
@@ -315,7 +312,9 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
                     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) {
@@ -383,17 +382,17 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
                         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;
@@ -435,15 +434,17 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
             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) {
@@ -453,18 +454,42 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
                 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;
@@ -489,6 +514,7 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
                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);
@@ -534,7 +560,7 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
        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;
@@ -545,7 +571,7 @@ cm_Analyze(cm_conn_t *connp, cm_user_t *userp, cm_req_t *reqp,
         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);