Commit 326a77ce authored by Pavel Shilovsky's avatar Pavel Shilovsky

Fix tunnel port problem for 2.6.27

parent c0bdee98
......@@ -1368,13 +1368,16 @@ cifs_parse_mount_options(char *options, const char *devname,
}
static struct TCP_Server_Info *
cifs_find_tcp_session(struct sockaddr_storage *addr)
cifs_find_tcp_session(struct sockaddr_storage *addr, unsigned short int port)
{
struct list_head *tmp;
struct TCP_Server_Info *server;
struct sockaddr_in *addr4 = (struct sockaddr_in *) addr;
struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) addr;
if (!port)
port = CIFS_PORT;
write_lock(&cifs_tcp_ses_lock);
list_for_each(tmp, &cifs_tcp_ses_list) {
server = list_entry(tmp, struct TCP_Server_Info,
......@@ -1389,12 +1392,14 @@ cifs_find_tcp_session(struct sockaddr_storage *addr)
continue;
if (addr->ss_family == AF_INET &&
(addr4->sin_addr.s_addr !=
server->addr.sockAddr.sin_addr.s_addr))
((addr4->sin_addr.s_addr !=
server->addr.sockAddr.sin_addr.s_addr) ||
(htons(port) != server->addr.sockAddr.sin_port)))
continue;
else if (addr->ss_family == AF_INET6 &&
memcmp(&server->addr.sockAddr6.sin6_addr,
&addr6->sin6_addr, sizeof(addr6->sin6_addr)))
(memcmp(&server->addr.sockAddr6.sin6_addr,
&addr6->sin6_addr, sizeof(addr6->sin6_addr))
|| (htons(port) != server->addr.sockAddr6.sin6_port)))
continue;
++server->srv_count;
......@@ -1614,8 +1619,8 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
bool noblocksnd, bool noautotune)
{
int rc = 0;
int orig_port_error = 0;
int connected = 0;
__be16 orig_port = 0;
if (*csocket == NULL) {
rc = sock_create_kern(PF_INET, SOCK_STREAM,
......@@ -1639,14 +1644,11 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
sizeof(struct sockaddr_in), 0);
if (rc >= 0)
connected = 1;
else
orig_port_error = 1;
}
if (!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 */
if (!orig_port_error && !connected) {
if (psin_server->sin_port != htons(CIFS_PORT)) {
psin_server->sin_port = htons(CIFS_PORT);
......@@ -1657,7 +1659,8 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
connected = 1;
}
}
if (!connected) {
if (!orig_port_error && !connected) {
psin_server->sin_port = htons(RFC1001_PORT);
rc = (*csocket)->ops->connect(*csocket, (struct sockaddr *)
psin_server,
......@@ -1669,8 +1672,6 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
/* give up here - unless we want to retry on different
protocol families some day */
if (!connected) {
if (orig_port)
psin_server->sin_port = orig_port;
cFYI(1, ("Error %d connecting to server via ipv4", rc));
sock_release(*csocket);
*csocket = NULL;
......@@ -1753,7 +1754,7 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket,
{
int rc = 0;
int connected = 0;
__be16 orig_port = 0;
int orig_port_error = 0;
if (*csocket == NULL) {
rc = sock_create_kern(PF_INET6, SOCK_STREAM,
......@@ -1778,13 +1779,11 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket,
sizeof(struct sockaddr_in6), 0);
if (rc >= 0)
connected = 1;
else
orig_port_error = 1;
}
if (!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;
if (!orig_port_error && !connected) {
/* do not retry on the same port we just failed on */
if (psin_server->sin6_port != htons(CIFS_PORT)) {
psin_server->sin6_port = htons(CIFS_PORT);
......@@ -1796,7 +1795,8 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket,
connected = 1;
}
}
if (!connected) {
if (!orig_port_error && !connected) {
psin_server->sin6_port = htons(RFC1001_PORT);
rc = (*csocket)->ops->connect(*csocket, (struct sockaddr *)
psin_server, sizeof(struct sockaddr_in6), 0);
......@@ -1807,8 +1807,6 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket,
/* give up here - unless we want to retry on different
protocol families some day */
if (!connected) {
if (orig_port)
psin_server->sin6_port = orig_port;
cFYI(1, ("Error %d connecting to server via ipv6", rc));
sock_release(*csocket);
*csocket = NULL;
......@@ -2138,7 +2136,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
}
}
srvTcp = cifs_find_tcp_session(&addr);
srvTcp = cifs_find_tcp_session(&addr, volume_info.port);
if (!srvTcp) { /* create socket */
if (addr.ss_family == AF_INET6) {
cFYI(1, ("attempting ipv6 connect"));
......
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