aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs/connect.c
diff options
context:
space:
mode:
authorSean Finney <seanius@seanius.net>2011-04-11 09:19:31 -0400
committerSteve French <sfrench@us.ibm.com>2011-05-19 10:10:54 -0400
commitc1508ca23653245266e2e3ab69a8dad464f7a569 (patch)
tree31105f22f36808917ee218f196fb65f8676b3e4e /fs/cifs/connect.c
parentdd61394586dbd9387fe53b325c6807f61734cf89 (diff)
cifs: Add support for mounting Windows 2008 DFS shares
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>
Diffstat (limited to 'fs/cifs/connect.c')
-rw-r--r--fs/cifs/connect.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index b6c6a3629b07..c7ebeee38c67 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -2937,6 +2937,24 @@ try_mount_again:
2937 (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE)); 2937 (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE));
2938 2938
2939remote_path_check: 2939remote_path_check:
2940#ifdef CONFIG_CIFS_DFS_UPCALL
2941 /*
2942 * Perform an unconditional check for whether there are DFS
2943 * referrals for this path without prefix, to provide support
2944 * for DFS referrals from w2k8 servers which don't seem to respond
2945 * with PATH_NOT_COVERED to requests that include the prefix.
2946 * Chase the referral if found, otherwise continue normally.
2947 */
2948 if (referral_walks_count == 0) {
2949 int refrc = expand_dfs_referral(xid, pSesInfo, volume_info,
2950 cifs_sb, &mount_data, false);
2951 if (!refrc) {
2952 referral_walks_count++;
2953 goto try_mount_again;
2954 }
2955 }
2956#endif
2957
2940 /* check if a whole path (including prepath) is not remote */ 2958 /* check if a whole path (including prepath) is not remote */
2941 if (!rc && tcon) { 2959 if (!rc && tcon) {
2942 /* build_path_to_root works only when we have a valid tcon */ 2960 /* build_path_to_root works only when we have a valid tcon */