On Fri, 1 Apr 2011 13:53:02 +0200
Sean Finney <[email protected]> wrote:

> 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
> ---
>  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 7a9b2da..9425c7b 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 */

Thanks for respinning the set, this looks much easier to review. One
thing I notice right offhand is that the new code doesn't check to see
whether referral_walks_count > MAX_NESTED_LINKS (like the original call
site does).

That means the client can loop here indefinitely if there is a referral
loop. I think we need that check in there.

-- 
Jeff Layton <[email protected]>
--
To unsubscribe from this list: send the line "unsubscribe linux-cifs" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to