summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEnzo Matsumiya <ematsumiya@suse.de>2026-01-16 16:15:25 -0300
committerEnzo Matsumiya <ematsumiya@suse.de>2026-01-21 14:30:39 -0300
commitc9efc56f87afe11ea40d1e0934fd5d9f27b8e5e8 (patch)
treeb5d6f3c7f4b2033548a47c3ec03f3f09ad4bfc7d
parent3feabe63584bccc7de38a4a6ff7c16752f9e9a59 (diff)
downloadlinux-compress-2025-01-21.tar.gz
linux-compress-2025-01-21.tar.bz2
linux-compress-2025-01-21.zip
smb: client: disable compression on reconnectscompress-2025-01-21
Windows Server resets the connection if it gets a compressed request that it couldn't decompress. Some encoded payloads might decode differently on the server, which can be caused by different implementation details, or a bug on client's or server's implementation. To prevent an infinite retry on such failed sends, simply disable compression for that server when a reconnect is about to happen. Signed-off-by: Enzo Matsumiya <ematsumiya@suse.de>
-rw-r--r--fs/smb/client/connect.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c
index 2f94d93b95e9..26023a870202 100644
--- a/fs/smb/client/connect.c
+++ b/fs/smb/client/connect.c
@@ -398,6 +398,20 @@ static int __cifs_reconnect(struct TCP_Server_Info *server,
try_to_freeze();
cifs_server_lock(server);
+ /*
+ * Servers might disconnect us when they can't decompress a compressed request we
+ * sent.
+ * When this happens, as a failsafe measure, disable compression entirely to avoid
+ * an endless retry.
+ *
+ * TODO: implement a more flexible alternative, e.g. identify and retry sending the
+ * failed request uncompressed, without having to disable compression entirely.
+ */
+ if (server->compression.enabled) {
+ cifs_server_dbg(VFS | ONCE, "disabling compression (failsafe)\n");
+ memset(&server->compression, 0, sizeof(server->compression));
+ }
+
if (!cifs_swn_set_server_dstaddr(server) &&
!SERVER_IS_CHAN(server)) {
/* resolve the hostname again to make sure that IP address is up-to-date */