]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
smb: client: pass struct smbdirect_socket to smbd_disconnect_rdma_connection()
authorStefan Metzmacher <metze@samba.org>
Fri, 22 Aug 2025 08:12:35 +0000 (10:12 +0200)
committerSteve French <stfrench@microsoft.com>
Sun, 28 Sep 2025 23:29:50 +0000 (18:29 -0500)
This will make it easier to move function to the common code
in future.

Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.com>
Cc: Long Li <longli@microsoft.com>
Cc: linux-cifs@vger.kernel.org
Cc: samba-technical@lists.samba.org
Acked-by: Namjae Jeon <linkinjeon@kernel.org>
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/smbdirect.c

index de0ac75b975b385e47d5139d9667a3085baad578..9c2fb138ce1f41e222b7caa5857ff1a23715c9c5 100644 (file)
@@ -215,10 +215,8 @@ static void smbd_disconnect_rdma_work(struct work_struct *work)
        }
 }
 
-static void smbd_disconnect_rdma_connection(struct smbd_connection *info)
+static void smbd_disconnect_rdma_connection(struct smbdirect_socket *sc)
 {
-       struct smbdirect_socket *sc = &info->socket;
-
        queue_work(sc->workqueue, &sc->disconnect_work);
 }
 
@@ -390,6 +388,7 @@ static void
 smbd_qp_async_error_upcall(struct ib_event *event, void *context)
 {
        struct smbd_connection *info = context;
+       struct smbdirect_socket *sc = &info->socket;
 
        log_rdma_event(ERR, "%s on device %s info %p\n",
                ib_event_msg(event->event), event->device->name, info);
@@ -397,7 +396,7 @@ smbd_qp_async_error_upcall(struct ib_event *event, void *context)
        switch (event->event) {
        case IB_EVENT_CQ_ERR:
        case IB_EVENT_QP_FATAL:
-               smbd_disconnect_rdma_connection(info);
+               smbd_disconnect_rdma_connection(sc);
                break;
 
        default:
@@ -422,8 +421,6 @@ static void send_done(struct ib_cq *cq, struct ib_wc *wc)
        struct smbdirect_send_io *request =
                container_of(wc->wr_cqe, struct smbdirect_send_io, cqe);
        struct smbdirect_socket *sc = request->socket;
-       struct smbd_connection *info =
-               container_of(sc, struct smbd_connection, socket);
 
        log_rdma_send(INFO, "smbdirect_send_io 0x%p completed wc->status=%s\n",
                request, ib_wc_status_msg(wc->status));
@@ -439,7 +436,7 @@ static void send_done(struct ib_cq *cq, struct ib_wc *wc)
                        log_rdma_send(ERR, "wc->status=%s wc->opcode=%d\n",
                                ib_wc_status_msg(wc->status), wc->opcode);
                mempool_free(request, sc->send_io.mem.pool);
-               smbd_disconnect_rdma_connection(info);
+               smbd_disconnect_rdma_connection(sc);
                return;
        }
 
@@ -581,8 +578,6 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
                container_of(wc->wr_cqe, struct smbdirect_recv_io, cqe);
        struct smbdirect_socket *sc = response->socket;
        struct smbdirect_socket_parameters *sp = &sc->parameters;
-       struct smbd_connection *info =
-               container_of(sc, struct smbd_connection, socket);
        u16 old_recv_credit_target;
        u32 data_offset = 0;
        u32 data_length = 0;
@@ -724,7 +719,7 @@ static void recv_done(struct ib_cq *cq, struct ib_wc *wc)
        WARN_ON_ONCE(sc->recv_io.expected != SMBDIRECT_EXPECT_DATA_TRANSFER);
 error:
        put_receive_buffer(sc, response);
-       smbd_disconnect_rdma_connection(info);
+       smbd_disconnect_rdma_connection(sc);
 }
 
 static struct rdma_cm_id *smbd_create_id(
@@ -949,7 +944,7 @@ static int smbd_post_send_negotiate_req(struct smbd_connection *info)
        ib_dma_unmap_single(sc->ib.dev, request->sge[0].addr,
                request->sge[0].length, DMA_TO_DEVICE);
 
-       smbd_disconnect_rdma_connection(info);
+       smbd_disconnect_rdma_connection(sc);
 
 dma_mapping_failed:
        mempool_free(request, sc->send_io.mem.pool);
@@ -1041,7 +1036,7 @@ static int smbd_post_send(struct smbd_connection *info,
        rc = ib_post_send(sc->ib.qp, &send_wr, NULL);
        if (rc) {
                log_rdma_send(ERR, "ib_post_send failed rc=%d\n", rc);
-               smbd_disconnect_rdma_connection(info);
+               smbd_disconnect_rdma_connection(sc);
                rc = -EAGAIN;
        }
 
@@ -1274,7 +1269,7 @@ static int smbd_post_recv(
                ib_dma_unmap_single(sc->ib.dev, response->sge.addr,
                                    response->sge.length, DMA_FROM_DEVICE);
                response->sge.length = 0;
-               smbd_disconnect_rdma_connection(info);
+               smbd_disconnect_rdma_connection(sc);
                log_rdma_recv(ERR, "ib_post_recv failed rc=%d\n", rc);
        }
 
@@ -1481,14 +1476,12 @@ static void idle_connection_timer(struct work_struct *work)
        struct smbdirect_socket *sc =
                container_of(work, struct smbdirect_socket, idle.timer_work.work);
        struct smbdirect_socket_parameters *sp = &sc->parameters;
-       struct smbd_connection *info =
-               container_of(sc, struct smbd_connection, socket);
 
        if (sc->idle.keepalive != SMBDIRECT_KEEPALIVE_NONE) {
                log_keep_alive(ERR,
                        "error status sc->idle.keepalive=%d\n",
                        sc->idle.keepalive);
-               smbd_disconnect_rdma_connection(info);
+               smbd_disconnect_rdma_connection(sc);
                return;
        }
 
@@ -2220,12 +2213,10 @@ static void register_mr_done(struct ib_cq *cq, struct ib_wc *wc)
        struct smbdirect_mr_io *mr =
                container_of(wc->wr_cqe, struct smbdirect_mr_io, cqe);
        struct smbdirect_socket *sc = mr->socket;
-       struct smbd_connection *info =
-               container_of(sc, struct smbd_connection, socket);
 
        if (wc->status) {
                log_rdma_mr(ERR, "status=%d\n", wc->status);
-               smbd_disconnect_rdma_connection(info);
+               smbd_disconnect_rdma_connection(sc);
        }
 }
 
@@ -2243,8 +2234,6 @@ static void smbd_mr_recovery_work(struct work_struct *work)
        struct smbdirect_socket *sc =
                container_of(work, struct smbdirect_socket, mr_io.recovery_work);
        struct smbdirect_socket_parameters *sp = &sc->parameters;
-       struct smbd_connection *info =
-               container_of(sc, struct smbd_connection, socket);
        struct smbdirect_mr_io *smbdirect_mr;
        int rc;
 
@@ -2257,7 +2246,7 @@ static void smbd_mr_recovery_work(struct work_struct *work)
                                log_rdma_mr(ERR,
                                        "ib_dereg_mr failed rc=%x\n",
                                        rc);
-                               smbd_disconnect_rdma_connection(info);
+                               smbd_disconnect_rdma_connection(sc);
                                continue;
                        }
 
