diff options
Diffstat (limited to 'fs/cifs/connect.c')
-rw-r--r-- | fs/cifs/connect.c | 49 |
1 files changed, 35 insertions, 14 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 1f3345d7fa79..d49682433c20 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c | |||
@@ -1377,7 +1377,7 @@ cifs_parse_mount_options(char *options, const char *devname, | |||
1377 | } | 1377 | } |
1378 | 1378 | ||
1379 | static struct TCP_Server_Info * | 1379 | static struct TCP_Server_Info * |
1380 | cifs_find_tcp_session(struct sockaddr_storage *addr) | 1380 | cifs_find_tcp_session(struct sockaddr_storage *addr, unsigned short int port) |
1381 | { | 1381 | { |
1382 | struct list_head *tmp; | 1382 | struct list_head *tmp; |
1383 | struct TCP_Server_Info *server; | 1383 | struct TCP_Server_Info *server; |
@@ -1397,16 +1397,37 @@ cifs_find_tcp_session(struct sockaddr_storage *addr) | |||
1397 | if (server->tcpStatus == CifsNew) | 1397 | if (server->tcpStatus == CifsNew) |
1398 | continue; | 1398 | continue; |
1399 | 1399 | ||
1400 | if (addr->ss_family == AF_INET && | 1400 | switch (addr->ss_family) { |
1401 | (addr4->sin_addr.s_addr != | 1401 | case AF_INET: |
1402 | server->addr.sockAddr.sin_addr.s_addr)) | 1402 | if (addr4->sin_addr.s_addr == |
1403 | continue; | 1403 | server->addr.sockAddr.sin_addr.s_addr) { |
1404 | else if (addr->ss_family == AF_INET6 && | 1404 | addr4->sin_port = htons(port); |
1405 | (!ipv6_addr_equal(&server->addr.sockAddr6.sin6_addr, | 1405 | /* user overrode default port? */ |
1406 | &addr6->sin6_addr) || | 1406 | if (addr4->sin_port) { |
1407 | server->addr.sockAddr6.sin6_scope_id != | 1407 | if (addr4->sin_port != |
1408 | addr6->sin6_scope_id)) | 1408 | server->addr.sockAddr.sin_port) |
1409 | continue; | 1409 | continue; |
1410 | } | ||
1411 | break; | ||
1412 | } else | ||
1413 | continue; | ||
1414 | |||
1415 | case AF_INET6: | ||
1416 | if (ipv6_addr_equal(&addr6->sin6_addr, | ||
1417 | &server->addr.sockAddr6.sin6_addr) && | ||
1418 | (addr6->sin6_scope_id == | ||
1419 | server->addr.sockAddr6.sin6_scope_id)) { | ||
1420 | addr6->sin6_port = htons(port); | ||
1421 | /* user overrode default port? */ | ||
1422 | if (addr6->sin6_port) { | ||
1423 | if (addr6->sin6_port != | ||
1424 | server->addr.sockAddr6.sin6_port) | ||
1425 | continue; | ||
1426 | } | ||
1427 | break; | ||
1428 | } else | ||
1429 | continue; | ||
1430 | } | ||
1410 | 1431 | ||
1411 | ++server->srv_count; | 1432 | ++server->srv_count; |
1412 | write_unlock(&cifs_tcp_ses_lock); | 1433 | write_unlock(&cifs_tcp_ses_lock); |
@@ -1475,7 +1496,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info) | |||
1475 | } | 1496 | } |
1476 | 1497 | ||
1477 | /* see if we already have a matching tcp_ses */ | 1498 | /* see if we already have a matching tcp_ses */ |
1478 | tcp_ses = cifs_find_tcp_session(&addr); | 1499 | tcp_ses = cifs_find_tcp_session(&addr, volume_info->port); |
1479 | if (tcp_ses) | 1500 | if (tcp_ses) |
1480 | return tcp_ses; | 1501 | return tcp_ses; |
1481 | 1502 | ||
@@ -2636,9 +2657,9 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses, | |||
2636 | return -EIO; | 2657 | return -EIO; |
2637 | 2658 | ||
2638 | smb_buffer = cifs_buf_get(); | 2659 | smb_buffer = cifs_buf_get(); |
2639 | if (smb_buffer == NULL) { | 2660 | if (smb_buffer == NULL) |
2640 | return -ENOMEM; | 2661 | return -ENOMEM; |
2641 | } | 2662 | |
2642 | smb_buffer_response = smb_buffer; | 2663 | smb_buffer_response = smb_buffer; |
2643 | 2664 | ||
2644 | header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX, | 2665 | header_assemble(smb_buffer, SMB_COM_TREE_CONNECT_ANDX, |