]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
smb: server: make use of common smbdirect_pdu.h
authorStefan Metzmacher <metze@samba.org>
Sat, 16 Aug 2025 01:24:30 +0000 (10:24 +0900)
committerSteve French <stfrench@microsoft.com>
Sun, 28 Sep 2025 23:29:51 +0000 (18:29 -0500)
Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.com>
Cc: Long Li <longli@microsoft.com>
Cc: Namjae Jeon <linkinjeon@kernel.org>
Cc: Hyunchul Lee <hyc.lee@gmail.com>
Cc: Meetakshi Setiya <meetakshisetiyaoss@gmail.com>
Cc: linux-cifs@vger.kernel.org
Cc: samba-technical@lists.samba.org
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/server/transport_rdma.c
fs/smb/server/transport_rdma.h

index e1f659d3b4cf5785b9c1da2bf40caa3b82a834c0..9401ba09310a15b0397fe9ecef26a1f188f38123 100644 (file)
 #include "connection.h"
 #include "smb_common.h"
 #include "../common/smb2status.h"
+#include "../common/smbdirect/smbdirect_pdu.h"
 #include "transport_rdma.h"
 
 #define SMB_DIRECT_PORT_IWARP          5445
 #define SMB_DIRECT_PORT_INFINIBAND     445
 
-#define SMB_DIRECT_VERSION_LE          cpu_to_le16(0x0100)
+#define SMB_DIRECT_VERSION_LE          cpu_to_le16(SMBDIRECT_V1)
 
 /* SMB_DIRECT negotiation timeout in seconds */
 #define SMB_DIRECT_NEGOTIATE_TIMEOUT           120
