From 6fbdd5ab240443e3f8574eb9d407d03daace1ddc Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Sat, 17 Dec 2022 00:46:11 -0300 Subject: [PATCH] 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) Signed-off-by: Steve French --- fs/cifs/dfs.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/fs/cifs/dfs.c b/fs/cifs/dfs.c index 5afabca..b541e68 100644 --- a/fs/cifs/dfs.c +++ b/fs/cifs/dfs.c @@ -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; -- 2.7.4