Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 201708
b: refs/heads/master
c: 4515148
h: refs/heads/master
v: v3
  • Loading branch information
Jeff Layton authored and Steve French committed Aug 2, 2010
1 parent 72c87d9 commit aa47e6e
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 38 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 50d971602a6c4bf1abe1f3873686f431d7539dfe
refs/heads/master: 4515148ef72bfda4ce3c8754149711d9972867ce
73 changes: 36 additions & 37 deletions trunk/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 aa47e6e

Please sign in to comment.