Commit 6be09580 authored by David Howells's avatar David Howells Committed by Steve French
Browse files

cifs: Make smb1's SendReceive() wrap cifs_send_recv()



Make the smb1 transport's SendReceive() simply wrap cifs_send_recv() as
does SendReceive2().  This will then allow that to pick up the transport
changes there.

Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
Reviewed-by: default avatarPaulo Alcantara (Red Hat) <pc@manguebit.org>
cc: Shyam Prasad N <sprasad@microsoft.com>
cc: Tom Talpey <tom@talpey.com>
cc: linux-cifs@vger.kernel.org
cc: netfs@lists.linux.dev
cc: linux-fsdevel@vger.kernel.org
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 83bfbd0b
Loading
Loading
Loading
Loading
+10 −72
Original line number Diff line number Diff line
@@ -236,12 +236,12 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses,
	    struct smb_hdr *in_buf, unsigned int in_len,
	    struct smb_hdr *out_buf, int *pbytes_returned, const int flags)
{
	int rc = 0;
	struct mid_q_entry *mid;
	struct TCP_Server_Info *server;
	struct kvec resp_iov = {};
	struct kvec iov = { .iov_base = in_buf, .iov_len = in_len };
	struct smb_rqst rqst = { .rq_iov = &iov, .rq_nvec = 1 };
	struct cifs_credits credits = { .value = 1, .instance = 0 };
	struct TCP_Server_Info *server;
	int resp_buf_type;
	int rc = 0;

	if (WARN_ON_ONCE(in_len > 0xffffff))
		return -EIO;
@@ -272,77 +272,15 @@ SendReceive(const unsigned int xid, struct cifs_ses *ses,
		return -EIO;
	}

	rc = wait_for_free_request(server, flags, &credits.instance);
	if (rc)
		return rc;

	/* make sure that we sign in the same order that we send on this socket
	   and avoid races inside tcp sendmsg code that could cause corruption
	   of smb data */

	cifs_server_lock(server);

	rc = allocate_mid(ses, in_buf, &mid);
	if (rc) {
		cifs_server_unlock(server);
		/* Update # of requests on wire to server */
		add_credits(server, &credits, 0);
		return rc;
	}

	rc = cifs_sign_smb(in_buf, in_len, server, &mid->sequence_number);
	if (rc) {
		cifs_server_unlock(server);
		goto out;
	}

	mid->mid_state = MID_REQUEST_SUBMITTED;

	rc = smb_send(server, in_buf, in_len);
	cifs_save_when_sent(mid);

	rc = cifs_send_recv(xid, ses, ses->server,
			    &rqst, &resp_buf_type, flags, &resp_iov);
	if (rc < 0)
		server->sequence_number -= 2;

	cifs_server_unlock(server);

	if (rc < 0)
		goto out;

	rc = wait_for_response(server, mid);
	if (rc != 0) {
		send_cancel(server, &rqst, mid);
		spin_lock(&mid->mid_lock);
		if (mid->callback) {
			/* no longer considered to be "in-flight" */
			mid->callback = release_mid;
			spin_unlock(&mid->mid_lock);
			add_credits(server, &credits, 0);
		return rc;
		}
		spin_unlock(&mid->mid_lock);
	}

	rc = cifs_sync_mid_result(mid, server);
	if (rc != 0) {
		add_credits(server, &credits, 0);
		return rc;
	}

	if (!mid->resp_buf || !out_buf ||
	    mid->mid_state != MID_RESPONSE_READY) {
		rc = -EIO;
		cifs_server_dbg(VFS, "Bad MID state?\n");
		goto out;
	}

	*pbytes_returned = mid->response_pdu_len;
	memcpy(out_buf, mid->resp_buf, *pbytes_returned);
	rc = cifs_check_receive(mid, server, 0);
out:
	delete_mid(mid);
	add_credits(server, &credits, 0);

	*pbytes_returned = resp_iov.iov_len;
	if (resp_iov.iov_len)
		memcpy(out_buf, resp_iov.iov_base, resp_iov.iov_len);
	free_rsp_buf(resp_buf_type, resp_iov.iov_base);
	return rc;
}