]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
smb: smbdirect: let smbdirect_socket_set_initial_parameters() call rdma_restrict_node...
authorStefan Metzmacher <metze@samba.org>
Thu, 18 Dec 2025 19:54:25 +0000 (20:54 +0100)
committerSteve French <stfrench@microsoft.com>
Thu, 16 Apr 2026 02:58:20 +0000 (21:58 -0500)
We allow the caller of smbdirect_socket_set_initial_parameters() to pass
SMBDIRECT_FLAG_PORT_RANGE_ONLY_{IB,IW} in order to restrict
the rdma devices for the listener or connection to either
iWarp (RDMA_NODE_RNIC) or InfiniBand/RoCEv1/RoCEv2 (RDMA_NODE_IB_CA).

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/common/smbdirect/smbdirect.h
fs/smb/common/smbdirect/smbdirect_socket.c

index 821a34c4cc47f710e997572b3f623e2144c3bc40..e70a21eb57f01e258b44ec234b0afb3f7d64ba08 100644 (file)
@@ -25,6 +25,9 @@ struct smbdirect_buffer_descriptor_v1 {
  * Some values are important for the upper layer.
  */
 struct smbdirect_socket_parameters {
+       __u64 flags;
+#define SMBDIRECT_FLAG_PORT_RANGE_ONLY_IB ((__u64)0x1)
+#define SMBDIRECT_FLAG_PORT_RANGE_ONLY_IW ((__u64)0x2)
        __u32 resolve_addr_timeout_msec;
        __u32 resolve_route_timeout_msec;
        __u32 rdma_connect_timeout_msec;
@@ -43,4 +46,8 @@ struct smbdirect_socket_parameters {
        __u32 keepalive_timeout_msec;
 } __packed;
 
+#define SMBDIRECT_FLAG_PORT_RANGE_MASK ( \
+               SMBDIRECT_FLAG_PORT_RANGE_ONLY_IB | \
+               SMBDIRECT_FLAG_PORT_RANGE_ONLY_IW)
+
 #endif /* __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_H__ */
index c964c5f8c7248b745f42d47f7df62d227143cc52..8eb021cd7ceec0cb6c52401b20d98969659a8499 100644 (file)
@@ -114,6 +114,17 @@ static int smbdirect_socket_set_initial_parameters(struct smbdirect_socket *sc,
        if (sc->status != SMBDIRECT_SOCKET_CREATED)
                return -EINVAL;
 
+       if (sp->flags & ~SMBDIRECT_FLAG_PORT_RANGE_MASK)
+               return -EINVAL;
+
+       if (sp->flags & SMBDIRECT_FLAG_PORT_RANGE_ONLY_IB &&
+           sp->flags & SMBDIRECT_FLAG_PORT_RANGE_ONLY_IW)
+               return -EINVAL;
+       else if (sp->flags & SMBDIRECT_FLAG_PORT_RANGE_ONLY_IB)
+               rdma_restrict_node_type(sc->rdma.cm_id, RDMA_NODE_IB_CA);
+       else if (sp->flags & SMBDIRECT_FLAG_PORT_RANGE_ONLY_IW)
+               rdma_restrict_node_type(sc->rdma.cm_id, RDMA_NODE_RNIC);
+
        /*
         * Make a copy of the callers parameters
         * from here we only work on the copy