Whamcloud - gitweb
LU-14594 ptlrpc: do not match reply with resent RPC
[fs/lustre-release.git] / lustre / ptlrpc / service.c
index bbe46a8..9bc2bcd 100644 (file)
@@ -1352,7 +1352,8 @@ static int ptlrpc_at_send_early_reply(struct ptlrpc_request *req)
 
        ENTRY;
 
-       if (CFS_FAIL_CHECK(OBD_FAIL_TGT_REPLAY_RECONNECT)) {
+       if (CFS_FAIL_CHECK(OBD_FAIL_TGT_REPLAY_RECONNECT) ||
+           CFS_FAIL_PRECHECK(OBD_FAIL_PTLRPC_ENQ_RESEND)) {
                /* don't send early reply */
                RETURN(1);
        }
@@ -1858,6 +1859,7 @@ static int ptlrpc_server_request_add(struct ptlrpc_service_part *svcpt,
                                ptlrpc_at_remove_timed(orig);
                        spin_unlock(&orig->rq_rqbd->rqbd_svcpt->scp_at_lock);
                        orig->rq_deadline = req->rq_deadline;
+                       orig->rq_rep_mbits = req->rq_rep_mbits;
                        if (likely(linked))
                                ptlrpc_at_add_timed(orig);
                        ptlrpc_server_drop_request(orig);
@@ -2051,6 +2053,7 @@ static int ptlrpc_server_handle_req_in(struct ptlrpc_service_part *svcpt,
        struct ptlrpc_service *svc = svcpt->scp_service;
        struct ptlrpc_request *req;
        __u32 deadline;
+       __u32 opc;
        int rc;
 
        ENTRY;
@@ -2107,8 +2110,9 @@ static int ptlrpc_server_handle_req_in(struct ptlrpc_service_part *svcpt,
                goto err_req;
        }
 
+       opc = lustre_msg_get_opc(req->rq_reqmsg);
        if (OBD_FAIL_CHECK(OBD_FAIL_PTLRPC_DROP_REQ_OPC) &&
-           lustre_msg_get_opc(req->rq_reqmsg) == cfs_fail_val) {
+           opc == cfs_fail_val) {
                CERROR("drop incoming rpc opc %u, x%llu\n",
                       cfs_fail_val, req->rq_xid);
                goto err_req;
@@ -2122,7 +2126,7 @@ static int ptlrpc_server_handle_req_in(struct ptlrpc_service_part *svcpt,
                goto err_req;
        }
 
-       switch (lustre_msg_get_opc(req->rq_reqmsg)) {
+       switch (opc) {
        case MDS_WRITEPAGE:
        case OST_WRITE:
        case OUT_UPDATE:
@@ -2193,8 +2197,20 @@ static int ptlrpc_server_handle_req_in(struct ptlrpc_service_part *svcpt,
                thread->t_env->le_ses = &req->rq_session;
        }
 
+
+       if (unlikely(OBD_FAIL_PRECHECK(OBD_FAIL_PTLRPC_ENQ_RESEND) &&
+                    (opc == LDLM_ENQUEUE) &&
+                    (lustre_msg_get_flags(req->rq_reqmsg) & MSG_RESENT)))
+               OBD_FAIL_TIMEOUT(OBD_FAIL_PTLRPC_ENQ_RESEND, 6);
+
        ptlrpc_at_add_timed(req);
 
+       if (opc != OST_CONNECT && opc != MDS_CONNECT &&
+           opc != MGS_CONNECT && req->rq_export != NULL) {
+               if (exp_connect_flags2(req->rq_export) & OBD_CONNECT2_REP_MBITS)
+                       req->rq_rep_mbits = lustre_msg_get_mbits(req->rq_reqmsg);
+       }
+
        /* Move it over to the request processing queue */
        rc = ptlrpc_server_request_add(svcpt, req);
        if (rc)