cifs: optimize reconnect of nested links
authorPaulo Alcantara <pc@cjr.nz>
Sat, 17 Dec 2022 03:46:11 +0000 (00:46 -0300)
committerSteve French <stfrench@microsoft.com>
Mon, 19 Dec 2022 14:03:12 +0000 (08:03 -0600)
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>
fs/cifs/dfs.c

index 5afabca654c11773aec16eb8fc8d228716f2e264..b541e68378f647c2b89d891952bfa0e0362649d2 100644 (file)
@@ -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;