cifs: Simplify reconnect code when dfs upcall is enabled
authorSamuel Cabrero <scabrero@suse.de>
Mon, 30 Nov 2020 18:02:55 +0000 (19:02 +0100)
committerSteve French <stfrench@microsoft.com>
Mon, 14 Dec 2020 15:16:23 +0000 (09:16 -0600)
Some witness notifications, like client move, tell the client to
reconnect to a specific IP address. In this situation the DFS failover
code path has to be skipped so clean up as much as possible the
cifs_reconnect() code.

Signed-off-by: Samuel Cabrero <scabrero@suse.de>
Reviewed-by: Aurelien Aptel <aaptel@suse.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/cifs/connect.c

index 584eddb..156c18b 100644 (file)
@@ -88,7 +88,7 @@ static void cifs_prune_tlinks(struct work_struct *work);
  * This should be called with server->srv_mutex held.
  */
 #ifdef CONFIG_CIFS_DFS_UPCALL
-static int reconn_set_ipaddr(struct TCP_Server_Info *server)
+static int reconn_set_ipaddr_from_hostname(struct TCP_Server_Info *server)
 {
        int rc;
        int len;
@@ -123,14 +123,7 @@ static int reconn_set_ipaddr(struct TCP_Server_Info *server)
 
        return !rc ? -1 : 0;
 }
-#else
-static inline int reconn_set_ipaddr(struct TCP_Server_Info *server)
-{
-       return 0;
-}
-#endif
 
-#ifdef CONFIG_CIFS_DFS_UPCALL
 /* These functions must be called with server->srv_mutex held */
 static void reconn_set_next_dfs_target(struct TCP_Server_Info *server,
                                       struct cifs_sb_info *cifs_sb,
@@ -138,6 +131,7 @@ static void reconn_set_next_dfs_target(struct TCP_Server_Info *server,
                                       struct dfs_cache_tgt_iterator **tgt_it)
 {
        const char *name;
+       int rc;
 
        if (!cifs_sb || !cifs_sb->origin_fullpath)
                return;
@@ -162,6 +156,12 @@ static void reconn_set_next_dfs_target(struct TCP_Server_Info *server,
                         "%s: failed to extract hostname from target: %ld\n",
                         __func__, PTR_ERR(server->hostname));
        }
+
+       rc = reconn_set_ipaddr_from_hostname(server);
+       if (rc) {
+               cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
+                        __func__, rc);
+       }
 }
 
 static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
@@ -320,11 +320,6 @@ cifs_reconnect(struct TCP_Server_Info *server)
                 */
                reconn_set_next_dfs_target(server, cifs_sb, &tgt_list, &tgt_it);
 #endif
-               rc = reconn_set_ipaddr(server);
-               if (rc) {
-                       cifs_dbg(FYI, "%s: failed to resolve hostname: %d\n",
-                                __func__, rc);
-               }
 
                if (cifs_rdma_enabled(server))
                        rc = smbd_reconnect(server);