Commit eca00452 authored by Ronnie Sahlberg's avatar Ronnie Sahlberg Committed by Steve French
Browse files

cifs: add credits from unmatched responses/messages



We should add any credits granted to us from unmatched server responses.

Signed-off-by: default avatarRonnie Sahlberg <lsahlber@redhat.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
Reviewed-by: default avatarPavel Shilovsky <pshilov@microsoft.com>
parent 74ea5f98
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -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 */
			}
+0 −7
Original line number Diff line number Diff line
@@ -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)