]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
smb: client: let smbd_disconnect_rdma_connection() set SMBDIRECT_SOCKET_ERROR...
authorStefan Metzmacher <metze@samba.org>
Thu, 28 Aug 2025 08:39:56 +0000 (10:39 +0200)
committerSteve French <stfrench@microsoft.com>
Sun, 28 Sep 2025 23:29:51 +0000 (18:29 -0500)
smbd_disconnect_rdma_connection() should turn the status into
an error state instead of leaving it as is until
smbd_disconnect_rdma_work() is running.

Cc: Steve French <smfrench@gmail.com>
Cc: Tom Talpey <tom@talpey.com>
Cc: Long Li <longli@microsoft.com>
Acked-by: 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>
Signed-off-by: Steve French <stfrench@microsoft.com>
fs/smb/client/smbdirect.c

index dba3f461b5cf9b6418041aaf5bfa03fc62058770..45f137487ba1fc8e155136e627c764a656be30ab 100644 (file)
@@ -217,6 +217,46 @@ static void smbd_disconnect_rdma_work(struct work_struct *work)
 
 static void smbd_disconnect_rdma_connection(struct smbdirect_socket *sc)
 {
+       switch (sc->status) {
+       case SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED:
+       case SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED:
+       case SMBDIRECT_SOCKET_RDMA_CONNECT_FAILED:
+       case SMBDIRECT_SOCKET_NEGOTIATE_FAILED:
+       case SMBDIRECT_SOCKET_ERROR:
+       case SMBDIRECT_SOCKET_DISCONNECTING:
+       case SMBDIRECT_SOCKET_DISCONNECTED:
+       case SMBDIRECT_SOCKET_DESTROYED:
+               /*
+                * Keep the current error status
+                */
+               break;
+
+       case SMBDIRECT_SOCKET_RESOLVE_ADDR_NEEDED:
+       case SMBDIRECT_SOCKET_RESOLVE_ADDR_RUNNING:
+               sc->status = SMBDIRECT_SOCKET_RESOLVE_ADDR_FAILED;
+               break;
+
+       case SMBDIRECT_SOCKET_RESOLVE_ROUTE_NEEDED:
+       case SMBDIRECT_SOCKET_RESOLVE_ROUTE_RUNNING:
+               sc->status = SMBDIRECT_SOCKET_RESOLVE_ROUTE_FAILED;
+               break;
+
+       case SMBDIRECT_SOCKET_RDMA_CONNECT_NEEDED:
+       case SMBDIRECT_SOCKET_RDMA_CONNECT_RUNNING:
+               sc->status = SMBDIRECT_SOCKET_RDMA_CONNECT_FAILED;
+               break;
+
+       case SMBDIRECT_SOCKET_NEGOTIATE_NEEDED:
+       case SMBDIRECT_SOCKET_NEGOTIATE_RUNNING:
+               sc->status = SMBDIRECT_SOCKET_NEGOTIATE_FAILED;
+               break;
+
+       case SMBDIRECT_SOCKET_CREATED:
+       case SMBDIRECT_SOCKET_CONNECTED:
+               sc->status = SMBDIRECT_SOCKET_ERROR;
+               break;
+       }
+
        queue_work(sc->workqueue, &sc->disconnect_work);
 }