]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
smb: smbdirect: introduce and use include/linux/smbdirect.h
authorStefan Metzmacher <metze@samba.org>
Wed, 29 Apr 2026 13:43:36 +0000 (15:43 +0200)
committerSteve French <stfrench@microsoft.com>
Fri, 1 May 2026 21:24:25 +0000 (16:24 -0500)
This makes it easier to rebuild cifs.ko and ksmbd.ko against
a running kernel.

Suggested-by: Christoph Hellwig <hch@infradead.org>
Link: https://lore.kernel.org/linux-cifs/aehrPuY60VMcYGU8@infradead.org/
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: Christoph Hellwig <hch@infradead.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>
MAINTAINERS
fs/smb/client/smbdirect.c
fs/smb/client/smbdirect.h
fs/smb/server/transport_rdma.c
fs/smb/server/transport_rdma.h
fs/smb/smbdirect/internal.h
fs/smb/smbdirect/public.h [deleted file]
fs/smb/smbdirect/smbdirect.h [deleted file]
include/linux/smbdirect.h [new file with mode: 0644]

index 2c67ee25ffe6acca36a11bfb79d6c9533fe0a9ff..060dca38dbf7423436bb8b8a8a79e7860509b9fd 100644 (file)
@@ -24650,6 +24650,7 @@ S:      Maintained
 F:     fs/smb/client/smbdirect.*
 F:     fs/smb/smbdirect/
 F:     fs/smb/server/transport_rdma.*
+F:     include/linux/smbdirect.h
 
 SMC91x ETHERNET DRIVER
 M:     Nicolas Pitre <nico@fluxnic.net>
index b9826185de18ba893f95120c938aacdf70b6aaee..563ef488a22585f582b67a0aa933a019877d8a34 100644 (file)
@@ -9,7 +9,6 @@
 #include "cifs_debug.h"
 #include "cifsproto.h"
 #include "smb2proto.h"
-#include "../smbdirect/public.h"
 
 /* Port numbers for SMBD transport */
 #define SMB_PORT       445
index 287ac849213d400f761141573ee6e08799aa5979..be205ec02077e6c78cdc977f1d891cc620012f15 100644 (file)
@@ -12,7 +12,7 @@
 
 #include "cifsglob.h"
 
-#include "../smbdirect/smbdirect.h"
+#include <linux/smbdirect.h>
 
 extern int rdma_readwrite_threshold;
 extern int smbd_max_frmr_depth;
index 346c051e31f502ec97db7cf244cce2e7432d81bc..b6d63ff8a8a3d5f250a1278e49e324ee43c21894 100644 (file)
@@ -18,7 +18,6 @@
 #include "smb_common.h"
 #include "../common/smb2status.h"
 #include "transport_rdma.h"
-#include "../smbdirect/public.h"
 
 
 #define SMB_DIRECT_PORT_IWARP          5445
index bde3d88aecc7196c3d4575f857372989fc265a97..8b78917a179580b354a3911e1b965721ebf10c72 100644 (file)
@@ -25,6 +25,6 @@ static inline void init_smbd_max_io_size(unsigned int sz) { }
 static inline unsigned int get_smbd_max_read_write_size(struct ksmbd_transport *kt) { return 0; }
 #endif
 
-#include "../smbdirect/smbdirect.h"
+#include <linux/smbdirect.h>
 
 #endif /* __KSMBD_TRANSPORT_RDMA_H__ */
index 82529b41708b3365610065d7db523af74c1e5817..e9959e6dc13ae8b56c175134fb9f3a5c6bdb15c7 100644 (file)
@@ -9,9 +9,8 @@
 #define DEFAULT_SYMBOL_NAMESPACE "SMBDIRECT"
 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
-#include "smbdirect.h"
+#include <linux/smbdirect.h>
 #include "pdu.h"
-#include "public.h"
 
 #include <linux/mutex.h>
 
