Commit 4515148e authored by Jeff Layton's avatar Jeff Layton Committed by Steve French

cifs: move address comparison into separate function

Move the address comparator out of cifs_find_tcp_session and into a
separate function for cleanliness. Also change the argument to
that function to a "struct sockaddr" pointer. Passing pointers to
sockaddr_storage is a little odd since that struct is generally for
declaring static storage.
Signed-off-by: default avatarJeff Layton <jlayton@redhat.com>
Signed-off-by: default avatarSteve French <sfrench@us.ibm.com>
parent 50d97160
...@@ -1381,18 +1381,44 @@ cifs_parse_mount_options(char *options, const char *devname, ...@@ -1381,18 +1381,44 @@ cifs_parse_mount_options(char *options, const char *devname,
return 0; return 0;
} }
static bool
match_address(struct TCP_Server_Info *server, struct sockaddr *addr)
{
struct sockaddr_in *addr4 = (struct sockaddr_in *)addr;
struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
switch (addr->sa_family) {
case AF_INET:
if (addr4->sin_addr.s_addr !=
server->addr.sockAddr.sin_addr.s_addr)
return false;
if (addr4->sin_port &&
addr4->sin_port != server->addr.sockAddr.sin_port)
return false;
break;
case AF_INET6:
if (!ipv6_addr_equal(&addr6->sin6_addr,
&server->addr.sockAddr6.sin6_addr))
return false;
if (addr6->sin6_scope_id !=
server->addr.sockAddr6.sin6_scope_id)
return false;
if (addr6->sin6_port &&
addr6->sin6_port != server->addr.sockAddr6.sin6_port)
return false;
break;
}
return true;
}
static struct TCP_Server_Info * static struct TCP_Server_Info *
cifs_find_tcp_session(struct sockaddr_storage *addr) cifs_find_tcp_session(struct sockaddr *addr)
{ {
struct list_head *tmp;
struct TCP_Server_Info *server; struct TCP_Server_Info *server;
struct sockaddr_in *addr4 = (struct sockaddr_in *) addr;
struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) addr;
write_lock(&cifs_tcp_ses_lock); write_lock(&cifs_tcp_ses_lock);
list_for_each(tmp, &cifs_tcp_ses_list) { list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
server = list_entry(tmp, struct TCP_Server_Info,
tcp_ses_list);
/* /*
* the demux thread can exit on its own while still in CifsNew * the demux thread can exit on its own while still in CifsNew
* so don't accept any sockets in that state. Since the * so don't accept any sockets in that state. Since the
...@@ -1402,35 +1428,8 @@ cifs_find_tcp_session(struct sockaddr_storage *addr) ...@@ -1402,35 +1428,8 @@ cifs_find_tcp_session(struct sockaddr_storage *addr)
if (server->tcpStatus == CifsNew) if (server->tcpStatus == CifsNew)
continue; continue;
switch (addr->ss_family) { if (!match_address(server, addr))
case AF_INET: continue;
if (addr4->sin_addr.s_addr ==
server->addr.sockAddr.sin_addr.s_addr) {
/* user overrode default port? */
if (addr4->sin_port) {
if (addr4->sin_port !=
server->addr.sockAddr.sin_port)
continue;
}
break;
} else
continue;
case AF_INET6:
if (ipv6_addr_equal(&addr6->sin6_addr,
&server->addr.sockAddr6.sin6_addr) &&
(addr6->sin6_scope_id ==
server->addr.sockAddr6.sin6_scope_id)) {
/* user overrode default port? */
if (addr6->sin6_port) {
if (addr6->sin6_port !=
server->addr.sockAddr6.sin6_port)
continue;
}
break;
} else
continue;
}
++server->srv_count; ++server->srv_count;
write_unlock(&cifs_tcp_ses_lock); write_unlock(&cifs_tcp_ses_lock);
...@@ -1502,7 +1501,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info) ...@@ -1502,7 +1501,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info)
} }
/* see if we already have a matching tcp_ses */ /* see if we already have a matching tcp_ses */
tcp_ses = cifs_find_tcp_session(&addr); tcp_ses = cifs_find_tcp_session((struct sockaddr *)&addr);
if (tcp_ses) if (tcp_ses)
return tcp_ses; return tcp_ses;
......
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