@@ -2268,7 +2257,7 @@ static void smbd_mr_recovery_work(struct work_struct *work)
                                log_rdma_mr(ERR, "ib_alloc_mr failed mr_type=%x max_frmr_depth=%x\n",
                                            sc->mr_io.type,
                                            sp->max_frmr_depth);
-                               smbd_disconnect_rdma_connection(info);
+                               smbd_disconnect_rdma_connection(sc);
                                continue;
                        }
                } else
@@ -2524,7 +2513,7 @@ dma_map_error:
        if (atomic_dec_and_test(&sc->mr_io.used.count))
                wake_up(&sc->mr_io.cleanup.wait_queue);
 
-       smbd_disconnect_rdma_connection(info);
+       smbd_disconnect_rdma_connection(sc);
 
        return NULL;
 }
@@ -2554,8 +2543,6 @@ int smbd_deregister_mr(struct smbdirect_mr_io *smbdirect_mr)
 {
        struct ib_send_wr *wr;
        struct smbdirect_socket *sc = smbdirect_mr->socket;
-       struct smbd_connection *info =
-               container_of(sc, struct smbd_connection, socket);
        int rc = 0;
 
        if (smbdirect_mr->need_invalidate) {
@@ -2572,7 +2559,7 @@ int smbd_deregister_mr(struct smbdirect_mr_io *smbdirect_mr)
                rc = ib_post_send(sc->ib.qp, wr, NULL);
                if (rc) {
                        log_rdma_mr(ERR, "ib_post_send failed rc=%x\n", rc);
-                       smbd_disconnect_rdma_connection(info);
+                       smbd_disconnect_rdma_connection(sc);
                        goto done;
                }
                wait_for_completion(&smbdirect_mr->invalidate_done);