[CIFS] Do not send SMBEcho requests on new sockets until SMBNegotiate
authorSteve French <sfrench@us.ibm.com>
Tue, 8 Feb 2011 23:52:32 +0000 (23:52 +0000)
committerSteve French <sfrench@us.ibm.com>
Tue, 8 Feb 2011 23:52:32 +0000 (23:52 +0000)
In order to determine whether an SMBEcho request can be sent
we need to know that the socket is established (server tcpStatus == CifsGood)
AND that an SMB NegotiateProtocol has been sent (server maxBuf != 0).
Without the second check we can send an Echo request during reconnection
before the server can accept it.

CC: JG <jg@cms.ac>
Reviewed-by: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/cifsglob.h
fs/cifs/connect.c

index edd5b29b53c9a354ac6c0a8d934a793c0221cea0..1ab33eb71d95d95dbf4f424c0e95a691feec7e64 100644 (file)
@@ -188,6 +188,8 @@ struct TCP_Server_Info {
        /* multiplexed reads or writes */
        unsigned int maxBuf;    /* maxBuf specifies the maximum */
        /* message size the server can send or receive for non-raw SMBs */
+       /* maxBuf is returned by SMB NegotiateProtocol so maxBuf is only 0 */
+       /* when socket is setup (and during reconnect) before NegProt sent */
        unsigned int max_rw;    /* maxRw specifies the maximum */
        /* message size the server can send or receive for */
        /* SMB_COM_WRITE_RAW or SMB_COM_READ_RAW. */
index 257b6d895e20d519adcb04ff84de9a3cc5cd93c2..10011e99b34dc6412c8f0e3d15263547a870da93 100644 (file)
@@ -341,7 +341,7 @@ cifs_echo_request(struct work_struct *work)
         * 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 ||
+       if ((server->tcpStatus != CifsGood) || (server->maxBuf == 0) ||
            time_before(jiffies, server->lstrp + SMB_ECHO_INTERVAL - HZ))
                goto requeue_echo;