]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
smb: server: make use of struct smbdirect_recv_io
authorStefan Metzmacher <metze@samba.org>
Wed, 6 Aug 2025 17:35:59 +0000 (19:35 +0200)
committerSteve French <stfrench@microsoft.com>
Sun, 28 Sep 2025 23:29:51 +0000 (18:29 -0500)
This will allow us to move helper functions into common code soon
as the client already uses smbdirect_recv_io.

Cc: Namjae Jeon <linkinjeon@kernel.org>
Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.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

index 7892dd634c82e578a672925342084a7e4cd27201..c4e786f2e7e7c706a7515dd1858dcbd247402e81 100644 (file)
@@ -165,15 +165,6 @@ struct smb_direct_sendmsg {
        u8                      packet[];
 };
 
-struct smb_direct_recvmsg {
-       struct smb_direct_transport     *transport;
-       struct list_head        list;
-       struct ib_sge           sge;
-       struct ib_cqe           cqe;
-       bool                    first_segment;
-       u8                      packet[];
-};
-
 struct smb_direct_rdma_rw_msg {
        struct smb_direct_transport     *t;
        struct ib_cqe           cqe;
@@ -216,7 +207,7 @@ smb_trans_direct_transfort(struct ksmbd_transport *t)
 }
 
 static inline void
-*smb_direct_recvmsg_payload(struct smb_direct_recvmsg *recvmsg)
+*smbdirect_recv_io_payload(struct smbdirect_recv_io *recvmsg)
 {
        return (void *)recvmsg->packet;
 }
@@ -229,14 +220,14 @@ static inline bool is_receive_credit_post_required(int receive_credits,
 }
 
 static struct
