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

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: 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/client/smbdirect.c

index 69ff1128e8f0ce4b9b4516ab2e994a2f9ef2fe1d..5204f0ff95d895826f81ad94a9bc914a20e422af 100644 (file)
@@ -235,66 +235,6 @@ do {                                                                       \
 #define log_rdma_mr(level, fmt, args...) \
                log_rdma(level, LOG_RDMA_MR, fmt, ##args)
 
-static void smbd_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->recv_io.posted.refill_work);
-       disable_work(&sc->mr_io.recovery_work);
-       disable_work(&sc->idle.immediate_work);
-       disable_delayed_work(&sc->idle.timer_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_connect() 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 smbd_disconnect_rdma_connection(struct smbdirect_socket *sc)
 {
        if (sc->first_error == 0)
@@ -394,13 +334,13 @@ static int smbd_conn_upcall(
        case RDMA_CM_EVENT_ADDR_ERROR:
                log_rdma_event(ERR, "connecting failed event=%s\n", event_name);
                sc->status = SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED;
-               smbd_disconnect_rdma_work(&sc->disconnect_work);
+               smbdirect_socket_cleanup_work(&sc->disconnect_work);
                break;
 
        case RDMA_CM_EVENT_ROUTE_ERROR:
                log_rdma_event(ERR, "connecting failed event=%s\n", event_name);
                sc->status = SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED;
-               smbd_disconnect_rdma_work(&sc->disconnect_work);
+               smbdirect_socket_cleanup_work(&sc->disconnect_work);
                break;
 
        case RDMA_CM_EVENT_ESTABLISHED:
@@ -495,7 +435,7 @@ static int smbd_conn_upcall(
        case RDMA_CM_EVENT_REJECTED:
                log_rdma_event(ERR, "connecting failed event=%s\n", event_name);
                sc->status = SMBDIRECT_SOCKET_RDMA_CONNECT_FAILED;
-               smbd_disconnect_rdma_work(&sc->disconnect_work);
+               smbdirect_socket_cleanup_work(&sc->disconnect_work);
                break;
 
        case RDMA_CM_EVENT_DEVICE_REMOVAL:
@@ -506,7 +446,7 @@ static int smbd_conn_upcall(
                }
 
                sc->status = SMBDIRECT_SOCKET_DISCONNECTED;
-               smbd_disconnect_rdma_work(&sc->disconnect_work);
+               smbdirect_socket_cleanup_work(&sc->disconnect_work);
                break;
 
        default:
@@ -1943,7 +1883,7 @@ void smbd_destroy(struct TCP_Server_Info *server)
 
        log_rdma_event(INFO, "destroying rdma session\n");
        if (sc->status < SMBDIRECT_SOCKET_DISCONNECTING)
-               smbd_disconnect_rdma_work(&sc->disconnect_work);
+               smbdirect_socket_cleanup_work(&sc->disconnect_work);
        if (sc->status < SMBDIRECT_SOCKET_DISCONNECTED) {
                log_rdma_event(INFO, "wait for transport being disconnected\n");
                wait_event(sc->status_wait, sc->status == SMBDIRECT_SOCKET_DISCONNECTED);
@@ -1955,7 +1895,7 @@ void smbd_destroy(struct TCP_Server_Info *server)
         * in order to notice the broken connection.
         *
         * Most likely this was already called via
-        * smbd_disconnect_rdma_work(), but call it again...
+        * smbdirect_socket_cleanup_work(), but call it again...
         */
        smbdirect_socket_wake_up_all(sc);
 
@@ -2177,8 +2117,6 @@ static struct smbd_connection *_smbd_get_connection(
         */
        sp = &sc->parameters;
 
-       INIT_WORK(&sc->disconnect_work, smbd_disconnect_rdma_work);
-
        rc = smbd_ia_open(sc, dstaddr, port);
        if (rc) {
                log_rdma_event(INFO, "smbd_ia_open rc=%d\n", rc);