rq_sent_final:1, /* stop sending early replies */
rq_hp:1, /* high priority RPC */
rq_at_linked:1, /* link into service's srv_at_array */
- rq_fake:1; /* fake request - just for timeout only */
+ rq_fake:1, /* fake request - just for timeout only */
+ /* a copy of the request is queued to replay during recovery */
+ rq_copy_queued:1,
+ /* whether the rquest is a copy of another replay request */
+ rq_copy:1;
enum rq_phase rq_phase; /* one of RQ_PHASE_* */
enum rq_phase rq_next_phase; /* one of RQ_PHASE_* to be used next */
atomic_t rq_refcount; /* client-side refcount for SENT race,
else
DEBUG_REQ(D_ERROR, req,
"packing failed for abort-reply; skipping");
+
+ LASSERT(req->rq_copy);
+ class_export_rpc_put(req->rq_export);
target_release_saved_req(req);
}
}
req = list_entry(tmp, struct ptlrpc_request, rq_list);
target_exp_dequeue_req_replay(req);
list_del_init(&req->rq_list);
+
+ LASSERT(req->rq_copy);
+ class_export_rpc_put(req->rq_export);
target_release_saved_req(req);
}
EXIT;
obd->obd_next_recovery_transno++;
spin_unlock_bh(&obd->obd_processing_task_lock);
target_exp_dequeue_req_replay(req);
+
+ LASSERT(req->rq_copy);
+ class_export_rpc_put(req->rq_export);
+
class_export_put(req->rq_export);
ptlrpc_req_drop_rs(req);
OBD_FREE(req->rq_reqmsg, req->rq_reqlen);
struct list_head *tmp;
int inserted = 0;
__u64 transno = lustre_msg_get_transno(req->rq_reqmsg);
- struct ptlrpc_request *saved_req;
+ struct ptlrpc_request *saved_req, *orig_req;
struct lustre_msg *reqmsg;
int rc = 0;
memcpy(saved_req, req, sizeof *req);
memcpy(reqmsg, req->rq_reqmsg, req->rq_reqlen);
+ orig_req = req;
req = saved_req;
req->rq_reqmsg = reqmsg;
class_export_get(req->rq_export);
}
obd->obd_requests_queued_for_recovery++;
+ orig_req->rq_copy_queued = 1;
+ req->rq_copy = 1;
if (obd->obd_processing_task != 0) {
/* Someone else is processing this queue, we'll leave it to