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>
This commit is contained in:
Sean Finney 2011-04-11 13:19:31 +00:00 committed by Steve French
parent dd61394586
commit c1508ca236

View file

@ -2937,6 +2937,24 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
(tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE)); (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE));
remote_path_check: 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 */ /* check if a whole path (including prepath) is not remote */
if (!rc && tcon) { if (!rc && tcon) {
/* build_path_to_root works only when we have a valid tcon */ /* build_path_to_root works only when we have a valid tcon */