Skip to content

Commit

Permalink
cifs: move address comparison into separate function
Browse files Browse the repository at this point in the history
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: Jeff Layton <jlayton@redhat.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
  • Loading branch information
Jeff Layton authored and Steve French committed Aug 2, 2010
1 parent 50d9716 commit 4515148
Showing 1 changed file with 36 additions and 37 deletions.
73 changes: 36 additions & 37 deletions fs/cifs/connect.c
Original file line number Diff line number Diff line change
Expand Up @@ -1381,18 +1381,44 @@ cifs_parse_mount_options(char *options, const char *devname,
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 *
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 sockaddr_in *addr4 = (struct sockaddr_in *) addr;
struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) addr;

write_lock(&cifs_tcp_ses_lock);
list_for_each(tmp, &cifs_tcp_ses_list) {
server = list_entry(tmp, struct TCP_Server_Info,
tcp_ses_list);
list_for_each_entry(server, &cifs_tcp_ses_list, tcp_ses_list) {
/*
* the demux thread can exit on its own while still in CifsNew
* so don't accept any sockets in that state. Since the
Expand All @@ -1402,35 +1428,8 @@ cifs_find_tcp_session(struct sockaddr_storage *addr)
if (server->tcpStatus == CifsNew)
continue;

switch (addr->ss_family) {
case AF_INET:
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;
}
if (!match_address(server, addr))
continue;

++server->srv_count;
write_unlock(&cifs_tcp_ses_lock);
Expand Down Expand Up @@ -1502,7 +1501,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info)
}

/* 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)
return tcp_ses;

Expand Down

0 comments on commit 4515148

Please sign in to comment.