Whamcloud - gitweb
LU-5319 tests: testcases for multiple modify RPCs feature
[fs/lustre-release.git] / lustre / ldlm / ldlm_lib.c
index 603ab41..f56b452 100644 (file)
@@ -688,8 +688,7 @@ int server_disconnect_export(struct obd_export *exp)
        if (exp->exp_imp_reverse)
                ptlrpc_cleanup_imp(exp->exp_imp_reverse);
 
-       if (exp->exp_obd->obd_namespace != NULL)
-               ldlm_cancel_locks_for_export(exp);
+       ldlm_bl_thread_wakeup();
 
         /* complete all outstanding replies */
        spin_lock(&exp->exp_lock);
@@ -1417,6 +1416,7 @@ static int target_exp_enqueue_req_replay(struct ptlrpc_request *req)
         __u64                  transno = lustre_msg_get_transno(req->rq_reqmsg);
         struct obd_export     *exp = req->rq_export;
         struct ptlrpc_request *reqiter;
+       struct ptlrpc_request *dup_req = NULL;
         int                    dup = 0;
 
         LASSERT(exp);
@@ -1425,6 +1425,7 @@ static int target_exp_enqueue_req_replay(struct ptlrpc_request *req)
        list_for_each_entry(reqiter, &exp->exp_req_replay_queue,
                                 rq_replay_list) {
                 if (lustre_msg_get_transno(reqiter->rq_reqmsg) == transno) {
+                       dup_req = reqiter;
                         dup = 1;
                         break;
                 }
@@ -1436,6 +1437,16 @@ static int target_exp_enqueue_req_replay(struct ptlrpc_request *req)
                      (MSG_RESENT | MSG_REPLAY)) != (MSG_RESENT | MSG_REPLAY))
                         CERROR("invalid flags %x of resent replay\n",
                                lustre_msg_get_flags(req->rq_reqmsg));
+
+               if (lustre_msg_get_flags(req->rq_reqmsg) & MSG_REPLAY) {
+                       __u32 new_conn;
+
+                       new_conn = lustre_msg_get_conn_cnt(req->rq_reqmsg);
+                       if (new_conn >
+                           lustre_msg_get_conn_cnt(dup_req->rq_reqmsg))
+                               lustre_msg_set_conn_cnt(dup_req->rq_reqmsg,
+                                                       new_conn);
+               }
         } else {
                list_add_tail(&req->rq_replay_list,
                                   &exp->exp_req_replay_queue);
@@ -2746,20 +2757,23 @@ int target_pack_pool_reply(struct ptlrpc_request *req)
 static int target_send_reply_msg(struct ptlrpc_request *req,
                                 int rc, int fail_id)
 {
-        if (OBD_FAIL_CHECK_ORSET(fail_id & ~OBD_FAIL_ONCE, OBD_FAIL_ONCE)) {
-                DEBUG_REQ(D_ERROR, req, "dropping reply");
-                return (-ECOMM);
-        }
+       if (OBD_FAIL_CHECK_ORSET(fail_id & ~OBD_FAIL_ONCE, OBD_FAIL_ONCE)) {
+               DEBUG_REQ(D_ERROR, req, "dropping reply");
+               return -ECOMM;
+       }
+       if (unlikely(lustre_msg_get_opc(req->rq_reqmsg) == MDS_REINT &&
+                    OBD_FAIL_CHECK(OBD_FAIL_MDS_REINT_MULTI_NET_REP)))
+               return -ECOMM;
 
-        if (unlikely(rc)) {
-                DEBUG_REQ(D_NET, req, "processing error (%d)", rc);
-                req->rq_status = rc;
-                return (ptlrpc_send_error(req, 1));
-        } else {
-                DEBUG_REQ(D_NET, req, "sending reply");
-        }
+       if (unlikely(rc)) {
+               DEBUG_REQ(D_NET, req, "processing error (%d)", rc);
+               req->rq_status = rc;
+               return ptlrpc_send_error(req, 1);
+       } else {
+               DEBUG_REQ(D_NET, req, "sending reply");
+       }
 
-        return (ptlrpc_send_reply(req, PTLRPC_REPLY_MAYBE_DIFFICULT));
+       return ptlrpc_send_reply(req, PTLRPC_REPLY_MAYBE_DIFFICULT);
 }
 
 void target_send_reply(struct ptlrpc_request *req, int rc, int fail_id)