struct ptlrpc_request_buffer_desc *rqbd = req->rq_rqbd;
struct ptlrpc_service_part *svcpt = rqbd->rqbd_svcpt;
struct ptlrpc_service *svc = svcpt->scp_service;
- int refcount;
- cfs_list_t *tmp;
- cfs_list_t *nxt;
+ int refcount;
+ cfs_list_t *tmp;
+ cfs_list_t *nxt;
- if (!cfs_atomic_dec_and_test(&req->rq_refcount))
- return;
+ if (!cfs_atomic_dec_and_test(&req->rq_refcount))
+ return;
+
+ if (req->rq_session.lc_state == LCS_ENTERED) {
+ lu_context_exit(&req->rq_session);
+ lu_context_fini(&req->rq_session);
+ }
if (req->rq_at_linked) {
spin_lock(&svcpt->scp_at_lock);
{
ptlrpc_server_hpreq_fini(req);
- if (req->rq_session.lc_thread != NULL) {
- lu_context_exit(&req->rq_session);
- lu_context_fini(&req->rq_session);
- }
-
ptlrpc_server_drop_request(req);
}
if (rc < 0)
RETURN(rc);
+ /* the current thread is not the processing thread for this request
+ * since that, but request is in exp_hp_list and can be find there.
+ * Remove all relations between request and old thread. */
+ req->rq_svc_thread->t_env->le_ses = NULL;
+ req->rq_svc_thread = NULL;
+ req->rq_session.lc_thread = NULL;
+
ptlrpc_nrs_req_add(svcpt, req, !!rc);
RETURN(0);
}
req->rq_session.lc_thread = thread;
lu_context_enter(&req->rq_session);
- req->rq_svc_thread->t_env->le_ses = &req->rq_session;
+ thread->t_env->le_ses = &req->rq_session;
}
ptlrpc_at_add_timed(req);
/* re-assign request and sesson thread to the current one */
request->rq_svc_thread = thread;
if (thread != NULL) {
- LASSERT(request->rq_session.lc_thread != NULL);
+ LASSERT(request->rq_session.lc_thread == NULL);
request->rq_session.lc_thread = thread;
- request->rq_session.lc_cookie = 0x55;
thread->t_env->le_ses = &request->rq_session;
}
svc->srv_ops.so_req_handler(request);
ptlrpc_start_thread(svcpt, 0);
}
+ /* reset le_ses to initial state */
+ env->le_ses = NULL;
/* Process all incoming reqs before handling any */
if (ptlrpc_server_request_incoming(svcpt)) {
lu_context_enter(&env->le_ctx);
- env->le_ses = NULL;
ptlrpc_server_handle_req_in(svcpt, thread);
lu_context_exit(&env->le_ctx);