diff --git a/fs/smb/smbdirect/public.h b/fs/smb/smbdirect/public.h
deleted file mode 100644 (file)
index d4fb36e..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-/*
- *   Copyright (C) 2025, Stefan Metzmacher
- */
-
-#ifndef __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_PUBLIC_H__
-#define __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_PUBLIC_H__
-
-struct smbdirect_buffer_descriptor_v1;
-struct smbdirect_socket_parameters;
-
-struct smbdirect_socket;
-struct smbdirect_send_batch;
-struct smbdirect_mr_io;
-
-#include <rdma/rw.h>
-
-u8 smbdirect_netdev_rdma_capable_node_type(struct net_device *netdev);
-
-bool smbdirect_frwr_is_supported(const struct ib_device_attr *attrs);
-
-int smbdirect_socket_create_kern(struct net *net, struct smbdirect_socket **_sc);
-
-int smbdirect_socket_create_accepting(struct rdma_cm_id *id, struct smbdirect_socket **_sc);
-
-int smbdirect_socket_set_initial_parameters(struct smbdirect_socket *sc,
-                                           const struct smbdirect_socket_parameters *sp);
-
-const struct smbdirect_socket_parameters *
-smbdirect_socket_get_current_parameters(struct smbdirect_socket *sc);
-
-int smbdirect_socket_set_kernel_settings(struct smbdirect_socket *sc,
-                                        enum ib_poll_context poll_ctx,
-                                        gfp_t gfp_mask);
-
-#define SMBDIRECT_LOG_ERR              0x0
-#define SMBDIRECT_LOG_INFO             0x1
-
-#define SMBDIRECT_LOG_OUTGOING                 0x1
-#define SMBDIRECT_LOG_INCOMING                 0x2
-#define SMBDIRECT_LOG_READ                     0x4
-#define SMBDIRECT_LOG_WRITE                    0x8
-#define SMBDIRECT_LOG_RDMA_SEND                        0x10
-#define SMBDIRECT_LOG_RDMA_RECV                        0x20
-#define SMBDIRECT_LOG_KEEP_ALIVE               0x40
-#define SMBDIRECT_LOG_RDMA_EVENT               0x80
-#define SMBDIRECT_LOG_RDMA_MR                  0x100
-#define SMBDIRECT_LOG_RDMA_RW                  0x200
-#define SMBDIRECT_LOG_NEGOTIATE                        0x400
-void smbdirect_socket_set_logging(struct smbdirect_socket *sc,
-                                 void *private_ptr,
-                                 bool (*needed)(struct smbdirect_socket *sc,
-                                                void *private_ptr,
-                                                unsigned int lvl,
-                                                unsigned int cls),
-                                 void (*vaprintf)(struct smbdirect_socket *sc,
-                                                  const char *func,
-                                                  unsigned int line,
-                                                  void *private_ptr,
-                                                  unsigned int lvl,
-                                                  unsigned int cls,
-                                                  struct va_format *vaf));
-
-bool smbdirect_connection_is_connected(struct smbdirect_socket *sc);
-
-int smbdirect_connection_wait_for_connected(struct smbdirect_socket *sc);
-
-int smbdirect_socket_bind(struct smbdirect_socket *sc, struct sockaddr *addr);
-
-void smbdirect_socket_shutdown(struct smbdirect_socket *sc);
-
-void smbdirect_socket_release(struct smbdirect_socket *sc);
-
-int smbdirect_connection_send_batch_flush(struct smbdirect_socket *sc,
-                                         struct smbdirect_send_batch *batch,
-                                         bool is_last);
-
-/*
- * This is only temporary and only needed
- * as long as the client still requires
- * to use smbdirect_connection_send_single_iter()
- */
-struct smbdirect_send_batch_storage {
-       union {
-               struct list_head __msg_list;
-               __aligned_u64 __space[5];
-       };
-};
-
-struct smbdirect_send_batch *
-smbdirect_init_send_batch_storage(struct smbdirect_send_batch_storage *storage,
-                                 bool need_invalidate_rkey,
-                                 unsigned int remote_key);
-
-int smbdirect_connection_send_single_iter(struct smbdirect_socket *sc,
-                                         struct smbdirect_send_batch *batch,
-                                         struct iov_iter *iter,
-                                         unsigned int flags,
-                                         u32 remaining_data_length);
-
-int smbdirect_connection_send_wait_zero_pending(struct smbdirect_socket *sc);
-
-int smbdirect_connection_send_iter(struct smbdirect_socket *sc,
-                                  struct iov_iter *iter,
-                                  unsigned int flags,
-                                  bool need_invalidate,
-                                  unsigned int remote_key);
-
-int smbdirect_connection_recvmsg(struct smbdirect_socket *sc,
-                                struct msghdr *msg,
-                                unsigned int flags);
-
-int smbdirect_connect(struct smbdirect_socket *sc,
-                     const struct sockaddr *dst);
-
-int smbdirect_connect_sync(struct smbdirect_socket *sc,
-                          const struct sockaddr *dst);
-
-int smbdirect_socket_listen(struct smbdirect_socket *sc, int backlog);
-
-struct smbdirect_socket *smbdirect_socket_accept(struct smbdirect_socket *lsc,
-                                                long timeo,
-                                                struct proto_accept_arg *arg);
-
-int smbdirect_connection_rdma_xmit(struct smbdirect_socket *sc,
-                                  void *buf, size_t buf_len,
-                                  struct smbdirect_buffer_descriptor_v1 *desc,
-                                  size_t desc_len,
-                                  bool is_read);
-
-struct smbdirect_mr_io *
-smbdirect_connection_register_mr_io(struct smbdirect_socket *sc,
-                                   struct iov_iter *iter,
-                                   bool writing,
-                                   bool need_invalidate);
-
-void smbdirect_mr_io_fill_buffer_descriptor(struct smbdirect_mr_io *mr,
-                                           struct smbdirect_buffer_descriptor_v1 *v1);
-
-void smbdirect_connection_deregister_mr_io(struct smbdirect_mr_io *mr);
-
-void smbdirect_connection_legacy_debug_proc_show(struct smbdirect_socket *sc,
-                                                unsigned int rdma_readwrite_threshold,
-                                                struct seq_file *m);
-
-#endif /* __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_PUBLIC_H__ */
diff --git a/fs/smb/smbdirect/smbdirect.h b/fs/smb/smbdirect/smbdirect.h
deleted file mode 100644 (file)
index bbab5f7..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-or-later */
-/*
- *   Copyright (C) 2025 Stefan Metzmacher
- */
-
-#ifndef __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_H__
-#define __FS_SMB_COMMON_SMBDIRECT_SMBDIRECT_H__
-
-#include <linux/types.h>
-
-/* SMB-DIRECT buffer descriptor V1 structure [MS-SMBD] 2.2.3.1 */
-struct smbdirect_buffer_descriptor_v1 {
-       __le64 offset;
-       __le32 token;
-       __le32 length;
-} __packed;
-
-/*
- * Connection parameters mostly from [MS-SMBD] 3.1.1.1
- *
- * These are setup and negotiated at the beginning of a
- * connection and remain constant unless explicitly changed.
- *
- * 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;
-       __u32 negotiate_timeout_msec;
-       __u16 initiator_depth;     /* limited to U8_MAX */
-       __u16 responder_resources; /* limited to U8_MAX */
-       __u16 recv_credit_max;
-       __u16 send_credit_target;
-       __u32 max_send_size;
-       __u32 max_fragmented_send_size;
-       __u32 max_recv_size;
-       __u32 max_fragmented_recv_size;
-       __u32 max_read_write_size;
-       __u32 max_frmr_depth;
-       __u32 keepalive_interval_msec;
-       __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__ */
diff --git a/include/linux/smbdirect.h b/include/linux/smbdirect.h
new file mode 100644 (file)
index 0000000..97f5ba7
--- /dev/null
@@ -0,0 +1,186 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+/*
+ *   Copyright (C) 2025, Stefan Metzmacher
+ */
+
+#ifndef __LINUX_SMBDIRECT_H__
+#define __LINUX_SMBDIRECT_H__
+
+#include <linux/types.h>
+
+/* SMB-DIRECT buffer descriptor V1 structure [MS-SMBD] 2.2.3.1 */
+struct smbdirect_buffer_descriptor_v1 {
+       __le64 offset;
+       __le32 token;
+       __le32 length;
+} __packed;
+
+/*
+ * Connection parameters mostly from [MS-SMBD] 3.1.1.1
+ *
+ * These are setup and negotiated at the beginning of a
+ * connection and remain constant unless explicitly changed.
+ *
+ * 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;
+       __u32 negotiate_timeout_msec;
+       __u16 initiator_depth;     /* limited to U8_MAX */
+       __u16 responder_resources; /* limited to U8_MAX */
+       __u16 recv_credit_max;
+       __u16 send_credit_target;
+       __u32 max_send_size;
+       __u32 max_fragmented_send_size;
+       __u32 max_recv_size;
+       __u32 max_fragmented_recv_size;
+       __u32 max_read_write_size;
+       __u32 max_frmr_depth;
+       __u32 keepalive_interval_msec;
+       __u32 keepalive_timeout_msec;
+} __packed;
+
+#define SMBDIRECT_FLAG_PORT_RANGE_MASK ( \
+               SMBDIRECT_FLAG_PORT_RANGE_ONLY_IB | \
+               SMBDIRECT_FLAG_PORT_RANGE_ONLY_IW)
+
+struct smbdirect_socket;
+struct smbdirect_send_batch;
+struct smbdirect_mr_io;
+
+#include <rdma/rw.h>
+
+u8 smbdirect_netdev_rdma_capable_node_type(struct net_device *netdev);
+
+bool smbdirect_frwr_is_supported(const struct ib_device_attr *attrs);
+
+int smbdirect_socket_create_kern(struct net *net, struct smbdirect_socket **_sc);
+
+int smbdirect_socket_create_accepting(struct rdma_cm_id *id, struct smbdirect_socket **_sc);
+
+int smbdirect_socket_set_initial_parameters(struct smbdirect_socket *sc,
+                                           const struct smbdirect_socket_parameters *sp);
+
+const struct smbdirect_socket_parameters *
+smbdirect_socket_get_current_parameters(struct smbdirect_socket *sc);
+
+int smbdirect_socket_set_kernel_settings(struct smbdirect_socket *sc,
+                                        enum ib_poll_context poll_ctx,
+                                        gfp_t gfp_mask);
+
+#define SMBDIRECT_LOG_ERR              0x0
+#define SMBDIRECT_LOG_INFO             0x1
+
+#define SMBDIRECT_LOG_OUTGOING                 0x1
+#define SMBDIRECT_LOG_INCOMING                 0x2
+#define SMBDIRECT_LOG_READ                     0x4
+#define SMBDIRECT_LOG_WRITE                    0x8
+#define SMBDIRECT_LOG_RDMA_SEND                        0x10
+#define SMBDIRECT_LOG_RDMA_RECV                        0x20
+#define SMBDIRECT_LOG_KEEP_ALIVE               0x40
+#define SMBDIRECT_LOG_RDMA_EVENT               0x80
+#define SMBDIRECT_LOG_RDMA_MR                  0x100
+#define SMBDIRECT_LOG_RDMA_RW                  0x200
+#define SMBDIRECT_LOG_NEGOTIATE                        0x400
+void smbdirect_socket_set_logging(struct smbdirect_socket *sc,
+                                 void *private_ptr,
+                                 bool (*needed)(struct smbdirect_socket *sc,
+                                                void *private_ptr,
+                                                unsigned int lvl,
+                                                unsigned int cls),
+                                 void (*vaprintf)(struct smbdirect_socket *sc,
+                                                  const char *func,
+                                                  unsigned int line,
+                                                  void *private_ptr,
+                                                  unsigned int lvl,
+                                                  unsigned int cls,
+                                                  struct va_format *vaf));
+
+bool smbdirect_connection_is_connected(struct smbdirect_socket *sc);
+
+int smbdirect_connection_wait_for_connected(struct smbdirect_socket *sc);
+
+int smbdirect_socket_bind(struct smbdirect_socket *sc, struct sockaddr *addr);
+
+void smbdirect_socket_shutdown(struct smbdirect_socket *sc);
+
+void smbdirect_socket_release(struct smbdirect_socket *sc);
+
+int smbdirect_connection_send_batch_flush(struct smbdirect_socket *sc,
+                                         struct smbdirect_send_batch *batch,
+                                         bool is_last);
+
+/*
+ * This is only temporary and only needed
+ * as long as the client still requires
+ * to use smbdirect_connection_send_single_iter()
+ */
+struct smbdirect_send_batch_storage {
+       union {
+               struct list_head __msg_list;
+               __aligned_u64 __space[5];
+       };
+};
+
+struct smbdirect_send_batch *
+smbdirect_init_send_batch_storage(struct smbdirect_send_batch_storage *storage,
+                                 bool need_invalidate_rkey,
+                                 unsigned int remote_key);
+
+int smbdirect_connection_send_single_iter(struct smbdirect_socket *sc,
+                                         struct smbdirect_send_batch *batch,
+                                         struct iov_iter *iter,
+                                         unsigned int flags,
+                                         u32 remaining_data_length);
+
+int smbdirect_connection_send_wait_zero_pending(struct smbdirect_socket *sc);
+
+int smbdirect_connection_send_iter(struct smbdirect_socket *sc,
+                                  struct iov_iter *iter,
+                                  unsigned int flags,
+                                  bool need_invalidate,
+                                  unsigned int remote_key);
+
+int smbdirect_connection_recvmsg(struct smbdirect_socket *sc,
+                                struct msghdr *msg,
+                                unsigned int flags);
+
+int smbdirect_connect(struct smbdirect_socket *sc,
+                     const struct sockaddr *dst);
+
+int smbdirect_connect_sync(struct smbdirect_socket *sc,
+                          const struct sockaddr *dst);
+
+int smbdirect_socket_listen(struct smbdirect_socket *sc, int backlog);
+
+struct smbdirect_socket *smbdirect_socket_accept(struct smbdirect_socket *lsc,
+                                                long timeo,
+                                                struct proto_accept_arg *arg);
+
+int smbdirect_connection_rdma_xmit(struct smbdirect_socket *sc,
+                                  void *buf, size_t buf_len,
+                                  struct smbdirect_buffer_descriptor_v1 *desc,
+                                  size_t desc_len,
+                                  bool is_read);
+
+struct smbdirect_mr_io *
+smbdirect_connection_register_mr_io(struct smbdirect_socket *sc,
+                                   struct iov_iter *iter,
+                                   bool writing,
+                                   bool need_invalidate);
+
+void smbdirect_mr_io_fill_buffer_descriptor(struct smbdirect_mr_io *mr,
+                                           struct smbdirect_buffer_descriptor_v1 *v1);
+
+void smbdirect_connection_deregister_mr_io(struct smbdirect_mr_io *mr);
+
+void smbdirect_connection_legacy_debug_proc_show(struct smbdirect_socket *sc,
+                                                unsigned int rdma_readwrite_threshold,
+                                                struct seq_file *m);
+
+#endif /* __LINUX_SMBDIRECT_H__ */