diff options
Diffstat (limited to 'net/rxrpc/ar-call.c')
-rw-r--r-- | net/rxrpc/ar-call.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/net/rxrpc/ar-call.c b/net/rxrpc/ar-call.c index 909d092de9f4..bf656c230ba9 100644 --- a/net/rxrpc/ar-call.c +++ b/net/rxrpc/ar-call.c | |||
@@ -786,6 +786,7 @@ static void rxrpc_call_life_expired(unsigned long _call) | |||
786 | 786 | ||
787 | /* | 787 | /* |
788 | * handle resend timer expiry | 788 | * handle resend timer expiry |
789 | * - may not take call->state_lock as this can deadlock against del_timer_sync() | ||
789 | */ | 790 | */ |
790 | static void rxrpc_resend_time_expired(unsigned long _call) | 791 | static void rxrpc_resend_time_expired(unsigned long _call) |
791 | { | 792 | { |
@@ -796,12 +797,9 @@ static void rxrpc_resend_time_expired(unsigned long _call) | |||
796 | if (call->state >= RXRPC_CALL_COMPLETE) | 797 | if (call->state >= RXRPC_CALL_COMPLETE) |
797 | return; | 798 | return; |
798 | 799 | ||
799 | read_lock_bh(&call->state_lock); | ||
800 | clear_bit(RXRPC_CALL_RUN_RTIMER, &call->flags); | 800 | clear_bit(RXRPC_CALL_RUN_RTIMER, &call->flags); |
801 | if (call->state < RXRPC_CALL_COMPLETE && | 801 | if (!test_and_set_bit(RXRPC_CALL_RESEND_TIMER, &call->events)) |
802 | !test_and_set_bit(RXRPC_CALL_RESEND_TIMER, &call->events)) | ||
803 | rxrpc_queue_call(call); | 802 | rxrpc_queue_call(call); |
804 | read_unlock_bh(&call->state_lock); | ||
805 | } | 803 | } |
806 | 804 | ||
807 | /* | 805 | /* |