Commit b7f67180 authored by Pavel Shilovsky's avatar Pavel Shilovsky

Fix tunnel port problem for centos53

parent c834a6ae
...@@ -1416,13 +1416,17 @@ cifs_parse_mount_options(char *options, const char *devname, ...@@ -1416,13 +1416,17 @@ cifs_parse_mount_options(char *options, const char *devname,
static struct cifsSesInfo * static struct cifsSesInfo *
cifs_find_tcp_session(struct in_addr *target_ip_addr, cifs_find_tcp_session(struct in_addr *target_ip_addr,
struct in6_addr *target_ip6_addr, struct in6_addr *target_ip6_addr,
char *userName, struct TCP_Server_Info **psrvTcp) char *userName, unsigned short int port,
struct TCP_Server_Info **psrvTcp)
{ {
struct list_head *tmp; struct list_head *tmp;
struct cifsSesInfo *ses; struct cifsSesInfo *ses;
*psrvTcp = NULL; *psrvTcp = NULL;
if (!port)
port = CIFS_PORT;
read_lock(&GlobalSMBSeslock); read_lock(&GlobalSMBSeslock);
list_for_each(tmp, &GlobalSMBSessionList) { list_for_each(tmp, &GlobalSMBSessionList) {
ses = list_entry(tmp, struct cifsSesInfo, cifsSessionList); ses = list_entry(tmp, struct cifsSesInfo, cifsSessionList);
...@@ -1430,11 +1434,13 @@ cifs_find_tcp_session(struct in_addr *target_ip_addr, ...@@ -1430,11 +1434,13 @@ cifs_find_tcp_session(struct in_addr *target_ip_addr,
continue; continue;
if (target_ip_addr && if (target_ip_addr &&
ses->server->addr.sockAddr.sin_addr.s_addr != target_ip_addr->s_addr) ((ses->server->addr.sockAddr.sin_addr.s_addr != target_ip_addr->s_addr)
|| (ses->server->addr.sockAddr.sin_port != htons(port))))
continue; continue;
else if (target_ip6_addr && else if (target_ip6_addr &&
memcmp(&ses->server->addr.sockAddr6.sin6_addr, (memcmp(&ses->server->addr.sockAddr6.sin6_addr,
target_ip6_addr, sizeof(*target_ip6_addr))) target_ip6_addr, sizeof(*target_ip6_addr))
|| (ses->server->addr.sockAddr6.sin6_port != htons(port))))
continue; continue;
/* BB lock server and tcp session; increment use count here?? */ /* BB lock server and tcp session; increment use count here?? */
...@@ -1592,8 +1598,8 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1592,8 +1598,8 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
bool noblocksnd, bool noautotune) bool noblocksnd, bool noautotune)
{ {
int rc = 0; int rc = 0;
int orig_port_error = 0;
int connected = 0; int connected = 0;
__be16 orig_port = 0;
if (*csocket == NULL) { if (*csocket == NULL) {
rc = sock_create_kern(PF_INET, SOCK_STREAM, rc = sock_create_kern(PF_INET, SOCK_STREAM,
...@@ -1621,13 +1627,11 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1621,13 +1627,11 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
sizeof(struct sockaddr_in), 0); sizeof(struct sockaddr_in), 0);
if (rc >= 0) if (rc >= 0)
connected = 1; connected = 1;
else
orig_port_error = 1;
} }
if (!connected) { if (!orig_port_error && !connected) {
/* save original port so we can retry user specified port
later if fall back ports fail this time */
orig_port = psin_server->sin_port;
/* do not retry on the same port we just failed on */ /* do not retry on the same port we just failed on */
if (psin_server->sin_port != htons(CIFS_PORT)) { if (psin_server->sin_port != htons(CIFS_PORT)) {
psin_server->sin_port = htons(CIFS_PORT); psin_server->sin_port = htons(CIFS_PORT);
...@@ -1639,7 +1643,8 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1639,7 +1643,8 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
connected = 1; connected = 1;
} }
} }
if (!connected) {
if (!orig_port_error && !connected) {
psin_server->sin_port = htons(RFC1001_PORT); psin_server->sin_port = htons(RFC1001_PORT);
rc = (*csocket)->ops->connect(*csocket, (struct sockaddr *) rc = (*csocket)->ops->connect(*csocket, (struct sockaddr *)
psin_server, psin_server,
...@@ -1651,8 +1656,6 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket, ...@@ -1651,8 +1656,6 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
/* give up here - unless we want to retry on different /* give up here - unless we want to retry on different
protocol families some day */ protocol families some day */
if (!connected) { if (!connected) {
if (orig_port)
psin_server->sin_port = orig_port;
cFYI(1, ("Error %d connecting to server via ipv4", rc)); cFYI(1, ("Error %d connecting to server via ipv4", rc));
sock_release(*csocket); sock_release(*csocket);
*csocket = NULL; *csocket = NULL;
...@@ -1736,7 +1739,7 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket, ...@@ -1736,7 +1739,7 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket,
{ {
int rc = 0; int rc = 0;
int connected = 0; int connected = 0;
__be16 orig_port = 0; int orig_port_error = 0;
if (*csocket == NULL) { if (*csocket == NULL) {
rc = sock_create_kern(PF_INET6, SOCK_STREAM, rc = sock_create_kern(PF_INET6, SOCK_STREAM,
...@@ -1765,13 +1768,11 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket, ...@@ -1765,13 +1768,11 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket,
sizeof(struct sockaddr_in6), 0); sizeof(struct sockaddr_in6), 0);
if (rc >= 0) if (rc >= 0)
connected = 1; connected = 1;
else
orig_port_error = 1;
} }
if (!connected) { if (!orig_port_error && !connected) {
/* save original port so we can retry user specified port
later if fall back ports fail this time */
orig_port = psin_server->sin6_port;
/* do not retry on the same port we just failed on */ /* do not retry on the same port we just failed on */
if (psin_server->sin6_port != htons(CIFS_PORT)) { if (psin_server->sin6_port != htons(CIFS_PORT)) {
psin_server->sin6_port = htons(CIFS_PORT); psin_server->sin6_port = htons(CIFS_PORT);
...@@ -1783,7 +1784,8 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket, ...@@ -1783,7 +1784,8 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket,
connected = 1; connected = 1;
} }
} }
if (!connected) {
if (!orig_port_error && !connected) {
psin_server->sin6_port = htons(RFC1001_PORT); psin_server->sin6_port = htons(RFC1001_PORT);
rc = (*csocket)->ops->connect(*csocket, (struct sockaddr *) rc = (*csocket)->ops->connect(*csocket, (struct sockaddr *)
psin_server, sizeof(struct sockaddr_in6), 0); psin_server, sizeof(struct sockaddr_in6), 0);
...@@ -1794,8 +1796,6 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket, ...@@ -1794,8 +1796,6 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket,
/* give up here - unless we want to retry on different /* give up here - unless we want to retry on different
protocol families some day */ protocol families some day */
if (!connected) { if (!connected) {
if (orig_port)
psin_server->sin6_port = orig_port;
cFYI(1, ("Error %d connecting to server via ipv6", rc)); cFYI(1, ("Error %d connecting to server via ipv6", rc));
sock_release(*csocket); sock_release(*csocket);
*csocket = NULL; *csocket = NULL;
...@@ -2042,12 +2042,12 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb, ...@@ -2042,12 +2042,12 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
if (address_type == AF_INET) if (address_type == AF_INET)
existingCifsSes = cifs_find_tcp_session(&sin_server.sin_addr, existingCifsSes = cifs_find_tcp_session(&sin_server.sin_addr,
NULL /* no ipv6 addr */, NULL /* no ipv6 addr */,
volume_info.username, &srvTcp); volume_info.username, volume_info.port, &srvTcp);
else if (address_type == AF_INET6) { else if (address_type == AF_INET6) {
cFYI(1, ("looking for ipv6 address")); cFYI(1, ("looking for ipv6 address"));
existingCifsSes = cifs_find_tcp_session(NULL /* no ipv4 addr */, existingCifsSes = cifs_find_tcp_session(NULL /* no ipv4 addr */,
&sin_server6.sin6_addr, &sin_server6.sin6_addr,
volume_info.username, &srvTcp); volume_info.username, volume_info.port, &srvTcp);
} else { } else {
rc = -EINVAL; rc = -EINVAL;
goto out; goto out;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment