Commit d7833d00 authored by David Howells's avatar 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: default avatarDavid Howells <dhowells@redhat.com>
parent 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%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment