diff options
-rw-r--r-- | fs/cifs/connect.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index aab5227979e2..4547aeddd12b 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -412,6 +412,9 @@ cifs_reconnect(struct TCP_Server_Info *server) | |||
412 | } | 412 | } |
413 | } while (server->tcpStatus == CifsNeedReconnect); | 413 | } while (server->tcpStatus == CifsNeedReconnect); |
414 | 414 | ||
415 | if (server->tcpStatus == CifsNeedNegotiate) | ||
416 | mod_delayed_work(cifsiod_wq, &server->echo, 0); | ||
417 | |||
415 | return rc; | 418 | return rc; |
416 | } | 419 | } |
417 | 420 | ||
@@ -421,17 +424,25 @@ cifs_echo_request(struct work_struct *work) | |||
421 | int rc; | 424 | int rc; |
422 | struct TCP_Server_Info *server = container_of(work, | 425 | struct TCP_Server_Info *server = container_of(work, |
423 | struct TCP_Server_Info, echo.work); | 426 | struct TCP_Server_Info, echo.work); |
424 | unsigned long echo_interval = server->echo_interval; | 427 | unsigned long echo_interval; |
428 | |||
429 | /* | ||
430 | * If we need to renegotiate, set echo interval to zero to | ||
431 | * immediately call echo service where we can renegotiate. | ||
432 | */ | ||
433 | if (server->tcpStatus == CifsNeedNegotiate) | ||
434 | echo_interval = 0; | ||
435 | else | ||
436 | echo_interval = server->echo_interval; | ||
425 | 437 | ||
426 | /* | 438 | /* |
427 | * We cannot send an echo if it is disabled or until the | 439 | * We cannot send an echo if it is disabled. |
428 | * NEGOTIATE_PROTOCOL request is done, which is indicated by | 440 | * Also, no need to ping if we got a response recently. |
429 | * server->ops->need_neg() == true. Also, no need to ping if | ||
430 | * we got a response recently. | ||
431 | */ | 441 | */ |
432 | 442 | ||
433 | if (server->tcpStatus == CifsNeedReconnect || | 443 | if (server->tcpStatus == CifsNeedReconnect || |
434 | server->tcpStatus == CifsExiting || server->tcpStatus == CifsNew || | 444 | server->tcpStatus == CifsExiting || |
445 | server->tcpStatus == CifsNew || | ||
435 | (server->ops->can_echo && !server->ops->can_echo(server)) || | 446 | (server->ops->can_echo && !server->ops->can_echo(server)) || |
436 | time_before(jiffies, server->lstrp + echo_interval - HZ)) | 447 | time_before(jiffies, server->lstrp + echo_interval - HZ)) |
437 | goto requeue_echo; | 448 | goto requeue_echo; |
@@ -442,7 +453,7 @@ cifs_echo_request(struct work_struct *work) | |||
442 | server->hostname); | 453 | server->hostname); |
443 | 454 | ||
444 | requeue_echo: | 455 | requeue_echo: |
445 | queue_delayed_work(cifsiod_wq, &server->echo, echo_interval); | 456 | queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval); |
446 | } | 457 | } |
447 | 458 | ||
448 | static bool | 459 | static bool |