]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
cifs: Make smb1's SendReceive() wrap cifs_send_recv()
authorDavid Howells <dhowells@redhat.com>
Tue, 5 Aug 2025 12:58:43 +0000 (13:58 +0100)
committerSteve French <stfrench@microsoft.com>
Fri, 5 Dec 2025 23:09:47 +0000 (17:09 -0600)
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 <dhowells@redhat.com>
Reviewed-by: Paulo 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: Steve French <stfrench@microsoft.com>
fs/smb/client/cifstransport.c

index d12578b3717991796b6be515fa3e1ddbc9bf15f7..1a28d361b1f761d5f4fe7c8c9d5d306cffd99317 100644 (file)
@@ -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;
 }