diff options
| author | Enzo Matsumiya <ematsumiya@suse.de> | 2026-01-16 16:15:25 -0300 |
|---|---|---|
| committer | Enzo Matsumiya <ematsumiya@suse.de> | 2026-01-21 14:30:39 -0300 |
| commit | c9efc56f87afe11ea40d1e0934fd5d9f27b8e5e8 (patch) | |
| tree | b5d6f3c7f4b2033548a47c3ec03f3f09ad4bfc7d | |
| parent | 3feabe63584bccc7de38a4a6ff7c16752f9e9a59 (diff) | |
| download | linux-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.c | 14 |
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 */ |
