diff --git a/lustre/ldlm/ldlm_request.c b/lustre/ldlm/ldlm_request.c
index e32a1032889544242a5785334a486c07eb07959f..7e79cd87d6ffd2b12ea244deea75d2d11fa58ff5 100644
--- a/lustre/ldlm/ldlm_request.c
+++ b/lustre/ldlm/ldlm_request.c
@@ -511,6 +511,7 @@ int ldlm_cli_cancel(struct lustre_handle *lockh)
                         goto local_cancel;
                 }
 
+        restart:
                 imp = class_exp2cliimp(lock->l_conn_export);
                 if (imp == NULL || imp->imp_invalid) {
                         CDEBUG(D_HA, "skipping cancel on invalid import %p\n",
@@ -521,6 +522,7 @@ int ldlm_cli_cancel(struct lustre_handle *lockh)
                 req = ptlrpc_prep_req(imp, LDLM_CANCEL, 1, &size, NULL);
                 if (!req)
                         GOTO(out, rc = -ENOMEM);
+                req->rq_no_resend = 1;
 
                 /* XXX FIXME bug 249 */
                 req->rq_request_portal = LDLM_CANCEL_REQUEST_PORTAL;
@@ -534,13 +536,17 @@ int ldlm_cli_cancel(struct lustre_handle *lockh)
 
                 rc = ptlrpc_queue_wait(req);
 
-                if (rc == ESTALE)
+                if (rc == ESTALE) {
                         CERROR("client/server (nid "LPU64") out of sync--not "
                                "fatal\n",
                                req->rq_import->imp_connection->c_peer.peer_nid);
-                else if (rc != ELDLM_OK)
+                } else if (rc == -ETIMEDOUT) {
+                        ptlrpc_req_finished(req);
+                        GOTO(restart, rc);
+                } else if (rc != ELDLM_OK) {
                         CERROR("Got rc %d from cancel RPC: canceling "
                                "anyway\n", rc);
+                }
 
                 ptlrpc_req_finished(req);
         local_cancel: