Merged.<br><br>Note I fixed some checkpatch warnings thrown when I checked in this patch in a followon patch immediately after merging this.<br><br><div class="gmail_quote">On Thu, Aug 20, 2009 at 2:33 AM, Suresh Jayaraman <span dir="ltr">&lt;<a href="mailto:sjayaraman@suse.de">sjayaraman@suse.de</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">One more try..<br>
<br>
It seems there is a regression that got introduced while Jeff fixed<br>
all the mount/umount races. While attempting to find whether a tcp<br>
session is already existing, we were not checking whether the &quot;port&quot;<br>
used are the same. When a second mount is attempted with a different<br>
&quot;port=&quot; option, it is being ignored. Because of this the cifs mounts<br>
that uses a SSH tunnel appears to be broken.<br>
<br>
Steps to reproduce:<br>
<br>
1. create 2 shares<br>
# SSH Tunnel a SMB session<br>
2. ssh -f -L 6111:<a href="http://127.0.0.1:445" target="_blank">127.0.0.1:445</a> root@localhost &quot;sleep 86400&quot;<br>
3. ssh -f -L 6222:<a href="http://127.0.0.1:445" target="_blank">127.0.0.1:445</a> root@localhost &quot;sleep 86400&quot;<br>
4. tcpdump -i lo 6111 &amp;<br>
5. mkdir -p /mnt/mnt1<br>
6. mkdir -p /mnt/mnt2<br>
7. mount.cifs //localhost/a /mnt/mnt1 -o username=guest,ip=127.0.0.1,port=6111<br>
#(shows tcpdump activity on port 6111)<br>
8. mount.cifs //localhost/b /mnt/mnt2 -o username=guest,ip=127.0.0.1,port=6222<br>
#(shows tcpdump activity only on port 6111 and not on 6222<br>
<br>
Fix by adding a check to compare the port _only_ if the user tries to<br>
override the tcp port with &quot;port=&quot; option, before deciding that an<br>
existing tcp session is found. Also, clean up a bit by replacing<br>
if-else if by a switch statment while at it as suggested by Jeff.<br>
<br>
Signed-off-by: Suresh Jayaraman &lt;<a href="mailto:sjayaraman@suse.de">sjayaraman@suse.de</a>&gt;<br>
---<br>
<br>
 fs/cifs/connect.c |   45 +++++++++++++++++++++++++++++++++------------<br>
 1 files changed, 33 insertions(+), 12 deletions(-)<br>
<br>
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c<br>
index 1f3345d..4e47a9b 100644<br>
--- a/fs/cifs/connect.c<br>
+++ b/fs/cifs/connect.c<br>
@@ -1377,7 +1377,7 @@ cifs_parse_mount_options(char *options, const char *devname,<br>
 }<br>
<br>
 static struct TCP_Server_Info *<br>
-cifs_find_tcp_session(struct sockaddr_storage *addr)<br>
+cifs_find_tcp_session(struct sockaddr_storage *addr, unsigned short int port)<br>
 {<br>
        struct list_head *tmp;<br>
        struct TCP_Server_Info *server;<br>
@@ -1397,16 +1397,37 @@ cifs_find_tcp_session(struct sockaddr_storage *addr)<br>
                if (server-&gt;tcpStatus == CifsNew)<br>
                        continue;<br>
<br>
-               if (addr-&gt;ss_family == AF_INET &amp;&amp;<br>
-                   (addr4-&gt;sin_addr.s_addr !=<br>
-                    server-&gt;addr.sockAddr.sin_addr.s_addr))<br>
-                       continue;<br>
-               else if (addr-&gt;ss_family == AF_INET6 &amp;&amp;<br>
-                        (!ipv6_addr_equal(&amp;server-&gt;addr.sockAddr6.sin6_addr,<br>
-                                          &amp;addr6-&gt;sin6_addr) ||<br>
-                         server-&gt;addr.sockAddr6.sin6_scope_id !=<br>
-                                          addr6-&gt;sin6_scope_id))<br>
-                       continue;<br>
+               switch (addr-&gt;ss_family) {<br>
+               case AF_INET:<br>
+                       if (addr4-&gt;sin_addr.s_addr ==<br>
+                           server-&gt;addr.sockAddr.sin_addr.s_addr) {<br>
+                               addr4-&gt;sin_port = htons(port);<br>
+                               /* user overrode default port? */<br>
+                               if (addr4-&gt;sin_port) {<br>
+                                       if (addr4-&gt;sin_port !=<br>
+                                           server-&gt;addr.sockAddr.sin_port)<br>
+                                               continue;<br>
+                               }<br>
+                               break;<br>
+                       } else<br>
+                               continue;<br>
+<br>
+               case AF_INET6:<br>
+                       if (ipv6_addr_equal(&amp;addr6-&gt;sin6_addr,<br>
+                           &amp;server-&gt;addr.sockAddr6.sin6_addr) &amp;&amp;<br>
+                           (addr6-&gt;sin6_scope_id ==<br>
+                           server-&gt;addr.sockAddr6.sin6_scope_id)) {<br>
+                               addr6-&gt;sin6_port = htons(port);<br>
+                               /* user overrode default port? */<br>
+                               if (addr6-&gt;sin6_port) {<br>
+                                      if (addr6-&gt;sin6_port !=<br>
+                                          server-&gt;addr.sockAddr6.sin6_port)<br>
+                                              continue;<br>
+                               }<br>
+                               break;<br>
+                       } else<br>
+                               continue;<br>
+               }<br>
<br>
                ++server-&gt;srv_count;<br>
                write_unlock(&amp;cifs_tcp_ses_lock);<br>
@@ -1475,7 +1496,7 @@ cifs_get_tcp_session(struct smb_vol *volume_info)<br>
        }<br>
<br>
        /* see if we already have a matching tcp_ses */<br>
-       tcp_ses = cifs_find_tcp_session(&amp;addr);<br>
+       tcp_ses = cifs_find_tcp_session(&amp;addr, volume_info-&gt;port);<br>
        if (tcp_ses)<br>
                return tcp_ses;<br>
<br>
</blockquote></div><br><br clear="all"><br>-- <br>Thanks,<br><br>Steve<br>