get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/1.1/patches/2229696/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2229696,
    "url": "http://patchwork.ozlabs.org/api/1.1/patches/2229696/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/linux-cifs-client/patch/20260428155759.226368-4-henrique.carvalho@suse.com/",
    "project": {
        "id": 12,
        "url": "http://patchwork.ozlabs.org/api/1.1/projects/12/?format=api",
        "name": "Linux CIFS Client",
        "link_name": "linux-cifs-client",
        "list_id": "linux-cifs.vger.kernel.org",
        "list_email": "linux-cifs@vger.kernel.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20260428155759.226368-4-henrique.carvalho@suse.com>",
    "date": "2026-04-28T15:57:57",
    "name": "[v2,08/11] smb: server: add QUIC transport support",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "77d1c2bb21d3f80e092fd8015b3f2ea15fca2c10",
    "submitter": {
        "id": 89563,
        "url": "http://patchwork.ozlabs.org/api/1.1/people/89563/?format=api",
        "name": "Henrique Carvalho",
        "email": "henrique.carvalho@suse.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/linux-cifs-client/patch/20260428155759.226368-4-henrique.carvalho@suse.com/mbox/",
    "series": [
        {
            "id": 501886,
            "url": "http://patchwork.ozlabs.org/api/1.1/series/501886/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/linux-cifs-client/list/?series=501886",
            "date": "2026-04-28T15:55:41",
            "name": "smb: implement SMB over QUIC",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/501886/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2229696/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2229696/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "\n <linux-cifs+bounces-11234-incoming=patchwork.ozlabs.org@vger.kernel.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "linux-cifs@vger.kernel.org"
        ],
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=suse.com header.i=@suse.com header.a=rsa-sha256\n header.s=google header.b=ODRn7BoK;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c0a:e001:db::12fc:5321; helo=sea.lore.kernel.org;\n envelope-from=linux-cifs+bounces-11234-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)",
            "smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com\n header.b=\"ODRn7BoK\"",
            "smtp.subspace.kernel.org;\n arc=none smtp.client-ip=209.85.128.47",
            "smtp.subspace.kernel.org;\n dmarc=pass (p=quarantine dis=none) header.from=suse.com",
            "smtp.subspace.kernel.org;\n spf=pass smtp.mailfrom=suse.com"
        ],
        "Received": [
            "from sea.lore.kernel.org (sea.lore.kernel.org\n [IPv6:2600:3c0a:e001:db::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4g4ll34DnLz1xrS\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 29 Apr 2026 02:10:07 +1000 (AEST)",
            "from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby sea.lore.kernel.org (Postfix) with ESMTP id 44BF9319EC31\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 28 Apr 2026 16:01:54 +0000 (UTC)",
            "from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id A6AB8407596;\n\tTue, 28 Apr 2026 15:58:24 +0000 (UTC)",
            "from mail-wm1-f47.google.com (mail-wm1-f47.google.com\n [209.85.128.47])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id 7DEFF3A1A3F\n\tfor <linux-cifs@vger.kernel.org>; Tue, 28 Apr 2026 15:58:22 +0000 (UTC)",
            "by mail-wm1-f47.google.com with SMTP id\n 5b1f17b1804b1-488d2079582so136925905e9.2\n        for <linux-cifs@vger.kernel.org>;\n Tue, 28 Apr 2026 08:58:22 -0700 (PDT)",
            "from precision ([2a01:4b00:c007:bb00:be9d:a3c4:18b1:4a25])\n        by smtp.gmail.com with ESMTPSA id\n 5b1f17b1804b1-48a7b560a84sm3409255e9.4.2026.04.28.08.58.19\n        (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n        Tue, 28 Apr 2026 08:58:19 -0700 (PDT)"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1777391904; cv=none;\n b=EheOmUXGb/VOwoIOpGnW/wIvkr9gqDVctJ4GhPSYDfyThjV5dAJFm8fePoRBISY7m6DJM4pZdgVIjFQUOzQSYp/9CeXooIet+N6SAKX8+lmoNF3Ja8naVLNGF42+K+qDB2m+tv0747ewyTZ9GAImVNXlDWSX4Fw3dpVJpTju2OM=",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1777391904; c=relaxed/simple;\n\tbh=biHoc+S3ZNaPblcRytjpFSB2ud4qrURq1hCyLlogTRQ=;\n\th=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:\n\t MIME-Version;\n b=TCqFXbJB/WOAzkNbt3UoSkPYAbtzSEzfLlDM/kuEg55JRwI8KbXGlwj9hvk3AWSi16OijWjNtAEqLl4XBXYELqZKN0zsBY9Z2UMu5vlX5yyRN14+aYbgCqDbjInpzdEJKnv3d1CN66IcPzGKhGbtIVfeHPkSt0HxYIU4MMbNxCw=",
        "ARC-Authentication-Results": "i=1; smtp.subspace.kernel.org;\n dmarc=pass (p=quarantine dis=none) header.from=suse.com;\n spf=pass smtp.mailfrom=suse.com;\n dkim=pass (2048-bit key) header.d=suse.com header.i=@suse.com\n header.b=ODRn7BoK; arc=none smtp.client-ip=209.85.128.47",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n        d=suse.com; s=google; t=1777391901; x=1777996701;\n darn=vger.kernel.org;\n        h=content-transfer-encoding:mime-version:references:in-reply-to\n         :message-id:date:subject:cc:to:from:from:to:cc:subject:date\n         :message-id:reply-to;\n        bh=09ViX6UWiF3HhVw6Pnm4KFSTchtVcjkElgpqnR5pDBM=;\n        b=ODRn7BoKHaZOR5ufjPPZRBdMMuQrZ6M0sgH15KwfDfFPYRVRmnCJQUVHLmU9orcHNq\n         8AS0K6HZgYKh+9SeK2z2HAY0cCFexVeUkfSyrvb0GC8GyWCZNtSQuBb+xnSH2RVzL14F\n         cgzUK5D87SA7/TGOhuB4980wkAGqpBeZOqBiUeyzNb+64r6rqLiyWX5cX9jrbXMB3ci7\n         r9OHfMVZBsNC1m5wxWPcKxv2By4MLVfjfkbbeBZuEUBX55DjqU1MGheZ1SuYc7jwfVwc\n         EGixHyCtwepgPvq5uQoW9QJiknOzP7DVq4Q4aq0/mWQyNOhCdjjTsL8/8ehICwGXvXgs\n         tBsQ==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n        d=1e100.net; s=20251104; t=1777391901; x=1777996701;\n        h=content-transfer-encoding:mime-version:references:in-reply-to\n         :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from\n         :to:cc:subject:date:message-id:reply-to;\n        bh=09ViX6UWiF3HhVw6Pnm4KFSTchtVcjkElgpqnR5pDBM=;\n        b=UqgPo0z8TA93NYCT7gJS/iaK09n728cMrSkfex/qQraskXrh010k1794UYKx7qLBcb\n         +Bb8V5xupGtvSX3ca7Wiq+O+ElrqTok67n6pmtJzerVzGGr9kvnKoKalnmRNKphoIDTn\n         h+WnAVFNYsS55OAW2fJZGgVu8NtOagEYs55Ro4Rgd7Qbm83hwATpAH51nrH33pul9CDm\n         LYjwUhGFcDTHkmykLfWFJKaTq7js1LbQ7wwzkzU9EX4xEvH9KeYOXvBVyTzcRd/bST1x\n         nhDvn9cokIkXZyu1Tt4bfFRrQyFuzeVsIjFt+NWxd7xhuc2RuDe09KB+I3DFOkWf5ZaO\n         gGHg==",
        "X-Gm-Message-State": "AOJu0YwsQBjf8A5lXWq8z+t6VKI9v0km195OkkAczfgUZdzcSjd3hBYc\n\tID3cuGnR3AWVFrWufX3PmssodZ1FzvkJQTlfmG+YjM7EeO/fk7EsvFalCS1eAaJezgKt3rufX8W\n\t/V6nxx4Az0A==",
        "X-Gm-Gg": "AeBDieukf+5kfWbsgaUDNwDVWRpGGvQsTpPspVJVfDoByXxqR1ESeIrRVJ3dsEneFJU\n\tClBomj9noTYDrQ15ldHcnIITqCu7PWNIqJgA8VFR+xp6CZewHH4K6Io19fikNQAabZY8MO+gv7f\n\tXlDCnXfxiYaogb2hiopxlD/lDTftCyL0cRYSMJOvp/CiBbF4djTaYRIAuILra2FL6gc+w0CAt0+\n\tsRT3YM80OrC3NAochOW22vov5eJLhcy4ElWLm8WbmaHi4XZCvRyIdICv7eug4Ff0Nywn6APB8Jn\n\twzI7WfQCiCF5h5N/P2xc3OO9GD6hn36QKDhQ96kZecQeyats4JT25vMe+SuKKL4a14K1IWNj8Ll\n\tBEK+/X79BNIWv5kZbYmZLDpjVPtIGDH4DUD4kJ7slhVoRx84Bj4vNTjSDNwkynj5BbiKpn9ozA5\n\tz6Viv5Q8T2CGkOQn+y/eoh8RYqm7+TD44VL92I4eS8C+vS",
        "X-Received": "by 2002:a05:600c:1f13:b0:48a:7772:c26b with SMTP id\n 5b1f17b1804b1-48a7b546cf4mr3740485e9.26.1777391900382;\n        Tue, 28 Apr 2026 08:58:20 -0700 (PDT)",
        "From": "Henrique Carvalho <henrique.carvalho@suse.com>",
        "To": "linux-cifs@vger.kernel.org",
        "Cc": "linkinjeon@kernel.org,\n\tsfrench@samba.org,\n\tmetze@samba.org,\n\tsenozhatsky@chromium.org,\n\ttom@talpey.com,\n\tematsumiya@suse.de,\n\tHenrique Carvalho <henrique.carvalho@suse.com>",
        "Subject": "[PATCH v2 08/11] smb: server: add QUIC transport support",
        "Date": "Tue, 28 Apr 2026 12:57:57 -0300",
        "Message-ID": "<20260428155759.226368-4-henrique.carvalho@suse.com>",
        "X-Mailer": "git-send-email 2.53.0",
        "In-Reply-To": "<20260428155759.226368-1-henrique.carvalho@suse.com>",
        "References": "<20260428155759.226368-1-henrique.carvalho@suse.com>",
        "Precedence": "bulk",
        "X-Mailing-List": "linux-cifs@vger.kernel.org",
        "List-Id": "<linux-cifs.vger.kernel.org>",
        "List-Subscribe": "<mailto:linux-cifs+subscribe@vger.kernel.org>",
        "List-Unsubscribe": "<mailto:linux-cifs+unsubscribe@vger.kernel.org>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit"
    },
    "content": "Add a QUIC listener and connection transport for ksmbd on top of the\nshared server transport helpers. This wires in the QUIC transport file,\nadds the per-interface QUIC socket/kthread state, and enables QUIC\nlistener startup and teardown alongside the existing TCP path.\n\nAlso add the server-side QUIC port configuration and pass the client\npeer address through the existing tree connect management path for QUIC\nconnections.\n\nSigned-off-by: Henrique Carvalho <henrique.carvalho@suse.com>\n---\n fs/smb/server/Makefile         |   4 +-\n fs/smb/server/connection.c     |   1 +\n fs/smb/server/interface.c      |  30 ++-\n fs/smb/server/interface.h      |   2 +\n fs/smb/server/server.h         |   1 +\n fs/smb/server/smb2pdu.c        |   1 +\n fs/smb/server/transport_ipc.c  |   1 +\n fs/smb/server/transport_quic.c | 327 +++++++++++++++++++++++++++++++++\n fs/smb/server/transport_quic.h |  20 ++\n 9 files changed, 380 insertions(+), 7 deletions(-)\n create mode 100644 fs/smb/server/transport_quic.c\n create mode 100644 fs/smb/server/transport_quic.h",
    "diff": "diff --git a/fs/smb/server/Makefile b/fs/smb/server/Makefile\nindex 89a9955f607d..569be14b32d4 100644\n--- a/fs/smb/server/Makefile\n+++ b/fs/smb/server/Makefile\n@@ -8,8 +8,8 @@ ksmbd-y :=\tunicode.o auth.o vfs.o vfs_cache.o server.o ndr.o \\\n \t\tmisc.o oplock.o connection.o ksmbd_work.o crypto_ctx.o \\\n \t\tmgmt/ksmbd_ida.o mgmt/user_config.o mgmt/share_config.o \\\n \t\tmgmt/tree_connect.o mgmt/user_session.o smb_common.o \\\n-\t\ttransport.o transport_tcp.o transport_ipc.o interface.o \\\n-\t\tsmbacl.o smb2pdu.o \\\n+\t\ttransport.o transport_tcp.o transport_ipc.o transport_quic.o \\\n+\t\tinterface.o smbacl.o smb2pdu.o \\\n \t\tsmb2ops.o smb2misc.o ksmbd_spnego_negtokeninit.asn1.o \\\n \t\tksmbd_spnego_negtokentarg.asn1.o asn1.o\n \ndiff --git a/fs/smb/server/connection.c b/fs/smb/server/connection.c\nindex 07bbf4eb7b05..1db8e0a8b47d 100644\n--- a/fs/smb/server/connection.c\n+++ b/fs/smb/server/connection.c\n@@ -15,6 +15,7 @@\n #include \"interface.h\"\n #include \"transport.h\"\n #include \"transport_tcp.h\"\n+#include \"transport_quic.h\"\n #include \"transport_rdma.h\"\n #include \"misc.h\"\n \ndiff --git a/fs/smb/server/interface.c b/fs/smb/server/interface.c\nindex a5e59a420639..25b8e7f44059 100644\n--- a/fs/smb/server/interface.c\n+++ b/fs/smb/server/interface.c\n@@ -11,6 +11,7 @@\n #include \"auth.h\"\n #include \"connection.h\"\n #include \"transport_tcp.h\"\n+#include \"transport_quic.h\"\n #include \"interface.h\"\n \n static LIST_HEAD(iface_list);\n@@ -36,12 +37,14 @@ static struct interface *alloc_iface(char *ifname)\n }\n \n /**\n- * ksmbd_interface_run_kthread() - start a per-interface forker thread\n- * @iface:\tpointer to struct interface\n- * @kthread_fn:\tthread routine to run\n- * @suf:\tsuffix to append to the thread name (e.g. \"tcp\")\n+ * ksmbd_tcp_run_kthread() - start forker thread\n+ * @iface: pointer to struct interface\n  *\n- * Return:\tthe started task_struct, or ERR_PTR on failure.\n+ * start forker thread(ksmbd/0) at module init time to listen\n+ * on port 445 for new SMB connection requests. It creates per connection\n+ * server threads(ksmbd/x)\n+ *\n+ * Return:\t0 on success or error number\n  */\n struct task_struct *ksmbd_interface_run_kthread(struct interface *iface,\n \t\t\t\t\t\tint (*kthread_fn)(void *), const char *suf)\n@@ -87,6 +90,10 @@ static int ksmbd_netdev_event(struct notifier_block *nb, unsigned long event,\n \t\t\tret = ksmbd_tcp_create_socket(iface);\n \t\t\tif (ret)\n \t\t\t\tbreak;\n+\n+\t\t\tret = ksmbd_quic_create_socket(iface);\n+\t\t\tif (ret)\n+\t\t\t\tbreak;\n \t\t}\n \t\tif (!iface && bind_additional_ifaces) {\n \t\t\tiface = alloc_iface(kstrdup(netdev->name, KSMBD_DEFAULT_GFP));\n@@ -101,6 +108,10 @@ static int ksmbd_netdev_event(struct notifier_block *nb, unsigned long event,\n \t\t\tret = ksmbd_tcp_create_socket(iface);\n \t\t\tif (ret)\n \t\t\t\tbreak;\n+\n+\t\t\tret = ksmbd_quic_create_socket(iface);\n+\t\t\tif (ret)\n+\t\t\t\tbreak;\n \t\t}\n \t\tbreak;\n \tcase NETDEV_DOWN:\n@@ -111,15 +122,23 @@ static int ksmbd_netdev_event(struct notifier_block *nb, unsigned long event,\n \n \t\t\tif (iface->ksmbd_tcp_socket)\n \t\t\t\tkernel_sock_shutdown(iface->ksmbd_tcp_socket, SHUT_RDWR);\n+\t\t\tif (iface->ksmbd_quic_socket)\n+\t\t\t\tkernel_sock_shutdown(iface->ksmbd_quic_socket, SHUT_RDWR);\n \n \t\t\tif (iface->ksmbd_tcp_kthread)\n \t\t\t\tksmbd_interface_stop_kthread(iface->ksmbd_tcp_kthread);\n+\t\t\tif (iface->ksmbd_quic_kthread)\n+\t\t\t\tksmbd_interface_stop_kthread(iface->ksmbd_quic_kthread);\n \n \t\t\tif (iface->ksmbd_tcp_socket)\n \t\t\t\tsock_release(iface->ksmbd_tcp_socket);\n+\t\t\tif (iface->ksmbd_quic_socket)\n+\t\t\t\tsock_release(iface->ksmbd_quic_socket);\n \n \t\t\tiface->ksmbd_tcp_kthread = NULL;\n+\t\t\tiface->ksmbd_quic_kthread = NULL;\n \t\t\tiface->ksmbd_tcp_socket = NULL;\n+\t\t\tiface->ksmbd_quic_socket = NULL;\n \n \t\t\tput_net(iface->net);\n \t\t\tiface->net = NULL;\n@@ -194,3 +213,4 @@ int ksmbd_set_interfaces(char *ifc_list, int ifc_list_sz)\n \n \treturn 0;\n }\n+\ndiff --git a/fs/smb/server/interface.h b/fs/smb/server/interface.h\nindex 7e35645076a9..94ffb73fd635 100644\n--- a/fs/smb/server/interface.h\n+++ b/fs/smb/server/interface.h\n@@ -16,6 +16,8 @@\n struct interface {\n \tstruct task_struct\t*ksmbd_tcp_kthread;\n \tstruct socket\t\t*ksmbd_tcp_socket;\n+\tstruct task_struct\t*ksmbd_quic_kthread;\n+\tstruct socket\t\t*ksmbd_quic_socket;\n \tstruct list_head\tentry;\n \tchar\t\t\t*name;\n \tint\t\t\tstate;\ndiff --git a/fs/smb/server/server.h b/fs/smb/server/server.h\nindex b8a7317be86b..197d99264071 100644\n--- a/fs/smb/server/server.h\n+++ b/fs/smb/server/server.h\n@@ -35,6 +35,7 @@ struct ksmbd_server_config {\n \tshort\t\t\tmin_protocol;\n \tshort\t\t\tmax_protocol;\n \tunsigned short\t\ttcp_port;\n+\tunsigned short\t\tquic_port;\n \tunsigned short\t\tipc_timeout;\n \tunsigned long\t\tipc_last_active;\n \tunsigned long\t\tdeadtime;\ndiff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c\nindex 1f579ef0e9d6..6f82f6bd378a 100644\n--- a/fs/smb/server/smb2pdu.c\n+++ b/fs/smb/server/smb2pdu.c\n@@ -31,6 +31,7 @@\n \n #include \"server.h\"\n #include \"smb_common.h\"\n+#include \"interface.h\"\n #include \"../common/smb2status.h\"\n #include \"ksmbd_work.h\"\n #include \"mgmt/user_config.h\"\ndiff --git a/fs/smb/server/transport_ipc.c b/fs/smb/server/transport_ipc.c\nindex 6ccfb1cf8ed7..d14f282f3337 100644\n--- a/fs/smb/server/transport_ipc.c\n+++ b/fs/smb/server/transport_ipc.c\n@@ -315,6 +315,7 @@ static int ipc_server_config_on_startup(struct ksmbd_startup_request *req)\n \tserver_conf.flags = req->flags;\n \tserver_conf.signing = req->signing;\n \tserver_conf.tcp_port = req->tcp_port;\n+\tserver_conf.quic_port = 443; /* MS-SMB2 1.9 */\n \tserver_conf.ipc_timeout = req->ipc_timeout * HZ;\n \tif (check_mul_overflow(req->deadtime, SMB_ECHO_INTERVAL,\n \t\t\t\t\t&server_conf.deadtime)) {\ndiff --git a/fs/smb/server/transport_quic.c b/fs/smb/server/transport_quic.c\nnew file mode 100644\nindex 000000000000..84067225c1d3\n--- /dev/null\n+++ b/fs/smb/server/transport_quic.c\n@@ -0,0 +1,327 @@\n+// SPDX-License-Identifier: GPL-2.0-or-later\n+/*\n+ *   Copyright (C) 2026, SUSE LLC\n+ *\n+ *   Author: Henrique Carvalho <henrique.carvalho@suse.com>\n+ */\n+\n+#include <linux/freezer.h>\n+#include <linux/socket.h>\n+#include <linux/quic.h>\n+#include <linux/key.h>\n+#include <net/handshake.h>\n+#include <keys/asymmetric-type.h>\n+\n+#include \"smb_common.h\"\n+#include \"server.h\"\n+#include \"auth.h\"\n+#include \"connection.h\"\n+#include \"transport.h\"\n+#include \"glob.h\"\n+#include \"transport_quic.h\"\n+#include \"interface.h\"\n+\n+struct quic_transport {\n+\tstruct ksmbd_transport\t\ttransport;\n+\tstruct socket\t\t\t*sock;\n+};\n+\n+static const struct ksmbd_transport_ops ksmbd_quic_transport_ops;\n+\n+#define QUIC_TRANS(t)\t((struct quic_transport *)container_of(t, struct quic_transport, transport))\n+\n+static inline void ksmbd_quic_reuseaddr(struct socket *sock)\n+{\n+\tsock_set_reuseaddr(sock->sk);\n+}\n+\n+static void ksmbd_quic_disconnect(struct ksmbd_transport *kt)\n+{\n+\tstruct quic_transport *t = QUIC_TRANS(kt);\n+\n+\tkernel_sock_shutdown(t->sock, SHUT_RDWR);\n+\tksmbd_conn_free(KSMBD_TRANS(t)->conn);\n+\tif (server_conf.max_connections)\n+\t\tatomic_dec(&active_num_conn);\n+}\n+\n+static void ksmbd_quic_close_client_sk(struct socket *client_sk)\n+{\n+\tif (client_sk->file)\n+\t\tfput(client_sk->file);\n+\telse\n+\t\tsock_release(client_sk);\n+}\n+\n+static struct quic_transport *ksmbd_quic_alloc(void)\n+{\n+\tstruct quic_transport *t;\n+\n+\tt = kzalloc_obj(*t, KSMBD_DEFAULT_GFP);\n+\tif (!t)\n+\t\treturn NULL;\n+\n+\tKSMBD_TRANS(t)->ops = &ksmbd_quic_transport_ops;\n+\treturn t;\n+}\n+\n+static void ksmbd_quic_free(struct ksmbd_transport *kt)\n+{\n+\tstruct quic_transport *t = QUIC_TRANS(kt);\n+\n+\tksmbd_quic_close_client_sk(t->sock);\n+\tkfree(kt->io.iov); /* TODO (transport.c): move to ksmbd_conn_free */\n+\tkfree(t);\n+}\n+\n+/**\n+ * ksmbd_quic_new_connection() - create a new quic session on mount\n+ * @client_sk:\tsocket associated with new connection\n+ *\n+ * whenever a new connection is requested, create a conn thread\n+ * (session thread) to handle new incoming smb requests from the connection\n+ *\n+ * Return:\t0 on success, otherwise error\n+ */\n+static int ksmbd_quic_new_connection(struct socket *client_sk)\n+{\n+\tint rc;\n+\tstruct quic_transport *t;\n+\n+\tt = ksmbd_quic_alloc();\n+\tif (!t) {\n+\t\tksmbd_quic_close_client_sk(client_sk);\n+\t\treturn -ENOMEM;\n+\t}\n+\n+\tt->sock = client_sk;\n+\n+\trc = ksmbd_transport_alloc_conn(KSMBD_TRANS(t), client_sk);\n+\tif (rc) {\n+\t\tif (KSMBD_TRANS(t)->conn) {\n+\t\t\t/*\n+\t\t\t * conn was allocated and hashed but the handler\n+\t\t\t * thread failed; tear down via the conn refcount\n+\t\t\t * path which also calls ->free_transport().\n+\t\t\t */\n+\t\t\tksmbd_quic_disconnect(KSMBD_TRANS(t));\n+\t\t} else {\n+\t\t\tksmbd_quic_close_client_sk(client_sk);\n+\t\t\tkfree(t);\n+\t\t}\n+\t}\n+\n+\treturn rc;\n+}\n+\n+static void ksmbd_tls_done(void *data, int status, key_serial_t peerid)\n+{\n+\tstruct smb_tls *kstls = (struct smb_tls *)data;\n+\n+\tkstls->status = status;\n+\tkstls->peerid = peerid;\n+\n+\tcomplete(&kstls->handshake_done);\n+}\n+\n+static struct smb_tls *ksmbd_tls_init(void)\n+{\n+\tstruct smb_tls *kstls;\n+\tconst unsigned int timeout_ms = 5000;\n+\n+\tkstls = kzalloc_obj(*kstls, KSMBD_DEFAULT_GFP);\n+\tif (!kstls)\n+\t\treturn ERR_PTR(-ENOMEM);\n+\n+\tkstls->status = 0;\n+\n+\tkstls->args.ta_done = ksmbd_tls_done;\n+\tkstls->args.ta_data = kstls;\n+\tkstls->args.ta_timeout_ms = timeout_ms;\n+\n+\tinit_completion(&kstls->handshake_done);\n+\n+\treturn kstls;\n+}\n+\n+static void ksmbd_tls_reinit(struct smb_tls *kstls, struct socket *client_sk)\n+{\n+\tkstls->status = 0;\n+\tkstls->peerid = TLS_NO_PEERID;\n+\tkstls->args.ta_sock = client_sk;\n+\treinit_completion(&kstls->handshake_done);\n+}\n+\n+static void ksmbd_tls_free(struct smb_tls **kstls)\n+{\n+\tkfree_sensitive(*kstls);\n+\t*kstls = NULL;\n+}\n+\n+/**\n+ * ksmbd_quic_kthread_fn() - listen to new SMB QUIC connections and callback server\n+ * @p:\t\targuments to forker thread\n+ *\n+ * Return:\t0 on success, error number otherwise\n+ */\n+static int ksmbd_quic_kthread_fn(void *p)\n+{\n+\tstruct socket *client_sk = NULL;\n+\tstruct interface *iface = (struct interface *)p;\n+\tstruct smb_tls *ksmbd_tls;\n+\tint ret;\n+\n+\tksmbd_tls = ksmbd_tls_init();\n+\tif (IS_ERR(ksmbd_tls))\n+\t\treturn PTR_ERR(ksmbd_tls);\n+\n+\twhile (!kthread_should_stop()) {\n+\t\tstruct file *filp;\n+\n+\t\tif (!iface->ksmbd_quic_socket)\n+\t\t\tbreak;\n+\n+\t\tret = kernel_accept(iface->ksmbd_quic_socket, &client_sk, 0);\n+\t\tif (ret == -EINVAL)\n+\t\t\tbreak;\n+\t\tif (ret)\n+\t\t\tcontinue;\n+\n+\t\tret = quic_do_setsockopt(client_sk->sk,\n+\t\t\t\t\t QUIC_SOCKOPT_ALPN,\n+\t\t\t\t\t KERNEL_SOCKPTR(\"smb\"),\n+\t\t\t\t\t 3);\n+\t\tif (ret < 0) {\n+\t\t\tksmbd_debug(CONN, \"Failed to set QUIC_SOCKOPT_ALPN: %d\\n\", ret);\n+\t\t\tksmbd_quic_close_client_sk(client_sk);\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tfilp = sock_alloc_file(client_sk, 0, NULL);\n+\t\tif (IS_ERR(filp)) {\n+\t\t\tksmbd_debug(CONN, \"Socket file allocation failed: %ld\", PTR_ERR(filp));\n+\t\t\tksmbd_quic_close_client_sk(client_sk);\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tksmbd_tls_reinit(ksmbd_tls, client_sk);\n+\n+\t\tret = tls_server_hello_x509(&ksmbd_tls->args, KSMBD_DEFAULT_GFP);\n+\t\tif (ret < 0) {\n+\t\t\tksmbd_debug(CONN, \"Handshake failed: %d\", ret);\n+\t\t\tksmbd_quic_close_client_sk(client_sk);\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tret = wait_for_completion_interruptible(&ksmbd_tls->handshake_done);\n+\t\tif (ret < 0) {\n+\t\t\ttls_handshake_cancel(client_sk->sk);\n+\t\t\tksmbd_quic_close_client_sk(client_sk);\n+\t\t\tksmbd_debug(CONN, \"Handshake failed: %d\", ret);\n+\t\t\tcontinue;\n+\t\t}\n+\t\tif (ksmbd_tls->status) {\n+\t\t\tksmbd_quic_close_client_sk(client_sk);\n+\t\t\tksmbd_debug(CONN, \"Handshake failed: %d\", ksmbd_tls->status);\n+\t\t\tcontinue;\n+\t\t}\n+\t\tksmbd_debug(CONN, \"Handshake successful\");\n+\n+\t\tif (ksmbd_check_max_ip_conns(client_sk)) {\n+\t\t\tksmbd_quic_close_client_sk(client_sk);\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tif (ksmbd_check_max_conns()) {\n+\t\t\tksmbd_quic_close_client_sk(client_sk);\n+\t\t\tcontinue;\n+\t\t}\n+\n+\t\tksmbd_debug(CONN, \"connect success: accepted new connection\\n\");\n+\t\tclient_sk->sk->sk_rcvtimeo = KSMBD_QUIC_RECV_TIMEOUT;\n+\t\tclient_sk->sk->sk_sndtimeo = KSMBD_QUIC_SEND_TIMEOUT;\n+\n+\t\tksmbd_quic_new_connection(client_sk);\n+\t}\n+\n+\tksmbd_tls_free(&ksmbd_tls);\n+\n+\tksmbd_debug(CONN, \"releasing socket\\n\");\n+\treturn 0;\n+}\n+\n+/**\n+ * ksmbd_quic_read() - read data from socket in given buffer\n+ * @t:\t\ttransport instance\n+ * @buf:\tbuffer to store read data from socket\n+ * @to_read:\tnumber of bytes to read from socket\n+ * @max_retries: number of retries if reading from socket fails\n+ *\n+ * Return:\ton success return number of bytes read from socket,\n+ *\t\totherwise return error number\n+ */\n+static int ksmbd_quic_readv(struct ksmbd_transport *t, char *buf,\n+\t\t\t   unsigned int to_read, int max_retries)\n+{\n+\tstruct kvec iov;\n+\n+\tiov.iov_base = buf;\n+\tiov.iov_len = to_read;\n+\n+\treturn ksmbd_readv(t, QUIC_TRANS(t)->sock, &iov, 1, to_read, max_retries);\n+}\n+\n+static int ksmbd_quic_writev(struct ksmbd_transport *t, struct kvec *iov,\n+\t\t\t    int nvecs, int size, bool need_invalidate,\n+\t\t\t    unsigned int remote_key)\n+\n+{\n+\tint err = -EOPNOTSUPP;\n+#if IS_ENABLED(CONFIG_IP_QUIC)\n+\tstruct msghdr ksmbd_msg = {.msg_flags = MSG_NOSIGNAL};\n+\n+\terr = kernel_sendmsg(QUIC_TRANS(t)->sock, &ksmbd_msg, iov, nvecs, size);\n+#endif\n+\treturn err;\n+}\n+\n+void ksmbd_quic_destroy_socket(struct socket *ksmbd_socket)\n+{\n+\tksmbd_destroy_socket(ksmbd_socket);\n+}\n+\n+int ksmbd_quic_create_socket(struct interface *iface)\n+{\n+#if IS_ENABLED(CONFIG_IP_QUIC)\n+\tstruct task_struct *kthread;\n+\tstruct socket *ksmbd_socket;\n+\tint ret;\n+\n+\tksmbd_socket = ksmbd_create_socket(iface, SOCK_DGRAM, IPPROTO_QUIC,\n+\t\t\t\t\t   server_conf.quic_port);\n+\tif (IS_ERR(ksmbd_socket))\n+\t\treturn PTR_ERR(ksmbd_socket);\n+\n+\tksmbd_quic_reuseaddr(ksmbd_socket);\n+\n+\tkthread = ksmbd_interface_run_kthread(iface, ksmbd_quic_kthread_fn, \"quic\");\n+\tif (IS_ERR(kthread)) {\n+\t\tret = PTR_ERR(kthread);\n+\t\tpr_err(\"Can't start ksmbd main kthread for quic: %d\\n\", ret);\n+\t\tksmbd_destroy_socket(ksmbd_socket);\n+\t\treturn ret;\n+\t}\n+\n+\tiface->ksmbd_quic_socket  = ksmbd_socket;\n+\tiface->ksmbd_quic_kthread = kthread;\n+\tiface->state = IFACE_STATE_CONFIGURED;\n+#endif /* CONFIG_IP_QUIC */\n+\treturn 0;\n+}\n+\n+static const struct ksmbd_transport_ops ksmbd_quic_transport_ops = {\n+\t.read\t\t= ksmbd_quic_readv,\n+\t.writev\t\t= ksmbd_quic_writev,\n+\t.disconnect\t= ksmbd_quic_disconnect,\n+\t.free_transport = ksmbd_quic_free,\n+};\ndiff --git a/fs/smb/server/transport_quic.h b/fs/smb/server/transport_quic.h\nnew file mode 100644\nindex 000000000000..5c62c45affc4\n--- /dev/null\n+++ b/fs/smb/server/transport_quic.h\n@@ -0,0 +1,20 @@\n+/* SPDX-License-Identifier: GPL-2.0-or-later */\n+/*\n+ *   Copyright (C) 2026, SUSE LLC.\n+ */\n+\n+#ifndef __KSMBD_TRANSPORT_QUIC_H__\n+#define __KSMBD_TRANSPORT_QUIC_H__\n+\n+#include \"interface.h\"\n+\n+#define KSMBD_QUIC_RECV_TIMEOUT\t(7 * HZ)\n+#define KSMBD_QUIC_SEND_TIMEOUT\t(5 * HZ)\n+\n+int ksmbd_quic_init(void);\n+void ksmbd_quic_destroy(void);\n+int ksmbd_quic_create_socket(struct interface *iface);\n+void ksmbd_quic_destroy_socket(struct socket *ksmbd_socket);\n+void ksmbd_quic_stop_kthread(struct task_struct *kthread);\n+\n+#endif /* __KSMBD_TRANSPORT_QUIC_H__ */\n",
    "prefixes": [
        "v2",
        "08/11"
    ]
}