From 5e7170bffefc95ae59569fce2d47f6817b6a9cf7 Mon Sep 17 00:00:00 2001 From: Enzo Matsumiya Date: Fri, 16 Jan 2026 16:15:25 -0300 Subject: smb: client: disable compression on reconnects 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 --- fs/smb/client/connect.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+) 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 */ -- cgit v1.2.3