|
@@ -52,6 +52,9 @@
|
|
|
#define CIFS_PORT 445
|
|
|
#define RFC1001_PORT 139
|
|
|
|
|
|
+/* SMB echo "timeout" -- FIXME: tunable? */
|
|
|
+#define SMB_ECHO_INTERVAL (60 * HZ)
|
|
|
+
|
|
|
extern void SMBNTencrypt(unsigned char *passwd, unsigned char *c8,
|
|
|
unsigned char *p24);
|
|
|
|
|
@@ -333,6 +336,26 @@ static int coalesce_t2(struct smb_hdr *psecond, struct smb_hdr *pTargetSMB)
|
|
|
|
|
|
}
|
|
|
|
|
|
+static void
|
|
|
+cifs_echo_request(struct work_struct *work)
|
|
|
+{
|
|
|
+ int rc;
|
|
|
+ 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))
|
|
|
+ goto requeue_echo;
|
|
|
+
|
|
|
+ rc = CIFSSMBEcho(server);
|
|
|
+ if (rc)
|
|
|
+ cFYI(1, "Unable to send echo request to server: %s",
|
|
|
+ server->hostname);
|
|
|
+
|
|
|
+requeue_echo:
|
|
|
+ queue_delayed_work(system_nrt_wq, &server->echo, SMB_ECHO_INTERVAL);
|
|
|
+}
|
|
|
+
|
|
|
static int
|
|
|
cifs_demultiplex_thread(struct TCP_Server_Info *server)
|
|
|
{
|
|
@@ -1571,6 +1594,8 @@ cifs_put_tcp_session(struct TCP_Server_Info *server)
|
|
|
list_del_init(&server->tcp_ses_list);
|
|
|
spin_unlock(&cifs_tcp_ses_lock);
|
|
|
|
|
|
+ cancel_delayed_work_sync(&server->echo);
|
|
|
+
|
|
|
spin_lock(&GlobalMid_Lock);
|
|
|
server->tcpStatus = CifsExiting;
|
|
|
spin_unlock(&GlobalMid_Lock);
|
|
@@ -1662,6 +1687,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info)
|
|
|
tcp_ses->sequence_number = 0;
|
|
|
INIT_LIST_HEAD(&tcp_ses->tcp_ses_list);
|
|
|
INIT_LIST_HEAD(&tcp_ses->smb_ses_list);
|
|
|
+ INIT_DELAYED_WORK(&tcp_ses->echo, cifs_echo_request);
|
|
|
|
|
|
/*
|
|
|
* at this point we are the only ones with the pointer
|
|
@@ -1710,6 +1736,9 @@ cifs_get_tcp_session(struct smb_vol *volume_info)
|
|
|
|
|
|
cifs_fscache_get_client_cookie(tcp_ses);
|
|
|
|
|
|
+ /* queue echo request delayed work */
|
|
|
+ queue_delayed_work(system_nrt_wq, &tcp_ses->echo, SMB_ECHO_INTERVAL);
|
|
|
+
|
|
|
return tcp_ses;
|
|
|
|
|
|
out_err_crypto_release:
|