+static int check_for_next_lock(struct obd_device *obd)
+{
+ struct ptlrpc_request *req = NULL;
+ int wake_up = 0;
+
+ spin_lock_bh(&obd->obd_processing_task_lock);
+ if (!list_empty(&obd->obd_lock_replay_queue)) {
+ req = list_entry(obd->obd_lock_replay_queue.next,
+ struct ptlrpc_request, rq_list);
+ CDEBUG(D_HA, "waking for next lock\n");
+ wake_up = 1;
+ } else if (atomic_read(&obd->obd_lock_replay_clients) == 0) {
+ CDEBUG(D_HA, "waking for completed lock replay\n");
+ wake_up = 1;
+ } else if (obd->obd_abort_recovery) {
+ CDEBUG(D_HA, "waking for aborted recovery\n");
+ wake_up = 1;
+ }
+ spin_unlock_bh(&obd->obd_processing_task_lock);
+
+ return wake_up;
+}
+
+static struct ptlrpc_request *
+target_next_replay_lock(struct obd_device *obd)
+{
+ struct l_wait_info lwi = { 0 };
+ struct ptlrpc_request *req;
+
+ CDEBUG(D_HA, "Waiting for lock\n");
+ l_wait_event(obd->obd_next_transno_waitq,
+ check_for_next_lock(obd), &lwi);
+
+ spin_lock_bh(&obd->obd_processing_task_lock);
+ if (obd->obd_abort_recovery) {
+ req = NULL;
+ } else if (!list_empty(&obd->obd_lock_replay_queue)) {
+ req = list_entry(obd->obd_lock_replay_queue.next,
+ struct ptlrpc_request, rq_list);
+ list_del_init(&req->rq_list);
+ } else {
+ req = NULL;
+ }
+ spin_unlock_bh(&obd->obd_processing_task_lock);
+ return req;
+}
+
+static struct ptlrpc_request *
+target_next_final_ping(struct obd_device *obd)
+{
+ struct ptlrpc_request *req;
+
+ spin_lock_bh(&obd->obd_processing_task_lock);
+ if (!list_empty(&obd->obd_final_req_queue)) {
+ req = list_entry(obd->obd_final_req_queue.next,
+ struct ptlrpc_request, rq_list);
+ list_del_init(&req->rq_list);
+ } else {
+ req = NULL;
+ }
+ spin_unlock_bh(&obd->obd_processing_task_lock);
+ return req;
+}
+
+static int req_replay_done(struct obd_export *exp)
+{
+ if (exp->exp_req_replay_needed)
+ return 0;
+ return 1;
+}
+
+static int lock_replay_done(struct obd_export *exp)
+{
+ if (exp->exp_lock_replay_needed)
+ return 0;
+ return 1;
+}
+
+static int connect_done(struct obd_export *exp)
+{
+ if (exp->exp_connected)
+ return 1;
+ return 0;
+}
+
+static int check_for_clients(struct obd_device *obd)
+{
+ if (obd->obd_abort_recovery)
+ return 1;
+ LASSERT(obd->obd_connected_clients <= obd->obd_max_recoverable_clients);
+ if (obd->obd_connected_clients == obd->obd_max_recoverable_clients)
+ return 1;
+ return 0;
+}
+