diff options
author | Pavel Shilovsky <piastryyy@gmail.com> | 2019-03-04 14:02:50 -0800 |
---|---|---|
committer | Steve French <stfrench@microsoft.com> | 2019-03-04 20:06:12 -0600 |
commit | c781af7e0c1fed9f1d0e0ec31b86f5b21a8dca17 (patch) | |
tree | 1712a2e7f7e5be3fdf63b77ddbeeb41925c6ef03 /fs/cifs/transport.c | |
parent | 4fe75c4e4bc2caeb4159573e26cf3075e2c0fd9b (diff) | |
download | linux-stable-c781af7e0c1fed9f1d0e0ec31b86f5b21a8dca17.tar.gz linux-stable-c781af7e0c1fed9f1d0e0ec31b86f5b21a8dca17.tar.bz2 linux-stable-c781af7e0c1fed9f1d0e0ec31b86f5b21a8dca17.zip |
CIFS: Do not skip SMB2 message IDs on send failures
When we hit failures during constructing MIDs or sending PDUs
through the network, we end up not using message IDs assigned
to the packet. The next SMB packet will skip those message IDs
and continue with the next one. This behavior may lead to a server
not granting us credits until we use the skipped IDs. Fix this by
reverting the current ID to the original value if any errors occur
before we push the packet through the network stack.
This patch fixes the generic/310 test from the xfs-tests.
Cc: <stable@vger.kernel.org> # 4.19.x
Signed-off-by: Pavel Shilovsky <pshilov@microsoft.com>
Signed-off-by: Steve French <stfrench@microsoft.com>
Diffstat (limited to 'fs/cifs/transport.c')
-rw-r--r-- | fs/cifs/transport.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c index 53532bd3f50d..9544eb99b5a2 100644 --- a/fs/cifs/transport.c +++ b/fs/cifs/transport.c @@ -647,6 +647,7 @@ cifs_call_async(struct TCP_Server_Info *server, struct smb_rqst *rqst, cifs_in_send_dec(server); if (rc < 0) { + revert_current_mid(server, mid->credits); server->sequence_number -= 2; cifs_delete_mid(mid); } @@ -868,6 +869,7 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses, for (i = 0; i < num_rqst; i++) { midQ[i] = ses->server->ops->setup_request(ses, &rqst[i]); if (IS_ERR(midQ[i])) { + revert_current_mid(ses->server, i); for (j = 0; j < i; j++) cifs_delete_mid(midQ[j]); mutex_unlock(&ses->server->srv_mutex); @@ -897,8 +899,10 @@ compound_send_recv(const unsigned int xid, struct cifs_ses *ses, for (i = 0; i < num_rqst; i++) cifs_save_when_sent(midQ[i]); - if (rc < 0) + if (rc < 0) { + revert_current_mid(ses->server, num_rqst); ses->server->sequence_number -= 2; + } mutex_unlock(&ses->server->srv_mutex); |