summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorPaulo Alcantara <pc@cjr.nz>2022-12-17 04:46:11 +0100
committerSteve French <stfrench@microsoft.com>2022-12-19 15:03:12 +0100
commit6fbdd5ab240443e3f8574eb9d407d03daace1ddc (patch)
treefe671178691e7d13012dc888deb3215640417cc9 /fs
parentcifs: fix source pathname comparison of dfs supers (diff)
downloadlinux-6fbdd5ab240443e3f8574eb9d407d03daace1ddc.tar.xz
linux-6fbdd5ab240443e3f8574eb9d407d03daace1ddc.zip
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>
Diffstat (limited to 'fs')
-rw-r--r--fs/cifs/dfs.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/fs/cifs/dfs.c b/fs/cifs/dfs.c
index 5afabca654c1..b541e68378f6 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;