@@ -479,8 +480,8 @@ static int smb_direct_check_recvmsg(struct smb_direct_recvmsg *recvmsg)
 {
        switch (recvmsg->type) {
        case SMB_DIRECT_MSG_DATA_TRANSFER: {
-               struct smb_direct_data_transfer *req =
-                       (struct smb_direct_data_transfer *)recvmsg->packet;
+               struct smbdirect_data_transfer *req =
+                       (struct smbdirect_data_transfer *)recvmsg->packet;
                struct smb2_hdr *hdr = (struct smb2_hdr *)(recvmsg->packet
                                + le32_to_cpu(req->data_offset));
                ksmbd_debug(RDMA,
@@ -492,8 +493,8 @@ static int smb_direct_check_recvmsg(struct smb_direct_recvmsg *recvmsg)
                break;
        }
        case SMB_DIRECT_MSG_NEGOTIATE_REQ: {
-               struct smb_direct_negotiate_req *req =
-                       (struct smb_direct_negotiate_req *)recvmsg->packet;
+               struct smbdirect_negotiate_req *req =
+                       (struct smbdirect_negotiate_req *)recvmsg->packet;
                ksmbd_debug(RDMA,
                            "MinVersion: %u, MaxVersion: %u, CreditRequested: %u, MaxSendSize: %u, MaxRecvSize: %u, MaxFragmentedSize: %u\n",
                            le16_to_cpu(req->min_version),
@@ -547,7 +548,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
 
        switch (recvmsg->type) {
        case SMB_DIRECT_MSG_NEGOTIATE_REQ:
-               if (wc->byte_len < sizeof(struct smb_direct_negotiate_req)) {
+               if (wc->byte_len < sizeof(struct smbdirect_negotiate_req)) {
                        put_recvmsg(t, recvmsg);
                        smb_direct_disconnect_rdma_connection(t);
                        return;
@@ -559,13 +560,13 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
                wake_up_interruptible(&t->wait_status);
                return;
        case SMB_DIRECT_MSG_DATA_TRANSFER: {
-               struct smb_direct_data_transfer *data_transfer =
-                       (struct smb_direct_data_transfer *)recvmsg->packet;
+               struct smbdirect_data_transfer *data_transfer =
+                       (struct smbdirect_data_transfer *)recvmsg->packet;
                u32 remaining_data_length, data_offset, data_length;
                int avail_recvmsg_count, receive_credits;
 
                if (wc->byte_len <
-                   offsetof(struct smb_direct_data_transfer, padding)) {
+                   offsetof(struct smbdirect_data_transfer, padding)) {
                        put_recvmsg(t, recvmsg);
                        smb_direct_disconnect_rdma_connection(t);
                        return;
@@ -615,7 +616,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
                           &t->send_credits);
 
                if (le16_to_cpu(data_transfer->flags) &
-                   SMB_DIRECT_RESPONSE_REQUESTED)
+                   SMBDIRECT_FLAG_RESPONSE_REQUESTED)
                        queue_work(smb_direct_wq, &t->send_immediate_work);
 
                if (atomic_read(&t->send_credits) > 0)
@@ -680,7 +681,7 @@ static int smb_direct_read(struct ksmbd_transport *t, char *buf,
                           unsigned int size, int unused)
 {
        struct smb_direct_recvmsg *recvmsg;
-       struct smb_direct_data_transfer *data_transfer;
+       struct smbdirect_data_transfer *data_transfer;
        int to_copy, to_read, data_read, offset;
        u32 data_length, remaining_data_length, data_offset;
        int rc;
@@ -1016,7 +1017,7 @@ static int smb_direct_create_header(struct smb_direct_transport *t,
                                    struct smb_direct_sendmsg **sendmsg_out)
 {
        struct smb_direct_sendmsg *sendmsg;
-       struct smb_direct_data_transfer *packet;
+       struct smbdirect_data_transfer *packet;
        int header_length;
        int ret;
 
@@ -1025,7 +1026,7 @@ static int smb_direct_create_header(struct smb_direct_transport *t,
                return PTR_ERR(sendmsg);
 
        /* Fill in the packet header */
-       packet = (struct smb_direct_data_transfer *)sendmsg->packet;
+       packet = (struct smbdirect_data_transfer *)sendmsg->packet;
        packet->credits_requested = cpu_to_le16(t->send_credit_target);
        packet->credits_granted = cpu_to_le16(manage_credits_prior_sending(t));
 
@@ -1048,11 +1049,11 @@ static int smb_direct_create_header(struct smb_direct_transport *t,
                    le32_to_cpu(packet->remaining_data_length));
 
        /* Map the packet to DMA */
-       header_length = sizeof(struct smb_direct_data_transfer);
+       header_length = sizeof(struct smbdirect_data_transfer);
        /* If this is a packet without payload, don't send padding */
        if (!size)
                header_length =
-                       offsetof(struct smb_direct_data_transfer, padding);
+                       offsetof(struct smbdirect_data_transfer, padding);
 
        sendmsg->sge[0].addr = ib_dma_map_single(t->cm_id->device,
                                                 (void *)packet,
@@ -1228,7 +1229,7 @@ static int smb_direct_writev(struct ksmbd_transport *t,
        size_t iov_idx;
        size_t iov_ofs;
        size_t max_iov_size = st->max_send_size -
-                       sizeof(struct smb_direct_data_transfer);
+                       sizeof(struct smbdirect_data_transfer);
        int ret;
        struct smb_direct_send_ctx send_ctx;
        int error = 0;
@@ -1627,18 +1628,18 @@ static int smb_direct_send_negotiate_response(struct smb_direct_transport *t,
                                              int failed)
 {
        struct smb_direct_sendmsg *sendmsg;
-       struct smb_direct_negotiate_resp *resp;
+       struct smbdirect_negotiate_resp *resp;
        int ret;
 
        sendmsg = smb_direct_alloc_sendmsg(t);
        if (IS_ERR(sendmsg))
                return -ENOMEM;
 
-       resp = (struct smb_direct_negotiate_resp *)sendmsg->packet;
+       resp = (struct smbdirect_negotiate_resp *)sendmsg->packet;
        if (failed) {
                memset(resp, 0, sizeof(*resp));
-               resp->min_version = cpu_to_le16(0x0100);
-               resp->max_version = cpu_to_le16(0x0100);
+               resp->min_version = SMB_DIRECT_VERSION_LE;
+               resp->max_version = SMB_DIRECT_VERSION_LE;
                resp->status = STATUS_NOT_SUPPORTED;
        } else {
                resp->status = STATUS_SUCCESS;
@@ -1875,7 +1876,7 @@ static int smb_direct_create_pools(struct smb_direct_transport *t)
        snprintf(name, sizeof(name), "smb_direct_rqst_pool_%p", t);
        t->sendmsg_cache = kmem_cache_create(name,
                                             sizeof(struct smb_direct_sendmsg) +
-                                             sizeof(struct smb_direct_negotiate_resp),
+                                             sizeof(struct smbdirect_negotiate_resp),
                                             0, SLAB_HWCACHE_ALIGN, NULL);
        if (!t->sendmsg_cache)
                return -ENOMEM;
@@ -2008,7 +2009,7 @@ static int smb_direct_prepare(struct ksmbd_transport *t)
 {
        struct smb_direct_transport *st = smb_trans_direct_transfort(t);
        struct smb_direct_recvmsg *recvmsg;
-       struct smb_direct_negotiate_req *req;
+       struct smbdirect_negotiate_req *req;
        int ret;
 
        ksmbd_debug(RDMA, "Waiting for SMB_DIRECT negotiate request\n");
@@ -2027,7 +2028,7 @@ static int smb_direct_prepare(struct ksmbd_transport *t)
        if (ret == -ECONNABORTED)
                goto out;
 
-       req = (struct smb_direct_negotiate_req *)recvmsg->packet;
+       req = (struct smbdirect_negotiate_req *)recvmsg->packet;
        st->max_recv_size = min_t(int, st->max_recv_size,
                                  le32_to_cpu(req->preferred_send_size));
        st->max_send_size = min_t(int, st->max_send_size,
index a2291b77488a15381bd0c1775ca49ae226d7d44c..63eab9f8f13dff78087e624eba047d3e30105b8b 100644 (file)
 #define SMBD_MIN_IOSIZE (512 * 1024)
 #define SMBD_MAX_IOSIZE (16 * 1024 * 1024)
 
-/* SMB DIRECT negotiation request packet [MS-SMBD] 2.2.1 */
-struct smb_direct_negotiate_req {
-       __le16 min_version;
-       __le16 max_version;
-       __le16 reserved;
-       __le16 credits_requested;
-       __le32 preferred_send_size;
-       __le32 max_receive_size;
-       __le32 max_fragmented_size;
-} __packed;
-
-/* SMB DIRECT negotiation response packet [MS-SMBD] 2.2.2 */
-struct smb_direct_negotiate_resp {
-       __le16 min_version;
-       __le16 max_version;
-       __le16 negotiated_version;
-       __le16 reserved;
-       __le16 credits_requested;
-       __le16 credits_granted;
-       __le32 status;
-       __le32 max_readwrite_size;
-       __le32 preferred_send_size;
-       __le32 max_receive_size;
-       __le32 max_fragmented_size;
-} __packed;
-
-#define SMB_DIRECT_RESPONSE_REQUESTED 0x0001
-
-/* SMB DIRECT data transfer packet with payload [MS-SMBD] 2.2.3 */
-struct smb_direct_data_transfer {
-       __le16 credits_requested;
-       __le16 credits_granted;
-       __le16 flags;
-       __le16 reserved;
-       __le32 remaining_data_length;
-       __le32 data_offset;
-       __le32 data_length;
-       __le32 padding;
-       __u8 buffer[];
-} __packed;
-
 #ifdef CONFIG_SMB_SERVER_SMBDIRECT
 int ksmbd_rdma_init(void);
 void ksmbd_rdma_stop_listening(void);