diff options
author | Sean Finney <seanius@seanius.net> | 2011-04-11 09:19:31 -0400 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2011-05-19 10:10:54 -0400 |
commit | c1508ca23653245266e2e3ab69a8dad464f7a569 (patch) | |
tree | 31105f22f36808917ee218f196fb65f8676b3e4e /fs | |
parent | dd61394586dbd9387fe53b325c6807f61734cf89 (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')
-rw-r--r-- | 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 b6c6a3629b0..c7ebeee38c6 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 | ||
2939 | remote_path_check: | 2939 | remote_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 */ |