From: Stefan Metzmacher Date: Tue, 26 Aug 2025 14:55:52 +0000 (+0200) Subject: smb: client: make use of smbdirect_socket_cleanup_work() X-Git-Tag: v7.1-rc1~128^2~80 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=872b23ab6d9495e5504ac0a43e9ec977e750052a;p=thirdparty%2Fkernel%2Flinux.git smb: client: make use of smbdirect_socket_cleanup_work() Note smbdirect_socket_prepare_create() already calls INIT_WORK() with smbdirect_socket_cleanup_work. Cc: Steve French Cc: Tom Talpey Cc: Long Li Cc: Namjae Jeon Cc: linux-cifs@vger.kernel.org Cc: samba-technical@lists.samba.org Signed-off-by: Stefan Metzmacher Acked-by: Namjae Jeon Signed-off-by: Steve French --- diff --git a/fs/smb/client/smbdirect.c b/fs/smb/client/smbdirect.c index 69ff1128e8f0c..5204f0ff95d89 100644 --- a/fs/smb/client/smbdirect.c +++ b/fs/smb/client/smbdirect.c @@ -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);