return rc;
}
-//extern int mdt_reconstruct(struct mdt_thread_info *);
static int mdt_reint_internal(struct mdt_thread_info *info, __u32 op)
{
int rc;
/* FIXME: fake untill journal callback is OK.*/
struct lu_context_key mdt_txn_key;
-int mdt_update_last_transno(struct mdt_thread_info *info, int rc)
+static inline void mdt_finish_reply(struct mdt_thread_info *info, int rc)
{
struct mdt_device *mdt = info->mti_mdt;
struct ptlrpc_request *req = mdt_info_req(info);
struct obd_export *exp = req->rq_export;
- __u64 last_transno;
- __u64 last_committed;
if (mdt == NULL || req == NULL || req->rq_repmsg == NULL)
- return -EFAULT;
- if (info->mti_trans_flags & MDT_NONEED_TANSNO)
- return 0;
-
- last_committed = mdt->mdt_last_committed;
+ LBUG();
- if (rc == 0) {
- last_transno = info->mti_transno;
- } else {
- if (info->mti_transno != 0)
- CERROR("replay %s transno "LPU64" failed: rc %d\n",
- libcfs_nid2str(exp->exp_connection->c_peer.nid),
- info->mti_transno, rc);
- last_transno = 0;
+ if (info->mti_trans_flags & MDT_NONEED_TRANSNO)
+ return;
+
+ /*XXX: assert on this when all code will be finished */
+ if (rc != 0 && info->mti_transno != 0) {
+ info->mti_transno = 0;
+ CERROR("Transno is not 0 while rc is %i!\n", rc);
}
+
CDEBUG(D_INODE, "last_transno = %llu, last_committed = %llu\n",
- last_transno, last_committed);
+ mdt->mdt_last_transno, exp->exp_obd->obd_last_committed);
- req->rq_repmsg->transno = req->rq_transno = last_transno;
+ spin_lock(mdt->mdt_transno_lock);
+ req->rq_repmsg->transno = req->rq_transno = info->mti_transno;
+ req->rq_repmsg->last_committed = exp->exp_obd->obd_last_committed;
+ spin_unlock(mdt->mdt_transno_lock);
req->rq_repmsg->last_xid = req->rq_xid;
- req->rq_repmsg->last_committed = last_committed;
- exp->exp_obd->obd_last_committed = last_committed;
- return 0;
}
/*
if (h->mh_opc != MDS_DISCONNECT &&
h->mh_opc != MDS_READPAGE &&
h->mh_opc != LDLM_ENQUEUE) {
- mdt_update_last_transno(info, result);
+ mdt_finish_reply(info, result);
}
RETURN(result);
}
rep->lock_policy_res2 = rc;
intent_set_disposition(rep, DISP_IT_EXECD);
-
- mdt_update_last_transno(info, rep->lock_policy_res2);
+
+ mdt_finish_reply(info, rc);
RETURN(ELDLM_LOCK_ABORTED);
}
LASSERT(info != NULL);
obd = class_name2obd(dev);
-
+ LASSERT(obd);
+
spin_lock_init(&m->mdt_transno_lock);
+#if 0
/* FIXME: We need to load them from disk. But now fake it */
m->mdt_last_transno = 1;
m->mdt_last_committed = 1;
+#endif
m->mdt_max_mdsize = MAX_MD_SIZE;
m->mdt_max_cookiesize = sizeof(struct llog_cookie);
//ldlm_cancel_locks_for_export(exp);
/* complete all outstanding replies */
- spin_lock_irqsave(&exp->exp_lock, irqflags);
+ spin_lock(&exp->exp_lock);
while (!list_empty(&exp->exp_outstanding_replies)) {
struct ptlrpc_reply_state *rs =
list_entry(exp->exp_outstanding_replies.next,
ptlrpc_schedule_difficult_reply(rs);
spin_unlock(&svc->srv_lock);
}
- spin_unlock_irqrestore(&exp->exp_lock, irqflags);
+ spin_unlock(&exp->exp_lock);
class_export_put(exp);
RETURN(rc);
GOTO(err_client, rc);
spin_lock(&mdt->mdt_transno_lock);
+ /* obd_last_committed is used for compatibility
+ * with other lustre recovery code */
obd->obd_last_committed = mdt->mdt_last_transno;
spin_unlock(&mdt->mdt_transno_lock);
/*TODO: checks for recovery cases, see mds_finish_transno */
spin_lock(&mdt->mdt_transno_lock);
- if (mti->mti_transno == 0) {
+ if (txn->th_result != 0) {
+ if (mti->mti_transno != 0) {
+ CERROR("Replay transno "LPU64" failed: rc %i\n",
+ mti->mti_transno, txn->th_result);
+ mti->mti_transno = 0;
+ }
+ } else if (mti->mti_transno == 0) {
mti->mti_transno = ++ mdt->mdt_last_transno;
} else {
/* replay */
if (mti->mti_transno > mdt->mdt_last_transno)
mdt->mdt_last_transno = mti->mti_transno;
}
- spin_unlock(&mdt->mdt_transno_lock);
/* save transno for the commit callback */
txi->txi_transno = mti->mti_transno;
+ spin_unlock(&mdt->mdt_transno_lock);
return 0;//mdt_update_last_rcvd(mti, dev, txn);
}
struct mdt_txn_info *txi;
txi = lu_context_key_get(&txn->th_ctx, &mdt_txn_key);
+
+ /* copy of obd_transno_commit_cb() but with locking */
spin_lock(&mdt->mdt_transno_lock);
- if (txi->txi_transno > mdt->mdt_last_committed) {
- mdt->mdt_last_committed = txi->txi_transno;
+ if (txi->txi_transno > obd->obd_last_committed) {
+ obd->obd_last_committed = txi->txi_transno;
spin_unlock(&mdt->mdt_transno_lock);
ptlrpc_commit_replies (obd);
} else