From patchwork Tue Aug 18 17:01:52 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Suresh Jayaraman X-Patchwork-Id: 42379 Received: from lists.samba.org (fn.samba.org [216.83.154.106]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n7IH2GhP031247 for ; Tue, 18 Aug 2009 17:02:16 GMT Received: from fn.samba.org (localhost [127.0.0.1]) by lists.samba.org (Postfix) with ESMTP id 6184CACF50; Tue, 18 Aug 2009 10:55:42 -0600 (MDT) X-Spam-Checker-Version: SpamAssassin 3.2.5 (2008-06-10) on fn.samba.org X-Spam-Level: X-Spam-Status: No, score=-7.5 required=3.8 tests=AWL, BAYES_00, RCVD_IN_DNSWL_HI autolearn=ham version=3.2.5 X-Original-To: linux-cifs-client@lists.samba.org Delivered-To: linux-cifs-client@lists.samba.org Received: from mx1.suse.de (cantor.suse.de [195.135.220.2]) by lists.samba.org (Postfix) with ESMTP id 5AEE5ACF44 for ; Tue, 18 Aug 2009 10:55:37 -0600 (MDT) Received: from relay2.suse.de (mail2.suse.de [195.135.221.8]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.suse.de (Postfix) with ESMTP id CDAFA457F0; Tue, 18 Aug 2009 19:02:09 +0200 (CEST) Message-ID: <4A8ADE80.6040306@suse.de> Date: Tue, 18 Aug 2009 22:31:52 +0530 From: Suresh Jayaraman User-Agent: Thunderbird 2.0.0.22 (X11/20090605) MIME-Version: 1.0 To: Steve French X-Enigmail-Version: 0.95.7 Cc: "linux-cifs-client@lists.samba.org" , Jeff Layton Subject: [linux-cifs-client] [PATCH] cifs: Fix broken mounts when SSH tunnel is used X-BeenThere: linux-cifs-client@lists.samba.org X-Mailman-Version: 2.1.12 Precedence: list List-Id: The Linux CIFS VFS client List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-cifs-client-bounces@lists.samba.org Errors-To: linux-cifs-client-bounces@lists.samba.org It seems there is a regression that got introduced while Jeff fixed all the mount/umount races. While attempting to find whether a tcp session is already existing, we were not checking whether the "port" used are the same. When a second mount is attempted with a different "port=" option, it is being ignored. Because of this the cifs mounts that uses a SSH tunnel appears to be broken. Steps to reproduce: 1. create 2 shares # SSH Tunnel a SMB session 2. ssh -f -L 6111:127.0.0.1:445 root@localhost "sleep 86400" 3. ssh -f -L 6222:127.0.0.1:445 root@localhost "sleep 86400" 4. tcpdump -i lo 6111 & 5. mkdir -p /mnt/mnt1 6. mkdir -p /mnt/mnt2 7. mount.cifs //localhost/a /mnt/mnt1 -o username=guest,ip=127.0.0.1,port=6111 #(shows tcpdump activity on port 6111) 8. mount.cifs //localhost/b /mnt/mnt2 -o username=guest,ip=127.0.0.1,port=6222 #(shows tcpdump activity only on port 6111 and not on 6222 Fix this by adding a check to verify whether the port, before deciding that a existing tcp session is found and can be used. Signed-off-by: Suresh Jayaraman --- fs/cifs/connect.c | 6 ++++-- 1 files changed, 4 insertions(+), 2 deletions(-) diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index 1f3345d..c00159c 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -1399,13 +1399,15 @@ cifs_find_tcp_session(struct sockaddr_storage *addr) if (addr->ss_family == AF_INET && (addr4->sin_addr.s_addr != - server->addr.sockAddr.sin_addr.s_addr)) + server->addr.sockAddr.sin_addr.s_addr || + addr4->sin_port != server->addr.sockAddr.sin_port)) continue; else if (addr->ss_family == AF_INET6 && (!ipv6_addr_equal(&server->addr.sockAddr6.sin6_addr, &addr6->sin6_addr) || server->addr.sockAddr6.sin6_scope_id != - addr6->sin6_scope_id)) + addr6->sin6_scope_id || + server->addr.sockAddr6.sin6_port != addr6->sin6_port)) continue; ++server->srv_count;