]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
smb: smbdirect: introduce SMBDIRECT_CHECK_STATUS_{WARN,DISCONNECT}()
authorStefan Metzmacher <metze@samba.org>
Tue, 25 Nov 2025 08:55:55 +0000 (09:55 +0100)
committerSteve French <stfrench@microsoft.com>
Mon, 1 Dec 2025 03:11:45 +0000 (21:11 -0600)
These will be used in various places in order to assert
the current status mostly during the connect and negotiation
phase. It will replace the WARN_ON_ONCE(sc->status != ...)
calls, which are very useless in order to identify the
problem that happened.

As a start client and server will need to define their own
__SMBDIRECT_SOCKET_DISCONNECT(__sc) macro in order to use
SMBDIRECT_CHECK_STATUS_DISCONNECT().

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: Paulo Alcantara <pc@manguebit.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/common/smbdirect/smbdirect_socket.h

index 611986827a5e233920cd33e63a9e7b702265bf76..384b19177e1c3774c8f7df3e7d8c5e0df4a6dbac 100644 (file)
@@ -394,6 +394,44 @@ static __always_inline void smbdirect_socket_init(struct smbdirect_socket *sc)
        init_waitqueue_head(&sc->mr_io.cleanup.wait_queue);
 }
 
+#define __SMBDIRECT_CHECK_STATUS_FAILED(__sc, __expected_status, __error_cmd, __unexpected_cmd) ({ \
+       bool __failed = false; \
+       if (unlikely((__sc)->first_error)) { \
+               __failed = true; \
+               __error_cmd \
+       } else if (unlikely((__sc)->status != (__expected_status))) { \
+               __failed = true; \
+               __unexpected_cmd \
+       } \
+       __failed; \
+})
+
+#define __SMBDIRECT_CHECK_STATUS_WARN(__sc, __expected_status, __unexpected_cmd) \
+       __SMBDIRECT_CHECK_STATUS_FAILED(__sc, __expected_status, \
+       , \
+       { \
+               const struct sockaddr_storage *__src = NULL; \
+               const struct sockaddr_storage *__dst = NULL; \
+               if ((__sc)->rdma.cm_id) { \
+                       __src = &(__sc)->rdma.cm_id->route.addr.src_addr; \
+                       __dst = &(__sc)->rdma.cm_id->route.addr.dst_addr; \
+               } \
+               WARN_ONCE(1, \
+                       "expected[%s] != %s first_error=%1pe local=%pISpsfc remote=%pISpsfc\n", \
+                       smbdirect_socket_status_string(__expected_status), \
+                       smbdirect_socket_status_string((__sc)->status), \
+                       SMBDIRECT_DEBUG_ERR_PTR((__sc)->first_error), \
+                       __src, __dst); \
+               __unexpected_cmd \
+       })
+
+#define SMBDIRECT_CHECK_STATUS_WARN(__sc, __expected_status) \
+       __SMBDIRECT_CHECK_STATUS_WARN(__sc, __expected_status, /* nothing */)
+
+#define SMBDIRECT_CHECK_STATUS_DISCONNECT(__sc, __expected_status) \
+       __SMBDIRECT_CHECK_STATUS_WARN(__sc, __expected_status, \
+               __SMBDIRECT_SOCKET_DISCONNECT(__sc);)
+
 struct smbdirect_send_io {
        struct smbdirect_socket *socket;
        struct ib_cqe cqe;