65 lines
2.1 KiB
Diff
65 lines
2.1 KiB
Diff
From 48fd713e7c35aba7a4c3ed327977897909575e3e Mon Sep 17 00:00:00 2001
|
|
From: Shyam Prasad N <sprasad@microsoft.com>
|
|
Date: Mon, 2 Jun 2025 22:37:17 +0530
|
|
Subject: cifs: do not disable interface polling on failure
|
|
|
|
When a server has multichannel enabled, we keep polling the server
|
|
for interfaces periodically. However, when this query fails, we
|
|
disable the polling. This can be problematic as it takes away the
|
|
chance for the server to start advertizing again.
|
|
|
|
This change reschedules the delayed work, even if the current call
|
|
failed. That way, multichannel sessions can recover.
|
|
|
|
Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
|
|
Cc: stable@vger.kernel.org
|
|
Signed-off-by: Steve French <stfrench@microsoft.com>
|
|
---
|
|
fs/smb/client/connect.c | 6 +-----
|
|
fs/smb/client/smb2pdu.c | 9 +++++----
|
|
2 files changed, 6 insertions(+), 9 deletions(-)
|
|
|
|
--- a/fs/smb/client/connect.c
|
|
+++ b/fs/smb/client/connect.c
|
|
@@ -116,13 +116,9 @@ static void smb2_query_server_interfaces
|
|
rc = server->ops->query_server_interfaces(xid, tcon, false);
|
|
free_xid(xid);
|
|
|
|
- if (rc) {
|
|
- if (rc == -EOPNOTSUPP)
|
|
- return;
|
|
-
|
|
+ if (rc)
|
|
cifs_dbg(FYI, "%s: failed to query server interfaces: %d\n",
|
|
__func__, rc);
|
|
- }
|
|
|
|
queue_delayed_work(cifsiod_wq, &tcon->query_interfaces,
|
|
(SMB_INTERFACE_POLL_INTERVAL * HZ));
|
|
--- a/fs/smb/client/smb2pdu.c
|
|
+++ b/fs/smb/client/smb2pdu.c
|
|
@@ -423,6 +423,10 @@ skip_sess_setup:
|
|
free_xid(xid);
|
|
ses->flags &= ~CIFS_SES_FLAGS_PENDING_QUERY_INTERFACES;
|
|
|
|
+ /* regardless of rc value, setup polling */
|
|
+ queue_delayed_work(cifsiod_wq, &tcon->query_interfaces,
|
|
+ (SMB_INTERFACE_POLL_INTERVAL * HZ));
|
|
+
|
|
mutex_unlock(&ses->session_mutex);
|
|
|
|
if (rc == -EOPNOTSUPP && ses->chan_count > 1) {
|
|
@@ -443,11 +447,8 @@ skip_sess_setup:
|
|
if (ses->chan_max > ses->chan_count &&
|
|
ses->iface_count &&
|
|
!SERVER_IS_CHAN(server)) {
|
|
- if (ses->chan_count == 1) {
|
|
+ if (ses->chan_count == 1)
|
|
cifs_server_dbg(VFS, "supports multichannel now\n");
|
|
- queue_delayed_work(cifsiod_wq, &tcon->query_interfaces,
|
|
- (SMB_INTERFACE_POLL_INTERVAL * HZ));
|
|
- }
|
|
|
|
cifs_try_adding_channels(ses);
|
|
}
|