-smb_direct_recvmsg *get_free_recvmsg(struct smb_direct_transport *t)
+smbdirect_recv_io *get_free_recvmsg(struct smb_direct_transport *t)
 {
-       struct smb_direct_recvmsg *recvmsg = NULL;
+       struct smbdirect_recv_io *recvmsg = NULL;
 
        spin_lock(&t->recvmsg_queue_lock);
        if (!list_empty(&t->recvmsg_queue)) {
                recvmsg = list_first_entry(&t->recvmsg_queue,
-                                          struct smb_direct_recvmsg,
+                                          struct smbdirect_recv_io,
                                           list);
                list_del(&recvmsg->list);
        }
@@ -245,7 +236,7 @@ smb_direct_recvmsg *get_free_recvmsg(struct smb_direct_transport *t)
 }
 
 static void put_recvmsg(struct smb_direct_transport *t,
-                       struct smb_direct_recvmsg *recvmsg)
+                       struct smbdirect_recv_io *recvmsg)
 {
        struct smbdirect_socket *sc = &t->socket;
 
@@ -263,7 +254,7 @@ static void put_recvmsg(struct smb_direct_transport *t,
 }
 
 static void enqueue_reassembly(struct smb_direct_transport *t,
-                              struct smb_direct_recvmsg *recvmsg,
+                              struct smbdirect_recv_io *recvmsg,
                               int data_length)
 {
        spin_lock(&t->reassembly_queue_lock);
@@ -280,11 +271,11 @@ static void enqueue_reassembly(struct smb_direct_transport *t,
        spin_unlock(&t->reassembly_queue_lock);
 }
 
-static struct smb_direct_recvmsg *get_first_reassembly(struct smb_direct_transport *t)
+static struct smbdirect_recv_io *get_first_reassembly(struct smb_direct_transport *t)
 {
        if (!list_empty(&t->reassembly_queue))
                return list_first_entry(&t->reassembly_queue,
-                               struct smb_direct_recvmsg, list);
+                               struct smbdirect_recv_io, list);
        else
                return NULL;
 }
@@ -387,7 +378,7 @@ static void smb_direct_free_transport(struct ksmbd_transport *kt)
 static void free_transport(struct smb_direct_transport *t)
 {
        struct smbdirect_socket *sc = &t->socket;
-       struct smb_direct_recvmsg *recvmsg;
+       struct smbdirect_recv_io *recvmsg;
 
        wake_up_interruptible(&t->wait_send_credits);
 
@@ -465,9 +456,9 @@ static void smb_direct_free_sendmsg(struct smb_direct_transport *t,
        mempool_free(msg, t->sendmsg_mempool);
 }
 
-static int smb_direct_check_recvmsg(struct smb_direct_recvmsg *recvmsg)
+static int smb_direct_check_recvmsg(struct smbdirect_recv_io *recvmsg)
 {
-       struct smbdirect_socket *sc = &recvmsg->transport->socket;
+       struct smbdirect_socket *sc = recvmsg->socket;
 
        switch (sc->recv_io.expected) {
        case SMBDIRECT_EXPECT_DATA_TRANSFER: {
@@ -516,15 +507,15 @@ static int smb_direct_check_recvmsg(struct smb_direct_recvmsg *recvmsg)
 
 static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
 {
-       struct smb_direct_recvmsg *recvmsg;
+       struct smbdirect_recv_io *recvmsg;
        struct smb_direct_transport *t;
        struct smbdirect_socket *sc;
        struct smbdirect_socket_parameters *sp;
 
-       recvmsg = container_of(wc->wr_cqe, struct smb_direct_recvmsg, cqe);
-       t = recvmsg->transport;
-       sc = &t->socket;
+       recvmsg = container_of(wc->wr_cqe, struct smbdirect_recv_io, cqe);
+       sc = recvmsg->socket;
        sp = &sc->parameters;
+       t = container_of(sc, struct smb_direct_transport, socket);
 
        if (wc->status != IB_WC_SUCCESS || wc->opcode != IB_WC_RECV) {
                put_recvmsg(t, recvmsg);
@@ -645,7 +636,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
 }
 
 static int smb_direct_post_recv(struct smb_direct_transport *t,
-                               struct smb_direct_recvmsg *recvmsg)
+                               struct smbdirect_recv_io *recvmsg)
 {
        struct smbdirect_socket *sc = &t->socket;
        struct smbdirect_socket_parameters *sp = &sc->parameters;
@@ -684,7 +675,7 @@ static int smb_direct_post_recv(struct smb_direct_transport *t,
 static int smb_direct_read(struct ksmbd_transport *t, char *buf,
                           unsigned int size, int unused)
 {
-       struct smb_direct_recvmsg *recvmsg;
+       struct smbdirect_recv_io *recvmsg;
        struct smbdirect_data_transfer *data_transfer;
        int to_copy, to_read, data_read, offset;
        u32 data_length, remaining_data_length, data_offset;
@@ -721,7 +712,7 @@ again:
                offset = st->first_entry_offset;
                while (data_read < size) {
                        recvmsg = get_first_reassembly(st);
-                       data_transfer = smb_direct_recvmsg_payload(recvmsg);
+                       data_transfer = smbdirect_recv_io_payload(recvmsg);
                        data_length = le32_to_cpu(data_transfer->data_length);
                        remaining_data_length =
                                le32_to_cpu(data_transfer->remaining_data_length);
@@ -813,7 +804,7 @@ static void smb_direct_post_recv_credits(struct work_struct *work)
 {
        struct smb_direct_transport *t = container_of(work,
                struct smb_direct_transport, post_recv_credits_work);
-       struct smb_direct_recvmsg *recvmsg;
+       struct smbdirect_recv_io *recvmsg;
        int receive_credits, credits = 0;
        int ret;
 
@@ -1746,7 +1737,7 @@ static int smb_direct_prepare_negotiation(struct smb_direct_transport *t)
 {
        struct smbdirect_socket *sc = &t->socket;
        int ret;
-       struct smb_direct_recvmsg *recvmsg;
+       struct smbdirect_recv_io *recvmsg;
 
        sc->recv_io.expected = SMBDIRECT_EXPECT_NEGOTIATE_REQ;
 
@@ -1880,7 +1871,7 @@ static int smb_direct_init_params(struct smb_direct_transport *t,
 
 static void smb_direct_destroy_pools(struct smb_direct_transport *t)
 {
-       struct smb_direct_recvmsg *recvmsg;
+       struct smbdirect_recv_io *recvmsg;
 
        while ((recvmsg = get_free_recvmsg(t)))
                mempool_free(recvmsg, t->recvmsg_mempool);
@@ -1904,7 +1895,7 @@ static int smb_direct_create_pools(struct smb_direct_transport *t)
        struct smbdirect_socket_parameters *sp = &sc->parameters;
        char name[80];
        int i;
-       struct smb_direct_recvmsg *recvmsg;
+       struct smbdirect_recv_io *recvmsg;
 
        snprintf(name, sizeof(name), "smb_direct_rqst_pool_%p", t);
        t->sendmsg_cache = kmem_cache_create(name,
@@ -1920,9 +1911,9 @@ static int smb_direct_create_pools(struct smb_direct_transport *t)
        if (!t->sendmsg_mempool)
                goto err;
 
-       snprintf(name, sizeof(name), "smb_direct_resp_%p", t);
+       snprintf(name, sizeof(name), "smbdirect_recv_io_pool_%p", t);
        t->recvmsg_cache = kmem_cache_create(name,
-                                            sizeof(struct smb_direct_recvmsg) +
+                                            sizeof(struct smbdirect_recv_io) +
                                             sp->max_recv_size,
                                             0, SLAB_HWCACHE_ALIGN, NULL);
        if (!t->recvmsg_cache)
@@ -1940,7 +1931,7 @@ static int smb_direct_create_pools(struct smb_direct_transport *t)
                recvmsg = mempool_alloc(t->recvmsg_mempool, KSMBD_DEFAULT_GFP);
                if (!recvmsg)
                        goto err;
-               recvmsg->transport = t;
+               recvmsg->socket = sc;
                recvmsg->sge.length = 0;
                list_add(&recvmsg->list, &t->recvmsg_queue);
        }
@@ -2045,7 +2036,7 @@ static int smb_direct_prepare(struct ksmbd_transport *t)
        struct smb_direct_transport *st = smb_trans_direct_transfort(t);
        struct smbdirect_socket *sc = &st->socket;
        struct smbdirect_socket_parameters *sp = &sc->parameters;
-       struct smb_direct_recvmsg *recvmsg;
+       struct smbdirect_recv_io *recvmsg;
        struct smbdirect_negotiate_req *req;
        int ret;