diff options
Diffstat (limited to 'fs/afs/rxrpc.c')
-rw-r--r-- | fs/afs/rxrpc.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/fs/afs/rxrpc.c b/fs/afs/rxrpc.c index 59970886690f..a7b44863d502 100644 --- a/fs/afs/rxrpc.c +++ b/fs/afs/rxrpc.c | |||
@@ -576,6 +576,7 @@ static long afs_wait_for_call_to_complete(struct afs_call *call, | |||
576 | { | 576 | { |
577 | signed long rtt2, timeout; | 577 | signed long rtt2, timeout; |
578 | long ret; | 578 | long ret; |
579 | bool stalled = false; | ||
579 | u64 rtt; | 580 | u64 rtt; |
580 | u32 life, last_life; | 581 | u32 life, last_life; |
581 | 582 | ||
@@ -609,12 +610,20 @@ static long afs_wait_for_call_to_complete(struct afs_call *call, | |||
609 | 610 | ||
610 | life = rxrpc_kernel_check_life(call->net->socket, call->rxcall); | 611 | life = rxrpc_kernel_check_life(call->net->socket, call->rxcall); |
611 | if (timeout == 0 && | 612 | if (timeout == 0 && |
612 | life == last_life && signal_pending(current)) | 613 | life == last_life && signal_pending(current)) { |
614 | if (stalled) | ||
613 | break; | 615 | break; |
616 | __set_current_state(TASK_RUNNING); | ||
617 | rxrpc_kernel_probe_life(call->net->socket, call->rxcall); | ||
618 | timeout = rtt2; | ||
619 | stalled = true; | ||
620 | continue; | ||
621 | } | ||
614 | 622 | ||
615 | if (life != last_life) { | 623 | if (life != last_life) { |
616 | timeout = rtt2; | 624 | timeout = rtt2; |
617 | last_life = life; | 625 | last_life = life; |
626 | stalled = false; | ||
618 | } | 627 | } |
619 | 628 | ||
620 | timeout = schedule_timeout(timeout); | 629 | timeout = schedule_timeout(timeout); |