Whamcloud - gitweb
- many fixes in liblustre related stuff. By now liblustre is at least build-able...
[fs/lustre-release.git] / lustre / ptlrpc / recover.c
index c3eaf17..6bf1d35 100644 (file)
@@ -54,7 +54,7 @@ void ptlrpc_run_recovery_over_upcall(struct obd_device *obd)
 
         argv[0] = obd_lustre_upcall;
         argv[1] = "RECOVERY_OVER";
-        argv[2] = obd->obd_uuid.uuid;
+        argv[2] = (char *)obd->obd_uuid.uuid;
         argv[3] = NULL;
         
         envp[0] = "HOME=/";
@@ -68,8 +68,8 @@ void ptlrpc_run_recovery_over_upcall(struct obd_device *obd)
                        argv[0], argv[1], argv[2], rc);
 
         } else {
-                CERROR("Invoked upcall %s %s %s\n",
-                       argv[0], argv[1], argv[2]);
+                CWARN("Invoked upcall %s %s %s\n",
+                      argv[0], argv[1], argv[2]);
         }
 }
 
@@ -92,10 +92,10 @@ void ptlrpc_run_failed_import_upcall(struct obd_import* imp)
         
         argv[0] = obd_lustre_upcall;
         argv[1] = "FAILED_IMPORT";
-        argv[2] = imp->imp_target_uuid.uuid;
+        argv[2] = (char *)imp->imp_target_uuid.uuid;
         argv[3] = imp->imp_obd->obd_name;
-        argv[4] = imp->imp_connection->c_remote_uuid.uuid;
-        argv[5] = imp->imp_obd->obd_uuid.uuid;
+        argv[4] = (char *)imp->imp_connection->c_remote_uuid.uuid;
+        argv[5] = (char *)imp->imp_obd->obd_uuid.uuid;
         argv[6] = NULL;
 
         envp[0] = "HOME=/";
@@ -109,8 +109,8 @@ void ptlrpc_run_failed_import_upcall(struct obd_import* imp)
                        argv[0], argv[1], argv[2], argv[3], argv[4],rc);
 
         } else {
-                CERROR("Invoked upcall %s %s %s %s %s\n",
-                       argv[0], argv[1], argv[2], argv[3], argv[4]);
+                CWARN("Invoked upcall %s %s %s %s %s\n",
+                      argv[0], argv[1], argv[2], argv[3], argv[4]);
         }
 #else
         if (imp->imp_state == LUSTRE_IMP_CLOSED) {
@@ -214,6 +214,7 @@ int ptlrpc_replay_next(struct obd_import *imp, int *inflight)
                                LPD64"\n", rc, req->rq_xid);
                         RETURN(rc);
                 }
+                imp->imp_reqs_replayed++;
                 *inflight = 1;
         }
         RETURN(rc);
@@ -286,16 +287,17 @@ void ptlrpc_request_handle_notconn(struct ptlrpc_request *failed_req)
                         ptlrpc_deactivate_import(imp);
                 }
 
-                rc = ptlrpc_connect_import(imp, NULL);
+                /* to control recovery via lctl {disable|enable}_recovery */
+                if (imp->imp_deactive == 0)
+                        rc = ptlrpc_connect_import(imp, NULL);
         }
 
-        
         /* Wait for recovery to complete and resend. If evicted, then
            this request will be errored out later.*/
         spin_lock_irqsave(&failed_req->rq_lock, flags);
         failed_req->rq_resend = 1;
         spin_unlock_irqrestore(&failed_req->rq_lock, flags);
-        
+
         EXIT;
 }
 
@@ -314,10 +316,12 @@ int ptlrpc_set_import_active(struct obd_import *imp, int active)
          * requests. */
         if (!active) {
                 ptlrpc_invalidate_import(imp, 0);
-        } 
+                imp->imp_deactive = 1;
+        }
 
         /* When activating, mark import valid, and attempt recovery */
         if (active) {
+                imp->imp_deactive = 0;
                 CDEBUG(D_HA, "setting import %s VALID\n",
                        imp->imp_target_uuid.uuid);
                 rc = ptlrpc_recover_import(imp, NULL);
@@ -330,10 +334,10 @@ int ptlrpc_recover_import(struct obd_import *imp, char *new_uuid)
 {
         int rc;
         ENTRY;
-        
+
         /* force import to be disconnected. */
         ptlrpc_set_import_discon(imp);
-        
+
         rc = ptlrpc_recover_import_no_retry(imp, new_uuid);
 
         RETURN(rc);
@@ -352,6 +356,24 @@ int ptlrpc_import_in_recovery(struct obd_import *imp)
         return in_recovery;
 }
 
+int ptlrpc_import_control_recovery(struct obd_import *imp, int disable)
+{
+        unsigned long flags;
+
+        /* with imp_deactivate == 1 pinger won't initiate re-connect */
+        spin_lock_irqsave(&imp->imp_lock, flags);
+        if (disable)
+                imp->imp_deactive = 1;
+        else
+                imp->imp_deactive = 0;
+        if (imp->imp_state == LUSTRE_IMP_DISCON) {
+                imp->imp_force_verify = 1;
+                ptlrpc_pinger_wake_up();
+        }
+        spin_unlock_irqrestore(&imp->imp_lock, flags);
+        RETURN(0);
+}
+
 static int ptlrpc_recover_import_no_retry(struct obd_import *imp,
                                           char *new_uuid)
 {