[PATCH 2/4] cifs: Simplify reconnect code when dfs upcall is enabled

Tim Gardner tim.gardner at canonical.com
Thu May 27 14:49:13 UTC 2021


From: Samuel Cabrero <scabrero at suse.de>

BugLink: https://bugs.launchpad.net/bugs/1929831

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 at suse.de>
Reviewed-by: Aurelien Aptel <aaptel at suse.com>
Signed-off-by: Steve French <stfrench at microsoft.com>
(backported from commit 7d6535b720421d58886d5590ffc3617d359aa871)
[rtg - minor context adjustment]
Signed-off-by: Tim Gardner <tim.gardner at canonical.com>
---
 fs/cifs/connect.c | 20 ++++++++------------
 1 file changed, 8 insertions(+), 12 deletions(-)

diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index 1746aadf85ef4..e096751a73873 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -344,7 +344,7 @@ static char *extract_hostname(const char *unc);
  * 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;
@@ -379,12 +379,6 @@ 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
 struct super_cb_data {
@@ -441,6 +435,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;
@@ -465,6 +460,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,
@@ -621,11 +622,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);
-- 
2.17.1




More information about the kernel-team mailing list