mdt->mdt_txn_cb.dtc_txn_stop = mdt_txn_stop_cb;
mdt->mdt_txn_cb.dtc_txn_commit = mdt_txn_commit_cb;
mdt->mdt_txn_cb.dtc_cookie = mdt;
- INIT_LIST_HEAD(&mdt->mdt_txn_cb.dtc_linkage);
+ CFS_INIT_LIST_HEAD(&mdt->mdt_txn_cb.dtc_linkage);
dt_txn_callback_add(mdt->mdt_bottom, &mdt->mdt_txn_cb);
}
/* reconstruction code */
-extern void mds_steal_ack_locks(struct ptlrpc_request *req);
+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]);
+ oldrep->rs_nlocks = 0;
+
+ DEBUG_REQ(D_HA, req, "stole locks for");
+ ptlrpc_schedule_difficult_reply (oldrep);
+
+ spin_unlock (&svc->srv_lock);
+ break;
+ }
+ spin_unlock(&exp->exp_lock);
+}
+
void mdt_req_from_mcd(struct ptlrpc_request *req,
struct mdt_client_data *mcd)
{
lustre_msg_set_transno(req->rq_repmsg, req->rq_transno);
lustre_msg_set_status(req->rq_repmsg, req->rq_status);
}
- mds_steal_ack_locks(req);
+ mdt_steal_ack_locks(req);
}
void mdt_reconstruct_generic(struct mdt_thread_info *mti,
struct mdt_lock_handle *lhc)
{
struct ptlrpc_request *req = mdt_info_req(mti);
- struct mdt_export_data *med = &req->rq_export->exp_mdt_data;
+ struct obd_export *exp = req->rq_export;
+ struct mdt_export_data *med = &exp->exp_mdt_data;
struct mdt_device *mdt = mti->mti_mdt;
struct mdt_object *child;
struct mdt_body *body;
/* if no error, so child was created with requested fid */
child = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid2);
- LASSERT(!IS_ERR(child));
+ if (IS_ERR(child)) {
+ rc = PTR_ERR(child);
+ LCONSOLE_WARN("Child "DFID" lookup error %d."
+ " Evicting client %s with export %s.\n",
+ PFID(mdt_object_fid(child)), rc,
+ obd_uuid2str(&exp->exp_client_uuid),
+ obd_export_nid2str(exp));
+ mdt_export_evict(exp);
+ EXIT;
+ return;
+ }
body = req_capsule_server_get(mti->mti_pill, &RMF_MDT_BODY);
rc = mo_attr_get(mti->mti_env, mdt_object_child(child), &mti->mti_attr);
struct mdt_lock_handle *lhc)
{
struct ptlrpc_request *req = mdt_info_req(mti);
- struct mdt_export_data *med = &req->rq_export->exp_mdt_data;
+ struct obd_export *exp = req->rq_export;
+ struct mdt_export_data *med = &exp->exp_mdt_data;
struct mdt_device *mdt = mti->mti_mdt;
struct mdt_object *obj;
struct mdt_body *body;
body = req_capsule_server_get(mti->mti_pill, &RMF_MDT_BODY);
obj = mdt_object_find(mti->mti_env, mdt, mti->mti_rr.rr_fid1);
- LASSERT(!IS_ERR(obj));
+ if (IS_ERR(obj)) {
+ int rc = PTR_ERR(obj);
+ LCONSOLE_WARN(""DFID" lookup error %d."
+ " Evicting client %s with export %s.\n",
+ PFID(mdt_object_fid(obj)), rc,
+ obd_uuid2str(&exp->exp_client_uuid),
+ obd_export_nid2str(exp));
+ mdt_export_evict(exp);
+ EXIT;
+ return;
+ }
mo_attr_get(mti->mti_env, mdt_object_child(obj), &mti->mti_attr);
mdt_pack_attr2body(mti, body, &mti->mti_attr.ma_attr,
mdt_object_fid(obj));