From patchwork Mon Apr 11 13:19:31 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sean Finney X-Patchwork-Id: 698061 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.3) with ESMTP id p3BDKVhR027860 for ; Mon, 11 Apr 2011 13:20:32 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752006Ab1DKNUS (ORCPT ); Mon, 11 Apr 2011 09:20:18 -0400 Received: from seldrel01.sonyericsson.com ([212.209.106.2]:4194 "EHLO seldrel01.sonyericsson.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751722Ab1DKNUR (ORCPT ); Mon, 11 Apr 2011 09:20:17 -0400 From: Sean Finney To: Steve French CC: linux-cifs@vger.kernel.org, Sean Finney Subject: [PATCH v5 2/6] cifs: Add support for mounting Windows 2008 DFS shares Date: Mon, 11 Apr 2011 15:19:31 +0200 Message-ID: <1302527975-16549-2-git-send-email-seanius@seanius.net> X-Mailer: git-send-email 1.7.4.1 In-Reply-To: <1302527975-16549-1-git-send-email-seanius@seanius.net> References: <1302527975-16549-1-git-send-email-seanius@seanius.net> MIME-Version: 1.0 Sender: linux-cifs-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-cifs@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Mon, 11 Apr 2011 13:20:32 +0000 (UTC) Windows 2008 CIFS servers do not always return PATH_NOT_COVERED when attempting to access a DFS share. Therefore, when checking for remote shares, unconditionally ask for a DFS referral for the UNC (w/out prepath) before continuing with previous behavior of attempting to access the UNC + prepath and checking for PATH_NOT_COVERED. Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=31092 Reviewed-by: Jeff Layton Signed-off-by: Sean Finney --- fs/cifs/connect.c | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-) diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c index c89d871..4873bac 100644 --- a/fs/cifs/connect.c +++ b/fs/cifs/connect.c @@ -2934,6 +2934,24 @@ try_mount_again: (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE)); remote_path_check: +#ifdef CONFIG_CIFS_DFS_UPCALL + /* + * Perform an unconditional check for whether there are DFS + * referrals for this path without prefix, to provide support + * for DFS referrals from w2k8 servers which don't seem to respond + * with PATH_NOT_COVERED to requests that include the prefix. + * Chase the referral if found, otherwise continue normally. + */ + if (referral_walks_count == 0) { + int refrc = expand_dfs_referral(xid, pSesInfo, volume_info, + cifs_sb, &mount_data, false); + if (!refrc) { + referral_walks_count++; + goto try_mount_again; + } + } +#endif + /* check if a whole path (including prepath) is not remote */ if (!rc && tcon) { /* build_path_to_root works only when we have a valid tcon */