| From acc58d0bab55a50e02c25f00bd6a210ee121595f Mon Sep 17 00:00:00 2001 |
| From: Pavel Shilovsky <pshilov@microsoft.com> |
| Date: Thu, 17 Jan 2019 08:21:24 -0800 |
| Subject: CIFS: Fix possible hang during async MTU reads and writes |
| |
| From: Pavel Shilovsky <pshilov@microsoft.com> |
| |
| commit acc58d0bab55a50e02c25f00bd6a210ee121595f upstream. |
| |
| When doing MTU i/o we need to leave some credits for |
| possible reopen requests and other operations happening |
| in parallel. Currently we leave 1 credit which is not |
| enough even for reopen only: we need at least 2 credits |
| if durable handle reconnect fails. Also there may be |
| other operations at the same time including compounding |
| ones which require 3 credits at a time each. Fix this |
| by leaving 8 credits which is big enough to cover most |
| scenarios. |
| |
| Was able to reproduce this when server was configured |
| to give out fewer credits than usual. |
| |
| The proper fix would be to reconnect a file handle first |
| and then obtain credits for an MTU request but this leads |
| to bigger code changes and should happen in other patches. |
| |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Pavel Shilovsky <pshilov@microsoft.com> |
| Signed-off-by: Steve French <stfrench@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/cifs/smb2ops.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/fs/cifs/smb2ops.c |
| +++ b/fs/cifs/smb2ops.c |
| @@ -165,14 +165,14 @@ smb2_wait_mtu_credits(struct TCP_Server_ |
| |
| scredits = server->credits; |
| /* can deadlock with reopen */ |
| - if (scredits == 1) { |
| + if (scredits <= 8) { |
| *num = SMB2_MAX_BUFFER_SIZE; |
| *credits = 0; |
| break; |
| } |
| |
| - /* leave one credit for a possible reopen */ |
| - scredits--; |
| + /* leave some credits for reopen and other ops */ |
| + scredits -= 8; |
| *num = min_t(unsigned int, size, |
| scredits * SMB2_MAX_BUFFER_SIZE); |
| |