summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
c66b43b)
(genops.c:766:class_export_destroy())
ASSERTION(cfs_list_empty(&exp->exp_hp_rpcs)) failed
ptlrpc_server_handle_req_in() call ptlrpc_server_request_add()
and hp request can be added to export->exp_hp_rpcs, but reference
increase at ptlrpc_server_handle_request(). If class_disconnect() and
class_export_destroy() occures before ptlrpc_server_handle_request()
we got ASSERTION.
Signed-off-by: Alexander Boyko <alexander_boyko@xyratex.com>
Reviewed-by: Andrew Perepechko <andrew_perepechko@xyratex.com>
Reviewed-by: Andriy Skulysh <andrew_skulysh@xyratex.com>
Xyratex-bug-id: MRP-649
Change-Id: I3d312c28481143b557d7987501c975c7e287885e
Reviewed-on: http://review.whamcloud.com/3855
Reviewed-by: Liang Zhen <liang@whamcloud.com>
Tested-by: Hudson
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Tested-by: Maloo <whamcloud.maloo@gmail.com>
req->rq_export = class_conn2export(
lustre_msg_get_handle(req->rq_reqmsg));
if (req->rq_export) {
req->rq_export = class_conn2export(
lustre_msg_get_handle(req->rq_reqmsg));
if (req->rq_export) {
+ class_export_rpc_get(req->rq_export);
rc = ptlrpc_check_req(req);
if (rc == 0) {
rc = sptlrpc_target_export_check(req->rq_export, req);
rc = ptlrpc_check_req(req);
if (rc == 0) {
rc = sptlrpc_target_export_check(req->rq_export, req);
+ if (req->rq_export)
+ class_export_rpc_put(req->rq_export);
cfs_spin_lock(&svcpt->scp_req_lock);
svcpt->scp_nreqs_active++;
cfs_spin_unlock(&svcpt->scp_req_lock);
cfs_spin_lock(&svcpt->scp_req_lock);
svcpt->scp_nreqs_active++;
cfs_spin_unlock(&svcpt->scp_req_lock);
at_get(&svcpt->scp_at_estimate));
}
at_get(&svcpt->scp_at_estimate));
}
+ export = request->rq_export;
rc = lu_context_init(&request->rq_session, LCT_SESSION | LCT_NOREF);
if (rc) {
CERROR("Failure to initialize session: %d\n", rc);
rc = lu_context_init(&request->rq_session, LCT_SESSION | LCT_NOREF);
if (rc) {
CERROR("Failure to initialize session: %d\n", rc);
request->rq_svc_thread->t_env->le_ses = &request->rq_session;
if (likely(request->rq_export)) {
request->rq_svc_thread->t_env->le_ses = &request->rq_session;
if (likely(request->rq_export)) {
- if (unlikely(ptlrpc_check_req(request)))
- goto put_conn;
+ if (unlikely(ptlrpc_check_req(request)))
+ goto put_conn;
ptlrpc_update_export_timer(request->rq_export, timediff >> 19);
ptlrpc_update_export_timer(request->rq_export, timediff >> 19);
- export = class_export_rpc_get(request->rq_export);
}
/* Discard requests queued for longer than the deadline.
}
/* Discard requests queued for longer than the deadline.
request->rq_arrival_time.tv_sec),
cfs_time_sub(cfs_time_current_sec(),
request->rq_deadline));
request->rq_arrival_time.tv_sec),
cfs_time_sub(cfs_time_current_sec(),
request->rq_deadline));
}
CDEBUG(D_RPCTRACE, "Handling RPC pname:cluuid+ref:pid:xid:nid:opc "
}
CDEBUG(D_RPCTRACE, "Handling RPC pname:cluuid+ref:pid:xid:nid:opc "
ptlrpc_rqphase_move(request, RQ_PHASE_COMPLETE);
ptlrpc_rqphase_move(request, RQ_PHASE_COMPLETE);
-put_rpc_export:
- if (export != NULL)
- class_export_rpc_put(export);
put_conn:
lu_context_exit(&request->rq_session);
lu_context_fini(&request->rq_session);
put_conn:
lu_context_exit(&request->rq_session);
lu_context_fini(&request->rq_session);
+ if (export != NULL)
+ class_export_rpc_put(export);
ptlrpc_server_finish_request(svcpt, request);
RETURN(1);
ptlrpc_server_finish_request(svcpt, request);
RETURN(1);
cfs_list_del(&req->rq_list);
svcpt->scp_nreqs_active++;
ptlrpc_hpreq_fini(req);
cfs_list_del(&req->rq_list);
svcpt->scp_nreqs_active++;
ptlrpc_hpreq_fini(req);
+
+ if (req->rq_export != NULL)
+ class_export_rpc_put(req->rq_export);
ptlrpc_server_finish_request(svcpt, req);
}
ptlrpc_server_finish_request(svcpt, req);
}