smb: client: don't trust DFSREF_STORAGE_SERVER bit
Some servers don't respect the DFSREF_STORAGE_SERVER bit, so unconditionally tree connect to DFS link target and then decide whether or not continue chasing DFS referrals for DFS interlinks. Otherwise the client would fail to mount such shares. Signed-off-by: Paulo Alcantara (Red Hat) <pc@manguebit.com> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
parent
2014c95afe
commit
77c2e45dbf
1 changed files with 16 additions and 14 deletions
|
@ -150,25 +150,27 @@ again:
|
|||
if (rc)
|
||||
continue;
|
||||
|
||||
if (tgt.flags & DFSREF_STORAGE_SERVER) {
|
||||
rc = cifs_mount_get_tcon(mnt_ctx);
|
||||
if (!rc)
|
||||
rc = cifs_is_path_remote(mnt_ctx);
|
||||
rc = cifs_mount_get_tcon(mnt_ctx);
|
||||
if (rc) {
|
||||
if (tgt.server_type == DFS_TYPE_LINK &&
|
||||
DFS_INTERLINK(tgt.flags))
|
||||
rc = -EREMOTE;
|
||||
} else {
|
||||
rc = cifs_is_path_remote(mnt_ctx);
|
||||
if (!rc) {
|
||||
ref_walk_set_tgt_hint(rw);
|
||||
break;
|
||||
}
|
||||
if (rc != -EREMOTE)
|
||||
continue;
|
||||
}
|
||||
|
||||
rc = ref_walk_advance(rw);
|
||||
if (!rc) {
|
||||
rc = setup_dfs_ref(&tgt, rw);
|
||||
if (rc)
|
||||
break;
|
||||
ref_walk_mark_end(rw);
|
||||
goto again;
|
||||
if (rc == -EREMOTE) {
|
||||
rc = ref_walk_advance(rw);
|
||||
if (!rc) {
|
||||
rc = setup_dfs_ref(&tgt, rw);
|
||||
if (rc)
|
||||
break;
|
||||
ref_walk_mark_end(rw);
|
||||
goto again;
|
||||
}
|
||||
}
|
||||
}
|
||||
} while (rc && ref_walk_descend(rw));
|
||||
|
|
Loading…
Add table
Reference in a new issue