From: David Howells Date: Tue, 5 Aug 2025 12:58:43 +0000 (+0100) Subject: cifs: Make smb1's SendReceive() wrap cifs_send_recv() X-Git-Tag: v6.19-rc1~47^2~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6be09580df5cf87e601c1ec56b9a0c891d3a0bc8;p=thirdparty%2Fkernel%2Flinux.git 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: David Howells Reviewed-by: Paulo Alcantara (Red Hat) cc: Shyam Prasad N cc: Tom Talpey cc: linux-cifs@vger.kernel.org cc: netfs@lists.linux.dev cc: linux-fsdevel@vger.kernel.org Signed-off-by: Steve French --- diff --git a/fs/smb/client/cifstransport.c b/fs/smb/client/cifstransport.c index d12578b371799..1a28d361b1f76 100644 --- a/fs/smb/client/cifstransport.c +++ b/fs/smb/client/cifstransport.c @@ -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); - - if (rc < 0) - server->sequence_number -= 2; - - cifs_server_unlock(server); - + rc = cifs_send_recv(xid, ses, ses->server, + &rqst, &resp_buf_type, flags, &resp_iov); 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; }