Whamcloud - gitweb
bz-13289 and bz-13315
[fs/lustre-release.git] / lustre / ptlrpc / recover.c
index 114e17a..4a232fa 100644 (file)
@@ -97,7 +97,7 @@ int ptlrpc_replay_next(struct obd_import *imp, int *inflight)
          */
         list_for_each_safe(tmp, pos, &imp->imp_replay_list) {
                 req = list_entry(tmp, struct ptlrpc_request, rq_replay_list);
-
+                
                 /* If need to resend the last sent transno (because a
                    reconnect has occurred), then stop on the matching
                    req and send it again. If, however, the last sent
@@ -117,7 +117,9 @@ int ptlrpc_replay_next(struct obd_import *imp, int *inflight)
                 req = NULL;
         }
 
+        spin_lock(&imp->imp_lock);
         imp->imp_resend_replay = 0;
+        spin_unlock(&imp->imp_lock);
 
         if (req != NULL) {
                 rc = ptlrpc_replay_req(req);
@@ -148,14 +150,15 @@ int ptlrpc_resend(struct obd_import *imp)
                 spin_unlock(&imp->imp_lock);
                 RETURN(-1);
         }
-        spin_unlock(&imp->imp_lock);
 
         list_for_each_entry_safe(req, next, &imp->imp_sending_list, rq_list) {
                 LASSERTF((long)req > CFS_PAGE_SIZE && req != LP_POISON,
                          "req %p bad\n", req);
                 LASSERTF(req->rq_type != LI_POISON, "req %p freed\n", req);
-                ptlrpc_resend_req(req);
+                if (!req->rq_no_resend)
+                        ptlrpc_resend_req(req);
         }
+        spin_unlock(&imp->imp_lock);
 
         RETURN(0);
 }
@@ -230,12 +233,18 @@ int ptlrpc_set_import_active(struct obd_import *imp, int active)
                 LCONSOLE_WARN("setting import %s INACTIVE by administrator "
                               "request\n", obd2cli_tgt(imp->imp_obd));
                 ptlrpc_invalidate_import(imp);
+
+                spin_lock(&imp->imp_lock);
                 imp->imp_deactive = 1;
+                spin_unlock(&imp->imp_lock);
         }
 
         /* When activating, mark import valid, and attempt recovery */
         if (active) {
+                spin_lock(&imp->imp_lock);
                 imp->imp_deactive = 0;
+                spin_unlock(&imp->imp_lock);
+                
                 CDEBUG(D_HA, "setting import %s VALID\n",
                        obd2cli_tgt(imp->imp_obd));
                 rc = ptlrpc_recover_import(imp, NULL);
@@ -253,7 +262,10 @@ int ptlrpc_recover_import(struct obd_import *imp, char *new_uuid)
         /* force import to be disconnected. */
         ptlrpc_set_import_discon(imp, 0);
 
+        spin_lock(&imp->imp_lock);
         imp->imp_deactive = 0;
+        spin_unlock(&imp->imp_lock);
+
         rc = ptlrpc_recover_import_no_retry(imp, new_uuid);
 
         RETURN(rc);