提交 d7833d00 编写于 作者: D David Howells

rxrpc: Queue the call on expiry

When a call expires, it must be queued for the background processor to deal
with otherwise a service call that is improperly terminated will just sit
there awaiting an ACK and won't expire.
Signed-off-by: NDavid Howells <dhowells@redhat.com>
上级 b3156274
...@@ -35,8 +35,11 @@ void rxrpc_set_timer(struct rxrpc_call *call, enum rxrpc_timer_trace why, ...@@ -35,8 +35,11 @@ void rxrpc_set_timer(struct rxrpc_call *call, enum rxrpc_timer_trace why,
if (call->state < RXRPC_CALL_COMPLETE) { if (call->state < RXRPC_CALL_COMPLETE) {
t = call->expire_at; t = call->expire_at;
if (!ktime_after(t, now)) if (!ktime_after(t, now)) {
trace_rxrpc_timer(call, why, now, now_j);
queue = true;
goto out; goto out;
}
if (!ktime_after(call->resend_at, now)) { if (!ktime_after(call->resend_at, now)) {
call->resend_at = call->expire_at; call->resend_at = call->expire_at;
...@@ -76,12 +79,11 @@ void rxrpc_set_timer(struct rxrpc_call *call, enum rxrpc_timer_trace why, ...@@ -76,12 +79,11 @@ void rxrpc_set_timer(struct rxrpc_call *call, enum rxrpc_timer_trace why,
mod_timer(&call->timer, t_j); mod_timer(&call->timer, t_j);
trace_rxrpc_timer(call, why, now, now_j); trace_rxrpc_timer(call, why, now, now_j);
} }
if (queue)
rxrpc_queue_call(call);
} }
out: out:
if (queue)
rxrpc_queue_call(call);
read_unlock_bh(&call->state_lock); read_unlock_bh(&call->state_lock);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册