cifs: add credits from unmatched responses/messages
We should add any credits granted to us from unmatched server responses. Signed-off-by: Ronnie Sahlberg <lsahlber@redhat.com> Signed-off-by: Steve French <stfrench@microsoft.com> Reviewed-by: Pavel Shilovsky <pshilov@microsoft.com>
This commit is contained in:
parent
74ea5f983f
commit
eca0045238
@ -1063,6 +1063,26 @@ cifs_handle_standard(struct TCP_Server_Info *server, struct mid_q_entry *mid)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
smb2_add_credits_from_hdr(char *buffer, struct TCP_Server_Info *server)
|
||||
{
|
||||
struct smb2_sync_hdr *shdr = (struct smb2_sync_hdr *)buffer;
|
||||
|
||||
/*
|
||||
* SMB1 does not use credits.
|
||||
*/
|
||||
if (server->vals->header_preamble_size)
|
||||
return;
|
||||
|
||||
if (shdr->CreditRequest) {
|
||||
spin_lock(&server->req_lock);
|
||||
server->credits += le16_to_cpu(shdr->CreditRequest);
|
||||
spin_unlock(&server->req_lock);
|
||||
wake_up(&server->request_q);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
cifs_demultiplex_thread(void *p)
|
||||
{
|
||||
@ -1192,6 +1212,7 @@ next_pdu:
|
||||
} else if (server->ops->is_oplock_break &&
|
||||
server->ops->is_oplock_break(bufs[i],
|
||||
server)) {
|
||||
smb2_add_credits_from_hdr(bufs[i], server);
|
||||
cifs_dbg(FYI, "Received oplock break\n");
|
||||
} else {
|
||||
cifs_dbg(VFS, "No task to wake, unknown frame "
|
||||
@ -1203,6 +1224,7 @@ next_pdu:
|
||||
if (server->ops->dump_detail)
|
||||
server->ops->dump_detail(bufs[i],
|
||||
server);
|
||||
smb2_add_credits_from_hdr(bufs[i], server);
|
||||
cifs_dump_mids(server);
|
||||
#endif /* CIFS_DEBUG2 */
|
||||
}
|
||||
|
@ -648,13 +648,6 @@ smb2_is_valid_oplock_break(char *buffer, struct TCP_Server_Info *server)
|
||||
if (rsp->sync_hdr.Command != SMB2_OPLOCK_BREAK)
|
||||
return false;
|
||||
|
||||
if (rsp->sync_hdr.CreditRequest) {
|
||||
spin_lock(&server->req_lock);
|
||||
server->credits += le16_to_cpu(rsp->sync_hdr.CreditRequest);
|
||||
spin_unlock(&server->req_lock);
|
||||
wake_up(&server->request_q);
|
||||
}
|
||||
|
||||
if (rsp->StructureSize !=
|
||||
smb2_rsp_struct_sizes[SMB2_OPLOCK_BREAK_HE]) {
|
||||
if (le16_to_cpu(rsp->StructureSize) == 44)
|
||||
|
Loading…
Reference in New Issue
Block a user