]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
smb: server: make use of smbdirect_socket_cleanup_work()
authorStefan Metzmacher <metze@samba.org>
Tue, 26 Aug 2025 15:20:30 +0000 (17:20 +0200)
committerSteve French <stfrench@microsoft.com>
Thu, 16 Apr 2026 02:58:22 +0000 (21:58 -0500)
Note smbdirect_socket_prepare_create() already calls INIT_WORK()
with smbdirect_socket_cleanup_work.

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 8724c7fb0b1296aa49cd9f0b5dd3829d5bec133d..a191df1bd326c48dbc0bff6fd1eb5bc06ab0cf7b 100644 (file)
@@ -298,66 +298,6 @@ static struct smbdirect_recv_io *get_first_reassembly(struct smbdirect_socket *s
                return NULL;
 }
 
-static void smb_direct_disconnect_rdma_work(struct work_struct *work)
-{
-       struct smbdirect_socket *sc =
-               container_of(work, struct smbdirect_socket, disconnect_work);
-
-       if (sc->first_error == 0)
-               sc->first_error = -ECONNABORTED;
-
-       /*
-        * make sure this and other work is not queued again
-        * but here we don't block and avoid
-        * disable[_delayed]_work_sync()
-        */
-       disable_work(&sc->disconnect_work);
-       disable_work(&sc->connect.work);
-       disable_work(&sc->recv_io.posted.refill_work);
-       disable_delayed_work(&sc->idle.timer_work);
-       disable_work(&sc->idle.immediate_work);
-
-       switch (sc->status) {
-       case SMBDIRECT_SOCKET_NEGOTIATE_NEEDED:
-       case SMBDIRECT_SOCKET_NEGOTIATE_RUNNING:
-       case SMBDIRECT_SOCKET_NEGOTIATE_FAILED:
-       case SMBDIRECT_SOCKET_CONNECTED:
-       case SMBDIRECT_SOCKET_ERROR:
-               sc->status = SMBDIRECT_SOCKET_DISCONNECTING;
-               rdma_disconnect(sc->rdma.cm_id);
-               break;
-
-       case SMBDIRECT_SOCKET_CREATED:
-       case SMBDIRECT_SOCKET_LISTENING:
-       case SMBDIRECT_SOCKET_RESOLVE_ADDR_NEEDED:
-       case SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING:
-       case SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED:
-       case SMBDIRECT_SOCKET_RESOLVE_ROUTE_NEEDED:
-       case SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING:
-       case SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED:
-       case SMBDIRECT_SOCKET_RDMA_CONNECT_NEEDED:
-       case SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING:
-       case SMBDIRECT_SOCKET_RDMA_CONNECT_FAILED:
-               /*
-                * rdma_accept() never reached
-                * RDMA_CM_EVENT_ESTABLISHED
-                */
-               sc->status = SMBDIRECT_SOCKET_DISCONNECTED;
-               break;
-
-       case SMBDIRECT_SOCKET_DISCONNECTING:
-       case SMBDIRECT_SOCKET_DISCONNECTED:
-       case SMBDIRECT_SOCKET_DESTROYED:
-               break;
-       }
-
-       /*
-        * Wake up all waiters in all wait queues
-        * in order to notice the broken connection.
-        */
-       smbdirect_socket_wake_up_all(sc);
-}
-
 static void
 smb_direct_disconnect_rdma_connection(struct smbdirect_socket *sc)
 {
@@ -499,8 +439,6 @@ static struct smb_direct_transport *alloc_transport(struct rdma_cm_id *cm_id)
         */
        sp = &sc->parameters;
 
-       INIT_WORK(&sc->disconnect_work, smb_direct_disconnect_rdma_work);
-
        sc->rdma.cm_id = cm_id;
        cm_id->context = sc;
 
@@ -537,7 +475,7 @@ static void free_transport(struct smb_direct_transport *t)
 
        disable_work_sync(&sc->disconnect_work);
        if (sc->status < SMBDIRECT_SOCKET_DISCONNECTING)
-               smb_direct_disconnect_rdma_work(&sc->disconnect_work);
+               smbdirect_socket_cleanup_work(&sc->disconnect_work);
        if (sc->status < SMBDIRECT_SOCKET_DISCONNECTED)
                wait_event(sc->status_wait, sc->status == SMBDIRECT_SOCKET_DISCONNECTED);
 
@@ -546,7 +484,7 @@ static void free_transport(struct smb_direct_transport *t)
         * in order to notice the broken connection.
         *
         * Most likely this was already called via
-        * smb_direct_disconnect_rdma_work(), but call it again...
+        * smbdirect_socket_cleanup_work(), but call it again...
         */
        smbdirect_socket_wake_up_all(sc);
 
@@ -2036,7 +1974,7 @@ static void smb_direct_shutdown(struct ksmbd_transport *t)
 
        ksmbd_debug(RDMA, "smb-direct shutdown cm_id=%p\n", sc->rdma.cm_id);
 
-       smb_direct_disconnect_rdma_work(&sc->disconnect_work);
+       smbdirect_socket_cleanup_work(&sc->disconnect_work);
 }
 
 static int smb_direct_cm_handler(struct rdma_cm_id *cm_id,
@@ -2078,14 +2016,14 @@ static int smb_direct_cm_handler(struct rdma_cm_id *cm_id,
        case RDMA_CM_EVENT_DEVICE_REMOVAL:
        case RDMA_CM_EVENT_DISCONNECTED: {
                sc->status = SMBDIRECT_SOCKET_DISCONNECTED;
-               smb_direct_disconnect_rdma_work(&sc->disconnect_work);
+               smbdirect_socket_cleanup_work(&sc->disconnect_work);
                if (sc->ib.qp)
                        ib_drain_qp(sc->ib.qp);
                break;
        }
        case RDMA_CM_EVENT_CONNECT_ERROR: {
                sc->status = SMBDIRECT_SOCKET_DISCONNECTED;
-               smb_direct_disconnect_rdma_work(&sc->disconnect_work);
+               smbdirect_socket_cleanup_work(&sc->disconnect_work);
                break;
        }
        default: