From: Henrique Carvalho <henrique.carvalho@suse.com>
To: linux-cifs@vger.kernel.org
Cc: linkinjeon@kernel.org, sfrench@samba.org, metze@samba.org,
senozhatsky@chromium.org, tom@talpey.com, ematsumiya@suse.de,
Henrique Carvalho <henrique.carvalho@suse.com>
Subject: [PATCH v2 05/11] smb: server: split interface management from TCP in preparation for QUIC
Date: Tue, 28 Apr 2026 12:57:54 -0300 [thread overview]
Message-ID: <20260428155759.226368-1-henrique.carvalho@suse.com> (raw)
Move active_num_conn out of transport_tcp.c and define it in
connection.c.
Move the transport-agnostic bits out into a new interface.c /
interface.h, network-interface bookkeeping, the iface_list, the
netdevice notifier, alloc/find/set helpers, and the per-iface forker
kthread plumbing.
Make the necessary changes to transport_tcp.c, without functional change
for the TCP path; this is purely a layering rearrangement to make room
for additional transports.
Signed-off-by: Henrique Carvalho <henrique.carvalho@suse.com>
---
fs/smb/server/Makefile | 2 +-
fs/smb/server/connection.c | 9 +-
fs/smb/server/connection.h | 1 +
fs/smb/server/interface.c | 196 ++++++++++++++++++++++++++++++
fs/smb/server/interface.h | 34 ++++++
fs/smb/server/transport_ipc.c | 2 +-
fs/smb/server/transport_tcp.c | 223 ++++------------------------------
fs/smb/server/transport_tcp.h | 7 +-
8 files changed, 265 insertions(+), 209 deletions(-)
create mode 100644 fs/smb/server/interface.c
create mode 100644 fs/smb/server/interface.h
diff --git a/fs/smb/server/Makefile b/fs/smb/server/Makefile
index 6407ba6b9340..7bd6501bfdc9 100644
--- a/fs/smb/server/Makefile
+++ b/fs/smb/server/Makefile
@@ -8,7 +8,7 @@ ksmbd-y := unicode.o auth.o vfs.o vfs_cache.o server.o ndr.o \
misc.o oplock.o connection.o ksmbd_work.o crypto_ctx.o \
mgmt/ksmbd_ida.o mgmt/user_config.o mgmt/share_config.o \
mgmt/tree_connect.o mgmt/user_session.o smb_common.o \
- transport_tcp.o transport_ipc.o smbacl.o smb2pdu.o \
+ interface.o transport_tcp.o transport_ipc.o smbacl.o smb2pdu.o \
smb2ops.o smb2misc.o ksmbd_spnego_negtokeninit.asn1.o \
ksmbd_spnego_negtokentarg.asn1.o asn1.o
diff --git a/fs/smb/server/connection.c b/fs/smb/server/connection.c
index 31392d245c30..7465b364c35c 100644
--- a/fs/smb/server/connection.c
+++ b/fs/smb/server/connection.c
@@ -12,6 +12,7 @@
#include "smb_common.h"
#include "mgmt/ksmbd_ida.h"
#include "connection.h"
+#include "interface.h"
#include "transport_tcp.h"
#include "transport_rdma.h"
#include "misc.h"
@@ -79,6 +80,8 @@ static int create_proc_clients(void) { return 0; }
static void delete_proc_clients(void) {}
#endif
+atomic_t active_num_conn = ATOMIC_INIT(0);
+
/**
* ksmbd_conn_free() - free resources of the connection instance
*
@@ -512,9 +515,9 @@ int ksmbd_conn_transport_init(void)
int ret;
mutex_lock(&init_lock);
- ret = ksmbd_tcp_init();
+ ret = ksmbd_interface_init();
if (ret) {
- pr_err("Failed to init TCP subsystem: %d\n", ret);
+ pr_err("Failed to init interface: %d\n", ret);
goto out;
}
@@ -558,7 +561,7 @@ void ksmbd_conn_transport_destroy(void)
{
delete_proc_clients();
mutex_lock(&init_lock);
- ksmbd_tcp_destroy();
+ ksmbd_interface_destroy();
ksmbd_rdma_stop_listening();
stop_sessions();
mutex_unlock(&init_lock);
diff --git a/fs/smb/server/connection.h b/fs/smb/server/connection.h
index ae21a1bd4c70..b060baf5f688 100644
--- a/fs/smb/server/connection.h
+++ b/fs/smb/server/connection.h
@@ -157,6 +157,7 @@ struct ksmbd_transport {
#define CONN_HASH_BITS 12
extern DECLARE_HASHTABLE(conn_list, CONN_HASH_BITS);
extern struct rw_semaphore conn_list_lock;
+extern atomic_t active_num_conn;
bool ksmbd_conn_alive(struct ksmbd_conn *conn);
void ksmbd_conn_wait_idle(struct ksmbd_conn *conn);
diff --git a/fs/smb/server/interface.c b/fs/smb/server/interface.c
new file mode 100644
index 000000000000..a5e59a420639
--- /dev/null
+++ b/fs/smb/server/interface.c
@@ -0,0 +1,196 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2016 Namjae Jeon <linkinjeon@kernel.org>
+ * Copyright (C) 2018 Samsung Electronics Co., Ltd.
+ */
+
+#include <linux/freezer.h>
+
+#include "smb_common.h"
+#include "server.h"
+#include "auth.h"
+#include "connection.h"
+#include "transport_tcp.h"
+#include "interface.h"
+
+static LIST_HEAD(iface_list);
+static int bind_additional_ifaces;
+
+static struct interface *alloc_iface(char *ifname)
+{
+ struct interface *iface;
+
+ if (!ifname)
+ return NULL;
+
+ iface = kzalloc_obj(struct interface, KSMBD_DEFAULT_GFP);
+ if (!iface) {
+ kfree(ifname);
+ return NULL;
+ }
+
+ iface->name = ifname;
+ iface->state = IFACE_STATE_DOWN;
+ list_add(&iface->entry, &iface_list);
+ return iface;
+}
+
+/**
+ * ksmbd_interface_run_kthread() - start a per-interface forker thread
+ * @iface: pointer to struct interface
+ * @kthread_fn: thread routine to run
+ * @suf: suffix to append to the thread name (e.g. "tcp")
+ *
+ * Return: the started task_struct, or ERR_PTR on failure.
+ */
+struct task_struct *ksmbd_interface_run_kthread(struct interface *iface,
+ int (*kthread_fn)(void *), const char *suf)
+{
+ struct task_struct *kthread;
+
+ kthread = kthread_run(kthread_fn, (void *)iface, "ksmbd-%s-%s", iface->name, suf);
+ return kthread;
+}
+
+void ksmbd_interface_stop_kthread(struct task_struct *kthread)
+{
+ int ret;
+
+ if (!kthread)
+ return;
+
+ ret = kthread_stop(kthread);
+ if (ret)
+ pr_err("failed to stop forker thread\n");
+}
+
+static int ksmbd_netdev_event(struct notifier_block *nb, unsigned long event,
+ void *ptr)
+{
+ struct net_device *netdev = netdev_notifier_info_to_dev(ptr);
+ struct interface *iface;
+ int ret;
+
+ switch (event) {
+ case NETDEV_UP:
+ if (netif_is_bridge_port(netdev))
+ return NOTIFY_OK;
+
+ iface = ksmbd_find_netdev_name_iface_list(netdev->name);
+ if (iface && iface->state == IFACE_STATE_DOWN) {
+ ksmbd_debug(CONN, "netdev-up event: netdev(%s) is going up\n",
+ iface->name);
+
+ if (!iface->net)
+ iface->net = get_net(dev_net(netdev));
+
+ ret = ksmbd_tcp_create_socket(iface);
+ if (ret)
+ break;
+ }
+ if (!iface && bind_additional_ifaces) {
+ iface = alloc_iface(kstrdup(netdev->name, KSMBD_DEFAULT_GFP));
+ if (!iface)
+ return NOTIFY_OK;
+
+ ksmbd_debug(CONN, "netdev-up event: netdev(%s) is going up\n",
+ iface->name);
+
+ iface->net = get_net(dev_net(netdev));
+
+ ret = ksmbd_tcp_create_socket(iface);
+ if (ret)
+ break;
+ }
+ break;
+ case NETDEV_DOWN:
+ iface = ksmbd_find_netdev_name_iface_list(netdev->name);
+ if (iface && iface->state == IFACE_STATE_CONFIGURED) {
+ ksmbd_debug(CONN, "netdev-down event: netdev(%s) is going down\n",
+ iface->name);
+
+ if (iface->ksmbd_tcp_socket)
+ kernel_sock_shutdown(iface->ksmbd_tcp_socket, SHUT_RDWR);
+
+ if (iface->ksmbd_tcp_kthread)
+ ksmbd_interface_stop_kthread(iface->ksmbd_tcp_kthread);
+
+ if (iface->ksmbd_tcp_socket)
+ sock_release(iface->ksmbd_tcp_socket);
+
+ iface->ksmbd_tcp_kthread = NULL;
+ iface->ksmbd_tcp_socket = NULL;
+
+ put_net(iface->net);
+ iface->net = NULL;
+
+ iface->state = IFACE_STATE_DOWN;
+ break;
+ }
+ break;
+ }
+
+ return NOTIFY_DONE;
+}
+
+static struct notifier_block ksmbd_netdev_notifier = {
+ .notifier_call = ksmbd_netdev_event,
+};
+
+int ksmbd_interface_init(void)
+{
+ register_netdevice_notifier(&ksmbd_netdev_notifier);
+
+ return 0;
+}
+
+
+void ksmbd_interface_destroy(void)
+{
+ struct interface *iface, *tmp;
+
+ unregister_netdevice_notifier(&ksmbd_netdev_notifier);
+
+ list_for_each_entry_safe(iface, tmp, &iface_list, entry) {
+ list_del(&iface->entry);
+ kfree(iface->name);
+ kfree(iface);
+ }
+}
+
+struct interface *
+ksmbd_find_netdev_name_iface_list(char *netdev_name)
+{
+ struct interface *iface;
+
+ list_for_each_entry(iface, &iface_list, entry)
+ if (!strcmp(iface->name, netdev_name))
+ return iface;
+ return NULL;
+}
+
+int ksmbd_set_interfaces(char *ifc_list, int ifc_list_sz)
+{
+ int sz = 0;
+
+ if (!ifc_list_sz) {
+ bind_additional_ifaces = 1;
+ return 0;
+ }
+
+ while (ifc_list_sz > 0) {
+ if (!alloc_iface(kstrdup(ifc_list, KSMBD_DEFAULT_GFP)))
+ return -ENOMEM;
+
+ sz = strlen(ifc_list);
+ if (!sz)
+ break;
+
+ ifc_list += sz + 1;
+ ifc_list_sz -= (sz + 1);
+ }
+
+ bind_additional_ifaces = 0;
+
+ return 0;
+}
diff --git a/fs/smb/server/interface.h b/fs/smb/server/interface.h
new file mode 100644
index 000000000000..7e35645076a9
--- /dev/null
+++ b/fs/smb/server/interface.h
@@ -0,0 +1,34 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright (C) 2016 Namjae Jeon <linkinjeon@kernel.org>
+ * Copyright (C) 2018 Samsung Electronics Co., Ltd.
+ *
+ */
+
+#ifndef __KSMBD_INTERFACE_H__
+#define __KSMBD_INTERFACE_H__
+
+#include <linux/freezer.h>
+
+#define IFACE_STATE_DOWN BIT(0)
+#define IFACE_STATE_CONFIGURED BIT(1)
+
+struct interface {
+ struct task_struct *ksmbd_tcp_kthread;
+ struct socket *ksmbd_tcp_socket;
+ struct list_head entry;
+ char *name;
+ int state;
+ struct net *net;
+};
+
+int ksmbd_interface_init(void);
+void ksmbd_interface_destroy(void);
+int ksmbd_set_interfaces(char *ifc_list, int ifc_list_sz);
+struct interface *ksmbd_find_netdev_name_iface_list(char *netdev_name);
+struct task_struct *ksmbd_interface_run_kthread(struct interface *iface,
+ int (*kthread_fn)(void *),
+ const char *suf);
+void ksmbd_interface_stop_kthread(struct task_struct *kthread);
+
+#endif /* _KSMBD_INTERFACE_H */
diff --git a/fs/smb/server/transport_ipc.c b/fs/smb/server/transport_ipc.c
index 2dbabe2d8005..6ccfb1cf8ed7 100644
--- a/fs/smb/server/transport_ipc.c
+++ b/fs/smb/server/transport_ipc.c
@@ -348,7 +348,7 @@ static int ipc_server_config_on_startup(struct ksmbd_startup_request *req)
ret |= ksmbd_set_server_string(req->server_string);
ret |= ksmbd_set_work_group(req->work_group);
server_conf.bind_interfaces_only = req->bind_interfaces_only;
- ret |= ksmbd_tcp_set_interfaces(KSMBD_STARTUP_CONFIG_INTERFACES(req),
+ ret |= ksmbd_set_interfaces(KSMBD_STARTUP_CONFIG_INTERFACES(req),
req->ifc_list_sz);
out:
if (ret) {
diff --git a/fs/smb/server/transport_tcp.c b/fs/smb/server/transport_tcp.c
index 7e29b06820e2..37f4238f72f5 100644
--- a/fs/smb/server/transport_tcp.c
+++ b/fs/smb/server/transport_tcp.c
@@ -11,23 +11,7 @@
#include "auth.h"
#include "connection.h"
#include "transport_tcp.h"
-
-#define IFACE_STATE_DOWN BIT(0)
-#define IFACE_STATE_CONFIGURED BIT(1)
-
-static atomic_t active_num_conn;
-
-struct interface {
- struct task_struct *ksmbd_kthread;
- struct socket *ksmbd_socket;
- struct list_head entry;
- char *name;
- int state;
-};
-
-static LIST_HEAD(iface_list);
-
-static int bind_additional_ifaces;
+#include "interface.h"
struct tcp_transport {
struct ksmbd_transport transport;
@@ -38,8 +22,6 @@ struct tcp_transport {
static const struct ksmbd_transport_ops ksmbd_tcp_transport_ops;
-static void tcp_stop_kthread(struct task_struct *kthread);
-static struct interface *alloc_iface(char *ifname);
static void ksmbd_tcp_disconnect(struct ksmbd_transport *t);
#define KSMBD_TRANS(t) (&(t)->transport)
@@ -214,7 +196,7 @@ static int ksmbd_tcp_new_connection(struct socket *client_sk)
*
* Return: 0 on success, error number otherwise
*/
-static int ksmbd_kthread_fn(void *p)
+static int tcp_kthread_fn(void *p)
{
struct socket *client_sk = NULL;
struct interface *iface = (struct interface *)p;
@@ -223,10 +205,9 @@ static int ksmbd_kthread_fn(void *p)
unsigned int max_ip_conns;
while (!kthread_should_stop()) {
- if (!iface->ksmbd_socket) {
+ if (!iface->ksmbd_tcp_socket)
break;
- }
- ret = kernel_accept(iface->ksmbd_socket, &client_sk, 0);
+ ret = kernel_accept(iface->ksmbd_tcp_socket, &client_sk, 0);
if (ret == -EINVAL)
break;
if (ret)
@@ -298,32 +279,6 @@ static int ksmbd_kthread_fn(void *p)
return 0;
}
-/**
- * ksmbd_tcp_run_kthread() - start forker thread
- * @iface: pointer to struct interface
- *
- * start forker thread(ksmbd/0) at module init time to listen
- * on port 445 for new SMB connection requests. It creates per connection
- * server threads(ksmbd/x)
- *
- * Return: 0 on success or error number
- */
-static int ksmbd_tcp_run_kthread(struct interface *iface)
-{
- int rc;
- struct task_struct *kthread;
-
- kthread = kthread_run(ksmbd_kthread_fn, (void *)iface, "ksmbd-%s",
- iface->name);
- if (IS_ERR(kthread)) {
- rc = PTR_ERR(kthread);
- return rc;
- }
- iface->ksmbd_kthread = kthread;
-
- return 0;
-}
-
/**
* ksmbd_tcp_readv() - read data from socket in given iovec
* @t: TCP transport instance
@@ -432,7 +387,7 @@ static void ksmbd_tcp_disconnect(struct ksmbd_transport *t)
atomic_dec(&active_num_conn);
}
-static void tcp_destroy_socket(struct socket *ksmbd_socket)
+void ksmbd_tcp_destroy_socket(struct socket *ksmbd_socket)
{
int ret;
@@ -451,21 +406,22 @@ static void tcp_destroy_socket(struct socket *ksmbd_socket)
*
* Return: 0 on success, error number otherwise
*/
-static int create_socket(struct interface *iface)
+int ksmbd_tcp_create_socket(struct interface *iface)
{
int ret;
struct sockaddr_in6 sin6;
struct sockaddr_in sin;
struct socket *ksmbd_socket;
+ struct task_struct *kthread;
bool ipv4 = false;
- ret = sock_create_kern(current->nsproxy->net_ns, PF_INET6, SOCK_STREAM,
- IPPROTO_TCP, &ksmbd_socket);
+ ret = sock_create_kern(iface->net, PF_INET6, SOCK_STREAM,
+ IPPROTO_TCP, &ksmbd_socket);
if (ret) {
if (ret != -EAFNOSUPPORT)
pr_err("Can't create socket for ipv6, fallback to ipv4: %d\n", ret);
- ret = sock_create_kern(current->nsproxy->net_ns, PF_INET,
- SOCK_STREAM, IPPROTO_TCP, &ksmbd_socket);
+ ret = sock_create_kern(iface->net, PF_INET, SOCK_STREAM,
+ IPPROTO_TCP, &ksmbd_socket);
if (ret) {
pr_err("Can't create socket for ipv4: %d\n", ret);
goto out_clear;
@@ -515,165 +471,28 @@ static int create_socket(struct interface *iface)
goto out_error;
}
- iface->ksmbd_socket = ksmbd_socket;
- ret = ksmbd_tcp_run_kthread(iface);
- if (ret) {
+ iface->ksmbd_tcp_socket = ksmbd_socket;
+
+ kthread = ksmbd_interface_run_kthread(iface, tcp_kthread_fn, "tcp");
+ if (IS_ERR(kthread)) {
pr_err("Can't start ksmbd main kthread: %d\n", ret);
+ ret = PTR_ERR(kthread);
goto out_error;
}
+
+ iface->ksmbd_tcp_kthread = kthread;
iface->state = IFACE_STATE_CONFIGURED;
return 0;
out_error:
- tcp_destroy_socket(ksmbd_socket);
+ ksmbd_tcp_destroy_socket(ksmbd_socket);
out_clear:
- iface->ksmbd_socket = NULL;
+ iface->ksmbd_tcp_socket = NULL;
+ iface->ksmbd_tcp_kthread = NULL;
return ret;
}
-struct interface *ksmbd_find_netdev_name_iface_list(char *netdev_name)
-{
- struct interface *iface;
-
- list_for_each_entry(iface, &iface_list, entry)
- if (!strcmp(iface->name, netdev_name))
- return iface;
- return NULL;
-}
-
-static int ksmbd_netdev_event(struct notifier_block *nb, unsigned long event,
- void *ptr)
-{
- struct net_device *netdev = netdev_notifier_info_to_dev(ptr);
- struct interface *iface;
- int ret;
-
- switch (event) {
- case NETDEV_UP:
- if (netif_is_bridge_port(netdev))
- return NOTIFY_OK;
-
- iface = ksmbd_find_netdev_name_iface_list(netdev->name);
- if (iface && iface->state == IFACE_STATE_DOWN) {
- ksmbd_debug(CONN, "netdev-up event: netdev(%s) is going up\n",
- iface->name);
- ret = create_socket(iface);
- if (ret)
- return NOTIFY_OK;
- }
- if (!iface && bind_additional_ifaces) {
- iface = alloc_iface(kstrdup(netdev->name, KSMBD_DEFAULT_GFP));
- if (!iface)
- return NOTIFY_OK;
- ksmbd_debug(CONN, "netdev-up event: netdev(%s) is going up\n",
- iface->name);
- ret = create_socket(iface);
- if (ret)
- break;
- }
- break;
- case NETDEV_DOWN:
- iface = ksmbd_find_netdev_name_iface_list(netdev->name);
- if (iface && iface->state == IFACE_STATE_CONFIGURED) {
- ksmbd_debug(CONN, "netdev-down event: netdev(%s) is going down\n",
- iface->name);
- kernel_sock_shutdown(iface->ksmbd_socket, SHUT_RDWR);
- tcp_stop_kthread(iface->ksmbd_kthread);
- iface->ksmbd_kthread = NULL;
- sock_release(iface->ksmbd_socket);
- iface->ksmbd_socket = NULL;
-
- iface->state = IFACE_STATE_DOWN;
- break;
- }
- break;
- }
-
- return NOTIFY_DONE;
-}
-
-static struct notifier_block ksmbd_netdev_notifier = {
- .notifier_call = ksmbd_netdev_event,
-};
-
-int ksmbd_tcp_init(void)
-{
- register_netdevice_notifier(&ksmbd_netdev_notifier);
-
- return 0;
-}
-
-static void tcp_stop_kthread(struct task_struct *kthread)
-{
- int ret;
-
- if (!kthread)
- return;
-
- ret = kthread_stop(kthread);
- if (ret)
- pr_err("failed to stop forker thread\n");
-}
-
-void ksmbd_tcp_destroy(void)
-{
- struct interface *iface, *tmp;
-
- unregister_netdevice_notifier(&ksmbd_netdev_notifier);
-
- list_for_each_entry_safe(iface, tmp, &iface_list, entry) {
- list_del(&iface->entry);
- kfree(iface->name);
- kfree(iface);
- }
-}
-
-static struct interface *alloc_iface(char *ifname)
-{
- struct interface *iface;
-
- if (!ifname)
- return NULL;
-
- iface = kzalloc_obj(struct interface, KSMBD_DEFAULT_GFP);
- if (!iface) {
- kfree(ifname);
- return NULL;
- }
-
- iface->name = ifname;
- iface->state = IFACE_STATE_DOWN;
- list_add(&iface->entry, &iface_list);
- return iface;
-}
-
-int ksmbd_tcp_set_interfaces(char *ifc_list, int ifc_list_sz)
-{
- int sz = 0;
-
- if (!ifc_list_sz) {
- bind_additional_ifaces = 1;
- return 0;
- }
-
- while (ifc_list_sz > 0) {
- if (!alloc_iface(kstrdup(ifc_list, KSMBD_DEFAULT_GFP)))
- return -ENOMEM;
-
- sz = strlen(ifc_list);
- if (!sz)
- break;
-
- ifc_list += sz + 1;
- ifc_list_sz -= (sz + 1);
- }
-
- bind_additional_ifaces = 0;
-
- return 0;
-}
-
static const struct ksmbd_transport_ops ksmbd_tcp_transport_ops = {
.read = ksmbd_tcp_read,
.writev = ksmbd_tcp_writev,
diff --git a/fs/smb/server/transport_tcp.h b/fs/smb/server/transport_tcp.h
index 1e51675ee1b2..d122e4b69d65 100644
--- a/fs/smb/server/transport_tcp.h
+++ b/fs/smb/server/transport_tcp.h
@@ -6,10 +6,13 @@
#ifndef __KSMBD_TRANSPORT_TCP_H__
#define __KSMBD_TRANSPORT_TCP_H__
-int ksmbd_tcp_set_interfaces(char *ifc_list, int ifc_list_sz);
-struct interface *ksmbd_find_netdev_name_iface_list(char *netdev_name);
+#include "interface.h"
+
void ksmbd_free_transport(struct ksmbd_transport *kt);
int ksmbd_tcp_init(void);
void ksmbd_tcp_destroy(void);
+int ksmbd_tcp_create_socket(struct interface *iface);
+void ksmbd_tcp_stop_kthread(struct task_struct *kthread);
+void ksmbd_tcp_destroy_socket(struct socket *ksmbd_socket);
#endif /* __KSMBD_TRANSPORT_TCP_H__ */
--
2.53.0
next reply other threads:[~2026-04-28 15:58 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-28 15:57 Henrique Carvalho [this message]
2026-04-28 15:57 ` [PATCH v2 06/11] smb: server: add shared transport helpers in preparation for QUIC Henrique Carvalho
2026-04-29 22:24 ` Namjae Jeon
2026-04-28 15:57 ` [PATCH v2 07/11] smb: server: reuse common transport helpers in TCP transport Henrique Carvalho
2026-04-28 15:57 ` [PATCH v2 08/11] smb: server: add QUIC transport support Henrique Carvalho
2026-04-28 15:57 ` [PATCH v2 09/11] smb: server: refactor TCP transport definitions Henrique Carvalho
2026-04-28 15:57 ` [PATCH v2 10/11] smb: server: track TCP and QUIC listener state independently Henrique Carvalho
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260428155759.226368-1-henrique.carvalho@suse.com \
--to=henrique.carvalho@suse.com \
--cc=ematsumiya@suse.de \
--cc=linkinjeon@kernel.org \
--cc=linux-cifs@vger.kernel.org \
--cc=metze@samba.org \
--cc=senozhatsky@chromium.org \
--cc=sfrench@samba.org \
--cc=tom@talpey.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox