cifs: Add support for mounting Windows 2008 DFS shares
authorSean Finney <seanius@seanius.net>
Mon, 11 Apr 2011 13:19:31 +0000 (13:19 +0000)
committerSteve French <sfrench@us.ibm.com>
Thu, 19 May 2011 14:10:54 +0000 (14:10 +0000)
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 <jlayton@redhat.com>
Signed-off-by: Sean Finney <seanius@seanius.net>
Signed-off-by: Pavel Shilovsky <piastry@etersoft.ru>
Signed-off-by: Steve French <sfrench@us.ibm.com>
fs/cifs/connect.c

index b6c6a36..c7ebeee 100644 (file)
@@ -2937,6 +2937,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 */