--- /dev/null
+From cc7d79d4fad6a4eab3f88c4bb237de72be4478f1 Mon Sep 17 00:00:00 2001
+From: Shyam Prasad N <sprasad@microsoft.com>
+Date: Thu, 22 Dec 2022 12:54:44 +0000
+Subject: cifs: fix interface count calculation during refresh
+
+From: Shyam Prasad N <sprasad@microsoft.com>
+
+commit cc7d79d4fad6a4eab3f88c4bb237de72be4478f1 upstream.
+
+The last fix to iface_count did fix the overcounting issue.
+However, during each refresh, we could end up undercounting
+the iface_count, if a match was found.
+
+Fixing this by doing increments and decrements instead of
+setting it to 0 before each parsing of server interfaces.
+
+Fixes: 096bbeec7bd6 ("smb3: interface count displayed incorrectly")
+Cc: stable@vger.kernel.org # 6.1
+Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
+Reviewed-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
+Signed-off-by: Steve French <stfrench@microsoft.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/cifs/smb2ops.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/fs/cifs/smb2ops.c
++++ b/fs/cifs/smb2ops.c
+@@ -530,7 +530,6 @@ parse_server_interfaces(struct network_i
+ p = buf;
+
+ spin_lock(&ses->iface_lock);
+- ses->iface_count = 0;
+ /*
+ * Go through iface_list and do kref_put to remove
+ * any unused ifaces. ifaces in use will be removed
+@@ -540,6 +539,7 @@ parse_server_interfaces(struct network_i
+ iface_head) {
+ iface->is_active = 0;
+ kref_put(&iface->refcount, release_iface);
++ ses->iface_count--;
+ }
+ spin_unlock(&ses->iface_lock);
+
+@@ -618,6 +618,7 @@ parse_server_interfaces(struct network_i
+ /* just get a ref so that it doesn't get picked/freed */
+ iface->is_active = 1;
+ kref_get(&iface->refcount);
++ ses->iface_count++;
+ spin_unlock(&ses->iface_lock);
+ goto next_iface;
+ } else if (ret < 0) {
--- /dev/null
+From 7246210ecdd0cda97fa3e3bb15c32c6c2d9a23b5 Mon Sep 17 00:00:00 2001
+From: Shyam Prasad N <sprasad@microsoft.com>
+Date: Tue, 27 Dec 2022 11:29:28 +0000
+Subject: cifs: refcount only the selected iface during interface update
+
+From: Shyam Prasad N <sprasad@microsoft.com>
+
+commit 7246210ecdd0cda97fa3e3bb15c32c6c2d9a23b5 upstream.
+
+When the server interface for a channel is not active anymore,
+we have the logic to select an alternative interface. However
+this was not breaking out of the loop as soon as a new alternative
+was found. As a result, some interfaces may get refcounted unintentionally.
+
+There was also a bug in checking if we found an alternate iface.
+Fixed that too.
+
+Fixes: b54034a73baf ("cifs: during reconnect, update interface if necessary")
+Cc: stable@vger.kernel.org # 5.19+
+Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
+Reviewed-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
+Signed-off-by: Steve French <stfrench@microsoft.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ fs/cifs/sess.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/fs/cifs/sess.c
++++ b/fs/cifs/sess.c
+@@ -292,9 +292,10 @@ cifs_chan_update_iface(struct cifs_ses *
+ continue;
+ }
+ kref_get(&iface->refcount);
++ break;
+ }
+
+- if (!list_entry_is_head(iface, &ses->iface_list, iface_head)) {
++ if (list_entry_is_head(iface, &ses->iface_list, iface_head)) {
+ rc = 1;
+ iface = NULL;
+ cifs_dbg(FYI, "unable to find a suitable iface\n");