merged into cifs-2.6.git for-next On Thu, Oct 20, 2016 at 8:33 PM, Pavel Shilovsky <piastryyy@xxxxxxxxx> wrote: > 2016-10-20 16:52 GMT-07:00 Sachin Prabhu <sprabhu@xxxxxxxxxx>: >> Commit 4fcd1813e640 ("Fix reconnect to not defer smb3 session reconnect >> long after socket reconnect") changes the behaviour of the SMB2 echo >> service and causes it to renegotiate after a socket reconnect. However >> under default settings, the echo service could take up to 120 seconds to >> be scheduled. >> >> The patch forces the echo service to be called immediately resulting a >> negotiate call being made immediately on reconnect. >> >> Signed-off-by: Sachin Prabhu <sprabhu@xxxxxxxxxx> >> --- >> fs/cifs/connect.c | 25 ++++++++++++++++++------- >> 1 file changed, 18 insertions(+), 7 deletions(-) >> >> diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c >> index aab5227..4547aed 100644 >> --- a/fs/cifs/connect.c >> +++ b/fs/cifs/connect.c >> @@ -412,6 +412,9 @@ cifs_reconnect(struct TCP_Server_Info *server) >> } >> } while (server->tcpStatus == CifsNeedReconnect); >> >> + if (server->tcpStatus == CifsNeedNegotiate) >> + mod_delayed_work(cifsiod_wq, &server->echo, 0); >> + >> return rc; >> } >> >> @@ -421,17 +424,25 @@ cifs_echo_request(struct work_struct *work) >> int rc; >> struct TCP_Server_Info *server = container_of(work, >> struct TCP_Server_Info, echo.work); >> - unsigned long echo_interval = server->echo_interval; >> + unsigned long echo_interval; >> + >> + /* >> + * If we need to renegotiate, set echo interval to zero to >> + * immediately call echo service where we can renegotiate. >> + */ >> + if (server->tcpStatus == CifsNeedNegotiate) >> + echo_interval = 0; >> + else >> + echo_interval = server->echo_interval; >> >> /* >> - * We cannot send an echo if it is disabled or until the >> - * NEGOTIATE_PROTOCOL request is done, which is indicated by >> - * server->ops->need_neg() == true. Also, no need to ping if >> - * we got a response recently. >> + * We cannot send an echo if it is disabled. >> + * Also, no need to ping if we got a response recently. >> */ >> >> if (server->tcpStatus == CifsNeedReconnect || >> - server->tcpStatus == CifsExiting || server->tcpStatus == CifsNew || >> + server->tcpStatus == CifsExiting || >> + server->tcpStatus == CifsNew || >> (server->ops->can_echo && !server->ops->can_echo(server)) || >> time_before(jiffies, server->lstrp + echo_interval - HZ)) >> goto requeue_echo; >> @@ -442,7 +453,7 @@ cifs_echo_request(struct work_struct *work) >> server->hostname); >> >> requeue_echo: >> - queue_delayed_work(cifsiod_wq, &server->echo, echo_interval); >> + queue_delayed_work(cifsiod_wq, &server->echo, server->echo_interval); >> } >> >> static bool >> -- >> 2.7.4 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-cifs" in >> the body of a message to majordomo@xxxxxxxxxxxxxxx >> More majordomo info at http://vger.kernel.org/majordomo-info.html > > Reviewed-by: Pavel Shilovsky <pshilov@xxxxxxxxxxxxx> > > -- > Best regards, > Pavel Shilovsky > -- > To unsubscribe from this list: send the line "unsubscribe linux-cifs" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Thanks, Steve -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html