diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2021-02-07 00:26:28 +0100 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2021-02-07 00:26:28 +0100 |
commit | 825b5991a46ef28a05a4646c8fe1ae5cef7c7828 (patch) | |
tree | c2407ccb134ede902535a7355cb1511db0200fb4 /fs/cifs/transport.c | |
parent | Merge tag 'riscv-for-linus-5.11-rc7' of git://git.kernel.org/pub/scm/linux/ke... (diff) | |
parent | cifs: report error instead of invalid when revalidating a dentry fails (diff) | |
download | linux-825b5991a46ef28a05a4646c8fe1ae5cef7c7828.tar.xz linux-825b5991a46ef28a05a4646c8fe1ae5cef7c7828.zip |
Merge tag '5.11-rc6-smb3' of git://git.samba.org/sfrench/cifs-2.6
Pull cifs fixes from Steve French:
"Three small smb3 fixes for stable"
* tag '5.11-rc6-smb3' of git://git.samba.org/sfrench/cifs-2.6:
cifs: report error instead of invalid when revalidating a dentry fails
smb3: fix crediting for compounding when only one request in flight
smb3: Fix out-of-bounds bug in SMB2_negotiate()
Diffstat (limited to 'fs/cifs/transport.c')
-rw-r--r-- | fs/cifs/transport.c | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index 95ef26b555b9..4a2b836eb017 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c @@ -666,10 +666,22 @@ wait_for_compound_request(struct TCP_Server_Info *server, int num, if (*credits < num) { /* - * Return immediately if not too many requests in flight since - * we will likely be stuck on waiting for credits. + * If the server is tight on resources or just gives us less + * credits for other reasons (e.g. requests are coming out of + * order and the server delays granting more credits until it + * processes a missing mid) and we exhausted most available + * credits there may be situations when we try to send + * a compound request but we don't have enough credits. At this + * point the client needs to decide if it should wait for + * additional credits or fail the request. If at least one + * request is in flight there is a high probability that the + * server will return enough credits to satisfy this compound + * request. + * + * Return immediately if no requests in flight since we will be + * stuck on waiting for credits. */ - if (server->in_flight < num - *credits) { + if (server->in_flight == 0) { spin_unlock(&server->req_lock); trace_smb3_insufficient_credits(server->CurrentMid, server->hostname, scredits, sin_flight); |