cifs: update ip_addr for ses only for primary chan setup
[sfrench/cifs-2.6.git] / fs / cifs / connect.c
index 6831eb8cea7c0fe97c71db786a8a2c1926bb9152..61872db5d775d70dfb859bd4fd4e341dbc10cba4 100644 (file)
@@ -3708,16 +3708,12 @@ cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
                   struct nls_table *nls_info)
 {
        int rc = -ENOSYS;
-       struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&server->dstaddr;
-       struct sockaddr_in *addr = (struct sockaddr_in *)&server->dstaddr;
+       struct TCP_Server_Info *pserver = CIFS_SERVER_IS_CHAN(server) ? server->primary_server : server;
+       struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&pserver->dstaddr;
+       struct sockaddr_in *addr = (struct sockaddr_in *)&pserver->dstaddr;
        bool is_binding = false;
 
        spin_lock(&ses->ses_lock);
-       if (server->dstaddr.ss_family == AF_INET6)
-               scnprintf(ses->ip_addr, sizeof(ses->ip_addr), "%pI6", &addr6->sin6_addr);
-       else
-               scnprintf(ses->ip_addr, sizeof(ses->ip_addr), "%pI4", &addr->sin_addr);
-
        if (ses->ses_status != SES_GOOD &&
            ses->ses_status != SES_NEW &&
            ses->ses_status != SES_NEED_RECON) {
@@ -3741,6 +3737,14 @@ cifs_setup_session(const unsigned int xid, struct cifs_ses *ses,
                ses->ses_status = SES_IN_SETUP;
        spin_unlock(&ses->ses_lock);
 
+       /* update ses ip_addr only for primary chan */
+       if (server == pserver) {
+               if (server->dstaddr.ss_family == AF_INET6)
+                       scnprintf(ses->ip_addr, sizeof(ses->ip_addr), "%pI6", &addr6->sin6_addr);
+               else
+                       scnprintf(ses->ip_addr, sizeof(ses->ip_addr), "%pI4", &addr->sin_addr);
+       }
+
        if (!is_binding) {
                ses->capabilities = server->capabilities;
                if (!linuxExtEnabled)