+++ /dev/null
-From 74ebd02163fde05baa23129e06dde4b8f0f2377a Mon Sep 17 00:00:00 2001
-From: Shyam Prasad N <sprasad@microsoft.com>
-Date: Mon, 30 Jun 2025 23:09:34 +0530
-Subject: cifs: all initializations for tcon should happen in tcon_info_alloc
-
-From: Shyam Prasad N <sprasad@microsoft.com>
-
-commit 74ebd02163fde05baa23129e06dde4b8f0f2377a upstream.
-
-Today, a few work structs inside tcon are initialized inside
-cifs_get_tcon and not in tcon_info_alloc. As a result, if a tcon
-is obtained from tcon_info_alloc, but not called as a part of
-cifs_get_tcon, we may trip over.
-
-Cc: <stable@vger.kernel.org>
-Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
-Reviewed-by: Paulo Alcantara (Red Hat) <pc@manguebit.org>
-Signed-off-by: Steve French <stfrench@microsoft.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- fs/smb/client/cifsproto.h | 1 +
- fs/smb/client/connect.c | 8 +-------
- fs/smb/client/misc.c | 6 ++++++
- 3 files changed, 8 insertions(+), 7 deletions(-)
-
---- a/fs/smb/client/cifsproto.h
-+++ b/fs/smb/client/cifsproto.h
-@@ -136,6 +136,7 @@ extern int SendReceiveBlockingLock(const
- struct smb_hdr *out_buf,
- int *bytes_returned);
-
-+void smb2_query_server_interfaces(struct work_struct *work);
- void
- cifs_signal_cifsd_for_reconnect(struct TCP_Server_Info *server,
- bool all_channels);
---- a/fs/smb/client/connect.c
-+++ b/fs/smb/client/connect.c
-@@ -113,7 +113,7 @@ static int reconn_set_ipaddr_from_hostna
- return rc;
- }
-
--static void smb2_query_server_interfaces(struct work_struct *work)
-+void smb2_query_server_interfaces(struct work_struct *work)
- {
- int rc;
- int xid;
-@@ -2807,20 +2807,14 @@ cifs_get_tcon(struct cifs_ses *ses, stru
- tcon->max_cached_dirs = ctx->max_cached_dirs;
- tcon->nodelete = ctx->nodelete;
- tcon->local_lease = ctx->local_lease;
-- INIT_LIST_HEAD(&tcon->pending_opens);
- tcon->status = TID_GOOD;
-
-- INIT_DELAYED_WORK(&tcon->query_interfaces,
-- smb2_query_server_interfaces);
- if (ses->server->dialect >= SMB30_PROT_ID &&
- (ses->server->capabilities & SMB2_GLOBAL_CAP_MULTI_CHANNEL)) {
- /* schedule query interfaces poll */
- queue_delayed_work(cifsiod_wq, &tcon->query_interfaces,
- (SMB_INTERFACE_POLL_INTERVAL * HZ));
- }
--#ifdef CONFIG_CIFS_DFS_UPCALL
-- INIT_DELAYED_WORK(&tcon->dfs_cache_work, dfs_cache_refresh);
--#endif
- spin_lock(&cifs_tcp_ses_lock);
- list_add(&tcon->tcon_list, &ses->tcon_list);
- spin_unlock(&cifs_tcp_ses_lock);
---- a/fs/smb/client/misc.c
-+++ b/fs/smb/client/misc.c
-@@ -1359,6 +1359,12 @@ int cifs_inval_name_dfs_link_error(const
- return 0;
- }
- #endif
-+ INIT_LIST_HEAD(&ret_buf->pending_opens);
-+ INIT_DELAYED_WORK(&ret_buf->query_interfaces,
-+ smb2_query_server_interfaces);
-+#ifdef CONFIG_CIFS_DFS_UPCALL
-+ INIT_DELAYED_WORK(&ret_buf->dfs_cache_work, dfs_cache_refresh);
-+#endif
-
- int cifs_wait_for_server_reconnect(struct TCP_Server_Info *server, bool retry)
- {