+static void mdt_steal_ack_locks(struct ptlrpc_request *req)
+{
+ struct obd_export *exp = req->rq_export;
+ struct list_head *tmp;
+ struct ptlrpc_reply_state *oldrep;
+ struct ptlrpc_service *svc;
+ int i;
+
+ /* CAVEAT EMPTOR: spinlock order */
+ spin_lock(&exp->exp_lock);
+ list_for_each (tmp, &exp->exp_outstanding_replies) {
+ oldrep = list_entry(tmp, struct ptlrpc_reply_state,rs_exp_list);
+
+ if (oldrep->rs_xid != req->rq_xid)
+ continue;
+
+ if (lustre_msg_get_opc(oldrep->rs_msg) !=
+ lustre_msg_get_opc(req->rq_reqmsg))
+ CERROR ("Resent req xid "LPX64" has mismatched opc: "
+ "new %d old %d\n", req->rq_xid,
+ lustre_msg_get_opc(req->rq_reqmsg),
+ lustre_msg_get_opc(oldrep->rs_msg));
+
+ svc = oldrep->rs_service;
+ spin_lock (&svc->srv_lock);
+
+ list_del_init (&oldrep->rs_exp_list);
+
+ CWARN("Stealing %d locks from rs %p x"LPD64".t"LPD64
+ " o%d NID %s\n",
+ oldrep->rs_nlocks, oldrep,
+ oldrep->rs_xid, oldrep->rs_transno,
+ lustre_msg_get_opc(oldrep->rs_msg),
+ libcfs_nid2str(exp->exp_connection->c_peer.nid));
+
+ for (i = 0; i < oldrep->rs_nlocks; i++)
+ ptlrpc_save_lock(req, &oldrep->rs_locks[i],
+ oldrep->rs_modes[i], 0);
+ oldrep->rs_nlocks = 0;
+
+ DEBUG_REQ(D_HA, req, "stole locks for");
+ spin_lock(&oldrep->rs_lock);
+ ptlrpc_schedule_difficult_reply (oldrep);
+ spin_unlock(&oldrep->rs_lock);
+
+ spin_unlock (&svc->srv_lock);
+ break;
+ }
+ spin_unlock(&exp->exp_lock);
+}
+
+void mdt_req_from_lcd(struct ptlrpc_request *req,
+ struct lsd_client_data *lcd)