Commit 02548c47 authored by Stefan Metzmacher's avatar Stefan Metzmacher Committed by Steve French
Browse files

smb: client: queue post_recv_credits_work also if the peer raises the credit target



This is already handled in the server, but currently it done
in a very complex way there. So we do it much simpler.

Note that put_receive_buffer() will take care of it
in case data_length is 0.

Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.com>
Cc: Long Li <longli@microsoft.com>
Cc: linux-cifs@vger.kernel.org
Cc: samba-technical@lists.samba.org
Acked-by: default avatarNamjae Jeon <linkinjeon@kernel.org>
Signed-off-by: default avatarStefan Metzmacher <metze@samba.org>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent b0aa92a2
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -590,6 +590,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
	struct smbdirect_socket_parameters *sp = &sc->parameters;
	struct smbd_connection *info =
		container_of(sc, struct smbd_connection, socket);
	int old_recv_credit_target;
	u32 data_offset = 0;
	u32 data_length = 0;
	u32 remaining_data_length = 0;
@@ -661,6 +662,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
		}

		atomic_dec(&info->receive_credits);
		old_recv_credit_target = info->receive_credit_target;
		info->receive_credit_target =
			le16_to_cpu(data_transfer->credits_requested);
		if (le16_to_cpu(data_transfer->credits_granted)) {
@@ -691,6 +693,9 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
		 * reassembly queue and wake up the reading thread
		 */
		if (data_length) {
			if (info->receive_credit_target > old_recv_credit_target)
				queue_work(info->workqueue, &info->post_send_credits_work);

			enqueue_reassembly(info, response, data_length);
			wake_up(&sc->recv_io.reassembly.wait_queue);
		} else