|
@@ -1812,6 +1812,33 @@ SMB2_echo(struct TCP_Server_Info *server)
|
|
|
|
|
|
cifs_dbg(FYI, "In echo request\n");
|
|
|
|
|
|
+ if (server->tcpStatus == CifsNeedNegotiate) {
|
|
|
+ struct list_head *tmp, *tmp2;
|
|
|
+ struct cifs_ses *ses;
|
|
|
+ struct cifs_tcon *tcon;
|
|
|
+
|
|
|
+ cifs_dbg(FYI, "Need negotiate, reconnecting tcons\n");
|
|
|
+ spin_lock(&cifs_tcp_ses_lock);
|
|
|
+ list_for_each(tmp, &server->smb_ses_list) {
|
|
|
+ ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
|
|
|
+ list_for_each(tmp2, &ses->tcon_list) {
|
|
|
+ tcon = list_entry(tmp2, struct cifs_tcon,
|
|
|
+ tcon_list);
|
|
|
+ /* add check for persistent handle reconnect */
|
|
|
+ if (tcon && tcon->need_reconnect) {
|
|
|
+ spin_unlock(&cifs_tcp_ses_lock);
|
|
|
+ rc = smb2_reconnect(SMB2_ECHO, tcon);
|
|
|
+ spin_lock(&cifs_tcp_ses_lock);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ spin_unlock(&cifs_tcp_ses_lock);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* if no session, renegotiate failed above */
|
|
|
+ if (server->tcpStatus == CifsNeedNegotiate)
|
|
|
+ return -EIO;
|
|
|
+
|
|
|
rc = small_smb2_init(SMB2_ECHO, NULL, (void **)&req);
|
|
|
if (rc)
|
|
|
return rc;
|