mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-02 10:16:49 +07:00
cifs: don't send an echo request unless NegProt has been done
When the socket to the server is disconnected, the client more or less immediately calls cifs_reconnect to reconnect the socket. The NegProt and SessSetup however are not done until an actual call needs to be made. With the addition of the SMB echo code, it's possible that the server will initiate a disconnect on an idle socket. The client will then reconnect the socket but no NegotiateProtocol request is done. The SMBEcho workqueue job will then eventually pop, and an SMBEcho will be sent on the socket. The server will then reject it since no NegProt was done. The ideal fix would be to either have the socket not be reconnected until we plan to use it, or to immediately do a NegProt when the reconnect occurs. The code is not structured for this however. For now we must just settle for not sending any echoes until the NegProt is done. Reported-by: JG <jg@cms.ac> Signed-off-by: Jeff Layton <jlayton@redhat.com> Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
parent
e3f0dadb2b
commit
247ec9b418
@ -337,8 +337,12 @@ cifs_echo_request(struct work_struct *work)
|
||||
struct TCP_Server_Info *server = container_of(work,
|
||||
struct TCP_Server_Info, echo.work);
|
||||
|
||||
/* no need to ping if we got a response recently */
|
||||
if (time_before(jiffies, server->lstrp + SMB_ECHO_INTERVAL - HZ))
|
||||
/*
|
||||
* We cannot send an echo until the NEGOTIATE_PROTOCOL request is done.
|
||||
* Also, no need to ping if we got a response recently
|
||||
*/
|
||||
if (server->tcpStatus != CifsGood ||
|
||||
time_before(jiffies, server->lstrp + SMB_ECHO_INTERVAL - HZ))
|
||||
goto requeue_echo;
|
||||
|
||||
rc = CIFSSMBEcho(server);
|
||||
|
Loading…
Reference in New Issue
Block a user