Jiri Slaby 7a187a
From: Shyam Prasad N <sprasad@microsoft.com>
Jiri Slaby 7a187a
Date: Wed, 8 Mar 2023 12:11:31 +0000
Jiri Slaby 7a187a
Subject: [PATCH] cifs: do not poll server interfaces too regularly
Jiri Slaby 7a187a
References: bsc#1012628
Jiri Slaby 7a187a
Patch-mainline: 6.2.9
Jiri Slaby 7a187a
Git-commit: 072a28c8907c841f7d4b56c78bce46d3ee211e73
Jiri Slaby 7a187a
Jiri Slaby 7a187a
commit 072a28c8907c841f7d4b56c78bce46d3ee211e73 upstream.
Jiri Slaby 7a187a
Jiri Slaby 7a187a
We have the server interface list hanging off the tcon
Jiri Slaby 7a187a
structure today for reasons unknown. So each tcon which is
Jiri Slaby 7a187a
connected to a file server can query them separately,
Jiri Slaby 7a187a
which is really unnecessary. To avoid this, in the query
Jiri Slaby 7a187a
function, we will check the time of last update of the
Jiri Slaby 7a187a
interface list, and avoid querying the server if it is
Jiri Slaby 7a187a
within a certain range.
Jiri Slaby 7a187a
Jiri Slaby 7a187a
Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
Jiri Slaby 7a187a
Reviewed-by: Paulo Alcantara (SUSE) <pc@manguebit.com>
Jiri Slaby 7a187a
Cc: stable@vger.kernel.org
Jiri Slaby 7a187a
Signed-off-by: Steve French <stfrench@microsoft.com>
Jiri Slaby 7a187a
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Jiri Slaby 7a187a
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Jiri Slaby 7a187a
---
Jiri Slaby 7a187a
 fs/cifs/smb2ops.c | 14 ++++++++++++++
Jiri Slaby 7a187a
 1 file changed, 14 insertions(+)
Jiri Slaby 7a187a
Jiri Slaby 7a187a
diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
Jiri Slaby 7a187a
index a9371f15..6a1db6ca 100644
Jiri Slaby 7a187a
--- a/fs/cifs/smb2ops.c
Jiri Slaby 7a187a
+++ b/fs/cifs/smb2ops.c
Jiri Slaby 7a187a
@@ -530,6 +530,14 @@ parse_server_interfaces(struct network_interface_info_ioctl_rsp *buf,
Jiri Slaby 7a187a
 	p = buf;
Jiri Slaby 7a187a
 
Jiri Slaby 7a187a
 	spin_lock(&ses->iface_lock);
Jiri Slaby 7a187a
+	/* do not query too frequently, this time with lock held */
Jiri Slaby 7a187a
+	if (ses->iface_last_update &&
Jiri Slaby 7a187a
+	    time_before(jiffies, ses->iface_last_update +
Jiri Slaby 7a187a
+			(SMB_INTERFACE_POLL_INTERVAL * HZ))) {
Jiri Slaby 7a187a
+		spin_unlock(&ses->iface_lock);
Jiri Slaby 7a187a
+		return 0;
Jiri Slaby 7a187a
+	}
Jiri Slaby 7a187a
+
Jiri Slaby 7a187a
 	/*
Jiri Slaby 7a187a
 	 * Go through iface_list and do kref_put to remove
Jiri Slaby 7a187a
 	 * any unused ifaces. ifaces in use will be removed
Jiri Slaby 7a187a
@@ -696,6 +704,12 @@ SMB3_request_interfaces(const unsigned int xid, struct cifs_tcon *tcon, bool in_
Jiri Slaby 7a187a
 	struct network_interface_info_ioctl_rsp *out_buf = NULL;
Jiri Slaby 7a187a
 	struct cifs_ses *ses = tcon->ses;
Jiri Slaby 7a187a
 
Jiri Slaby 7a187a
+	/* do not query too frequently */
Jiri Slaby 7a187a
+	if (ses->iface_last_update &&
Jiri Slaby 7a187a
+	    time_before(jiffies, ses->iface_last_update +
Jiri Slaby 7a187a
+			(SMB_INTERFACE_POLL_INTERVAL * HZ)))
Jiri Slaby 7a187a
+		return 0;
Jiri Slaby 7a187a
+
Jiri Slaby 7a187a
 	rc = SMB2_ioctl(xid, tcon, NO_FILE_ID, NO_FILE_ID,
Jiri Slaby 7a187a
 			FSCTL_QUERY_NETWORK_INTERFACE_INFO,
Jiri Slaby 7a187a
 			NULL /* no data input */, 0 /* no data input */,
Jiri Slaby 7a187a
-- 
Jiri Slaby 7a187a
2.35.3
Jiri Slaby 7a187a