diff options
Diffstat (limited to 'fs/cifs/connect.c')
-rw-r--r-- | fs/cifs/connect.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 18d3c7724d6e..0cc3b81c2e84 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -1568,6 +1568,9 @@ cifs_find_tcp_session(struct sockaddr *addr, struct smb_vol *vol) | |||
1568 | 1568 | ||
1569 | spin_lock(&cifs_tcp_ses_lock); | 1569 | spin_lock(&cifs_tcp_ses_lock); |
1570 | list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) { | 1570 | list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) { |
1571 | if (!net_eq(cifs_net_ns(server), current->nsproxy->net_ns)) | ||
1572 | continue; | ||
1573 | |||
1571 | if (!match_address(server, addr, | 1574 | if (!match_address(server, addr, |
1572 | (struct sockaddr *)&vol->srcaddr)) | 1575 | (struct sockaddr *)&vol->srcaddr)) |
1573 | continue; | 1576 | continue; |
@@ -1598,6 +1601,8 @@ cifs_put_tcp_session(struct TCP_Server_Info *server) | |||
1598 | return; | 1601 | return; |
1599 | } | 1602 | } |
1600 | 1603 | ||
1604 | put_net(cifs_net_ns(server)); | ||
1605 | |||
1601 | list_del_init(&server->tcp_ses_list); | 1606 | list_del_init(&server->tcp_ses_list); |
1602 | spin_unlock(&cifs_tcp_ses_lock); | 1607 | spin_unlock(&cifs_tcp_ses_lock); |
1603 | 1608 | ||
@@ -1672,6 +1677,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info) | |||
1672 | goto out_err; | 1677 | goto out_err; |
1673 | } | 1678 | } |
1674 | 1679 | ||
1680 | cifs_set_net_ns(tcp_ses, get_net(current->nsproxy->net_ns)); | ||
1675 | tcp_ses->hostname = extract_hostname(volume_info->UNC); | 1681 | tcp_ses->hostname = extract_hostname(volume_info->UNC); |
1676 | if (IS_ERR(tcp_ses->hostname)) { | 1682 | if (IS_ERR(tcp_ses->hostname)) { |
1677 | rc = PTR_ERR(tcp_ses->hostname); | 1683 | rc = PTR_ERR(tcp_ses->hostname); |
@@ -1752,6 +1758,8 @@ cifs_get_tcp_session(struct smb_vol *volume_info) | |||
1752 | out_err_crypto_release: | 1758 | out_err_crypto_release: |
1753 | cifs_crypto_shash_release(tcp_ses); | 1759 | cifs_crypto_shash_release(tcp_ses); |
1754 | 1760 | ||
1761 | put_net(cifs_net_ns(tcp_ses)); | ||
1762 | |||
1755 | out_err: | 1763 | out_err: |
1756 | if (tcp_ses) { | 1764 | if (tcp_ses) { |
1757 | if (!IS_ERR(tcp_ses->hostname)) | 1765 | if (!IS_ERR(tcp_ses->hostname)) |
@@ -2263,8 +2271,8 @@ generic_ip_connect(struct TCP_Server_Info *server) | |||
2263 | } | 2271 | } |
2264 | 2272 | ||
2265 | if (socket == NULL) { | 2273 | if (socket == NULL) { |
2266 | rc = sock_create_kern(sfamily, SOCK_STREAM, | 2274 | rc = __sock_create(cifs_net_ns(server), sfamily, SOCK_STREAM, |
2267 | IPPROTO_TCP, &socket); | 2275 | IPPROTO_TCP, &socket, 1); |
2268 | if (rc < 0) { | 2276 | if (rc < 0) { |
2269 | cERROR(1, "Error %d creating socket", rc); | 2277 | cERROR(1, "Error %d creating socket", rc); |
2270 | server->ssocket = NULL; | 2278 | server->ssocket = NULL; |