cifs: optimize reconnect of nested links
There is no point going all the way back to the original dfs full path if reconnect of tcon did not finish due a nested link found as newly resolved target for the current referral. So, just mark current server for reconnect as we already set @current_fullpath to the new dfs referral in update_server_fullpath(). Signed-off-by: Paulo Alcantara (SUSE) <pc@cjr.nz> Signed-off-by: Steve French <stfrench@microsoft.com>
This commit is contained in:
parent
466611e4af
commit
6fbdd5ab24
|
@ -451,6 +451,7 @@ static int tree_connect_dfs_target(const unsigned int xid, struct cifs_tcon *tco
|
|||
int rc;
|
||||
int num_links = 0;
|
||||
struct TCP_Server_Info *server = tcon->ses->server;
|
||||
char *old_fullpath = server->leaf_fullpath;
|
||||
|
||||
do {
|
||||
rc = __tree_connect_dfs_target(xid, tcon, cifs_sb, tree, islink, tl);
|
||||
|
@ -458,13 +459,11 @@ static int tree_connect_dfs_target(const unsigned int xid, struct cifs_tcon *tco
|
|||
break;
|
||||
} while (rc = -ELOOP, ++num_links < MAX_NESTED_LINKS);
|
||||
/*
|
||||
* If we couldn't tree connect to any targets from last referral path, then retry from
|
||||
* original referral path.
|
||||
* If we couldn't tree connect to any targets from last referral path, then
|
||||
* retry it from newly resolved dfs referral.
|
||||
*/
|
||||
if (rc && server->current_fullpath != server->origin_fullpath) {
|
||||
server->current_fullpath = server->origin_fullpath;
|
||||
if (rc && server->leaf_fullpath != old_fullpath)
|
||||
cifs_signal_cifsd_for_reconnect(server, true);
|
||||
}
|
||||
|
||||
dfs_cache_free_tgts(tl);
|
||||
return rc;
|
||||
|
|
Loading…
Reference in New Issue