[PATCH v2 046/127] smb: smbdirect: introduce smbdirect_connection_wait_for_connected()
Stefan Metzmacher
metze at samba.org
Wed Oct 29 13:20:24 UTC 2025
This will be used by client and server in order to wait for
the connect/negotiation to finish in order to get a usable
connection.
Cc: Steve French <smfrench at gmail.com>
Cc: Tom Talpey <tom at talpey.com>
Cc: Long Li <longli at microsoft.com>
Cc: Namjae Jeon <linkinjeon at kernel.org>
Cc: linux-cifs at vger.kernel.org
Cc: samba-technical at lists.samba.org
Signed-off-by: Stefan Metzmacher <metze at samba.org>
---
.../common/smbdirect/smbdirect_connection.c | 68 +++++++++++++++++++
1 file changed, 68 insertions(+)
diff --git a/fs/smb/common/smbdirect/smbdirect_connection.c b/fs/smb/common/smbdirect/smbdirect_connection.c
index daab8b5eba49..858b071ba1bb 100644
--- a/fs/smb/common/smbdirect/smbdirect_connection.c
+++ b/fs/smb/common/smbdirect/smbdirect_connection.c
@@ -900,6 +900,74 @@ static void smbdirect_connection_disconnect_work(struct work_struct *work)
smbdirect_connection_wake_up_all(sc);
}
+__maybe_unused /* this is temporary while this file is included in orders */
+static int smbdirect_connection_wait_for_connected(struct smbdirect_socket *sc)
+{
+ struct smbdirect_socket_parameters *sp = &sc->parameters;
+ union {
+ struct sockaddr sa;
+ struct sockaddr_storage ss;
+ } src_addr, dst_addr;
+ const struct sockaddr *src = NULL;
+ const struct sockaddr *dst = NULL;
+ char _devname[IB_DEVICE_NAME_MAX] = { 0, };
+ const char *devname = NULL;
+ int ret;
+
+ if (sc->rdma.cm_id) {
+ src_addr.ss = sc->rdma.cm_id->route.addr.src_addr;
+ if (src_addr.sa.sa_family != AF_UNSPEC)
+ src = &src_addr.sa;
+ dst_addr.ss = sc->rdma.cm_id->route.addr.dst_addr;
+ if (dst_addr.sa.sa_family != AF_UNSPEC)
+ dst = &dst_addr.sa;
+
+ if (sc->ib.dev) {
+ memcpy(_devname, sc->ib.dev->name, IB_DEVICE_NAME_MAX);
+ devname = _devname;
+ }
+ }
+
+ smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_INFO,
+ "waiting for connection: device: %.*s local: %pISpsfc remote: %pISpsfc\n",
+ IB_DEVICE_NAME_MAX, devname, src, dst);
+
+ ret = wait_event_interruptible_timeout(sc->status_wait,
+ sc->status == SMBDIRECT_SOCKET_CONNECTED ||
+ sc->first_error,
+ msecs_to_jiffies(sp->negotiate_timeout_msec));
+ if (sc->rdma.cm_id) {
+ /*
+ * Maybe src and dev are updated in the meantime.
+ */
+ src_addr.ss = sc->rdma.cm_id->route.addr.src_addr;
+ if (src_addr.sa.sa_family != AF_UNSPEC)
+ src = &src_addr.sa;
+ dst_addr.ss = sc->rdma.cm_id->route.addr.dst_addr;
+ if (dst_addr.sa.sa_family != AF_UNSPEC)
+ dst = &dst_addr.sa;
+
+ if (sc->ib.dev) {
+ memcpy(_devname, sc->ib.dev->name, IB_DEVICE_NAME_MAX);
+ devname = _devname;
+ }
+ }
+ if (ret == 0)
+ ret = -ETIMEDOUT;
+ if (ret < 0)
+ smbdirect_connection_schedule_disconnect(sc, ret);
+ if (sc->first_error) {
+ ret = sc->first_error;
+ smbdirect_log_rdma_event(sc, SMBDIRECT_LOG_ERR,
+ "connection failed %1pe device: %.*s local: %pISpsfc remote: %pISpsfc\n",
+ SMBDIRECT_DEBUG_ERR_PTR(ret),
+ IB_DEVICE_NAME_MAX, devname, src, dst);
+ return ret;
+ }
+
+ return 0;
+}
+
static void smbdirect_connection_destroy(struct smbdirect_socket *sc)
{
struct smbdirect_recv_io *recv_io;
--
2.43.0
More information about the samba-technical
mailing list