int rc = 0;
        struct nls_table *nls_codepage = NULL;
        struct cifs_ses *ses;
+       int xid;
 
        /*
         * SMB2s NegProt, SessSetup, Logoff do not have tcon yet so
                tcon->need_reopen_files = true;
 
        rc = cifs_tree_connect(0, tcon, nls_codepage);
-       mutex_unlock(&ses->session_mutex);
 
        cifs_dbg(FYI, "reconnect tcon rc = %d\n", rc);
        if (rc) {
                /* If sess reconnected but tcon didn't, something strange ... */
+               mutex_unlock(&ses->session_mutex);
                cifs_dbg(VFS, "reconnect tcon failed rc = %d\n", rc);
                goto out;
        }
 
+       if (!rc &&
+           (server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) {
+               mutex_unlock(&ses->session_mutex);
+
+               /*
+                * query server network interfaces, in case they change
+                */
+               xid = get_xid();
+               rc = SMB3_request_interfaces(xid, tcon, false);
+               free_xid(xid);
+
+               if (rc)
+                       cifs_dbg(FYI, "%s: failed to query server interfaces: %d\n",
+                                __func__, rc);
+
+               if (ses->chan_max > ses->chan_count &&
+                   !SERVER_IS_CHAN(server)) {
+                       if (ses->chan_count == 1)
+                               cifs_server_dbg(VFS, "supports multichannel now\n");
+
+                       cifs_try_adding_channels(ses);
+               }
+       } else {
+               mutex_unlock(&ses->session_mutex);
+       }
+
        if (smb2_command != SMB2_INTERNAL_CMD)
-               mod_delayed_work(cifsiod_wq, &server->reconnect, 0);
+               if (mod_delayed_work(cifsiod_wq, &server->reconnect, 0))
+                       cifs_put_tcp_session(server, false);
 
        atomic_inc(&tconInfoReconnectCount);
 out: