summaryrefslogtreecommitdiffstats
path: root/fs/cifs/transport.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2021-02-07 00:26:28 +0100
committerLinus Torvalds <torvalds@linux-foundation.org>2021-02-07 00:26:28 +0100
commit825b5991a46ef28a05a4646c8fe1ae5cef7c7828 (patch)
treec2407ccb134ede902535a7355cb1511db0200fb4 /fs/cifs/transport.c
parentMerge tag 'riscv-for-linus-5.11-rc7' of git://git.kernel.org/pub/scm/linux/ke... (diff)
parentcifs: report error instead of invalid when revalidating a dentry fails (diff)
downloadlinux-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.c18
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);