From nobody Mon Jun 8 19:53:50 2026 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A16093B4E8C for ; Wed, 27 May 2026 07:35:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779867359; cv=none; b=pzo50b4rKSFjyZOO29a8d7Gsdot+B1XjpUf77p4nVSHnTQKXoGWgdaJYXXQgVUD33okKcZ/o8W43icfheOVmZQLSn+3Os+ImAM/Qtj2xzMC8k7A/J/b68hH+gdc8SrljY1D/Fz6gBtZE2JHVi+ryT2JgpL6sCsLeFfIFxMGTzN0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779867359; c=relaxed/simple; bh=95HnHOyqOINvjhWLLDfxwBPhBQcWUvKy0U1swjgf3TA=; h=From:To:Cc:Subject:Date:Message-ID:MIME-Version; b=BBRhgyZiWLV5h3tfum8hhCI0lXRfye1KUQ7cyIp0sODkFOVos/r7+p3jR+duFamkVVNvc1FslVwSo7rV4AXwbEOgQtkIjmpthuMCnphHLUPnJPaY26PMVFuq8YcTLHhafEIWlpMqga6uOLAMZK4RrRR6cEfByJ+FvLSmG5vVuKY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=gZfLdWNX; arc=none smtp.client-ip=209.85.221.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="gZfLdWNX" Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-44dd5cb0f81so8062980f8f.0 for ; Wed, 27 May 2026 00:35:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779867356; x=1780472156; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=upSidzI1HiHWnTdIHNUKK7ENeiQ5Ygw4Xf7ujn3gz7Q=; b=gZfLdWNXdllJeUJtjWS3k+0bQqlJvLQtw93dtVl5IzA/EpPQP1u1lJwbuCSNGJ0wCh uyt7umpoOTqs1NFfB9Z5Ncgq6Sz1/JwIAcryMXPNIohwoWeFjAnwJypZvW/6alL2o8gQ 8svdNuyfZIXxgJurg/qyD+ezZ++i9lprk32MyRym6fqpDHP6wcHc77GP9N36djTVxuV9 /ogrJs1/LzwD/5XxM6y5/HMyvKHqSgd+PD/pRszjuqkfIotWvj5gWkw69KsrRYz6z4Ns e5ri1pPWinNjSsTInMzAB6cHlnGAKKgS5YMRT3BTwfmkRfKMAU8ramhV3x4fMKo8dEYK Mz9w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779867356; x=1780472156; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=upSidzI1HiHWnTdIHNUKK7ENeiQ5Ygw4Xf7ujn3gz7Q=; b=NfA3Isp/XIUMeC0muS0qVOHk6gvBOkt56cgMtn4j9Wrdy/Q6U8/kVdDNLi7dEo5iv5 m5eGj3tPHnZ1LKEaV3oXU3BC1xEdekBmTfM4dIRpJUQaoCZJOXZMhizEE5kn+SNKs6WM 7+2A5bqPgg/nhRXjqrVxBbjqHWx82hoX5Iq6+EXZwiYaxvEVz8EXhH4GU9ywCbtpcxqW 1olfDNxxQelpr2cvYEob5SdjxiRSqSzJDg5yJ0zdzmaw3wyygpxev7zw9/WEqIjwaXMe seM3CpH2Np3m904RfxoH4VATBea/qVis6Vdyem8rxq9R7opHQfUbgWVB09Inhbsc0G1/ i3XQ== X-Forwarded-Encrypted: i=1; AFNElJ/E2sajvi42aF98yNVQbe9vG6W5D38JWyto0p7/S+D/ofdBz/8ApuBUwUu+8vZV6Dur5UVCpPvP2mhY+8M=@vger.kernel.org X-Gm-Message-State: AOJu0YxOJEQ89tBhJX49zix8/qrtKs814Ykju0nsMaAu/TVYUYrczIjc PAZIdqIwf5zDsxNeWJaN7U2E+qDqNxiogxf+BF7+7zEmD/F8mGQVnKol X-Gm-Gg: Acq92OEYiYwjUTPiPmXkiySzAgitNY9+b4yhhx/w9amu9vCppgUzQ9/5ej8SbTLUb47 q0iEUo4XAfnkHeOPRk1AnwolAh8VFH046VOc8R8Gd+79m7QMNo8ec8dvjgbt752HKS2Phompuwv dilqGWanp4jWCn5Jt/I/r/H5411+oI51fKI02IGaB1EHKO8fYgXvpWE8r3Z3/Cf7Mf6sqX2ut6H NR3iO/DECGOow8l22ElUq1BETMuXYdpVdkl7kfwJF4dD8cyJGTrl3ANZPH0CIRvM8gy94n/uRvh GVSjV5Nxe0dT8UVeZ07MIXkTeayg47bxmvkmh/THiPRjcECZ92lt5PwcVZd8QhVxjV5KKu5Ejc0 y4zH4WKP+XZBrOapfL6uSjeh2Zkc6eTQUeDBgdbADSvlXsyiEtnmR6vhsLdjD3j4VZqEiIb+Ggt COyx7tS5t49F9Q7pQ+iIvg4zRZkUlW7NmUuOFxNfXNYOCHcW5tWIZmyC+CkPy2tYTCfI02A+BZs MjGje1uHteBtJN55sSdVmYxJLFgywBiV3OvSFUNGA== X-Received: by 2002:a05:6000:18af:b0:45e:9304:a4c3 with SMTP id ffacd0b85a97d-45eb333aa31mr32344076f8f.19.1779867355828; Wed, 27 May 2026 00:35:55 -0700 (PDT) Received: from localhost.localdomain (85-193-33-119.rib.o2.cz. [85.193.33.119]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-45edb558449sm3783408f8f.13.2026.05.27.00.35.54 (version=TLS1_3 cipher=TLS_CHACHA20_POLY1305_SHA256 bits=256/256); Wed, 27 May 2026 00:35:55 -0700 (PDT) From: skvarlamatus@gmail.com To: ericvh@kernel.org, lucho@ionkov.net, asmadeus@codewreck.org, linux_oss@crudebyte.com Cc: v9fs@lists.linux.dev, linux-kernel@vger.kernel.org, Matus Skvarla Subject: [PATCH] net/9p: add vsock transport Date: Wed, 27 May 2026 09:34:47 +0200 Message-ID: <20260527073447.86538-1-skvarlamatus@gmail.com> X-Mailer: git-send-email 2.47.1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Matus Skvarla Add vsock as a transport option for 9P client connections. This allows mounting 9P filesystems over VM sockets without requiring TCP/IP networking or additional userspace tools. The implementation extends trans_fd.c with vsock support, reusing the existing socket infrastructure. A new p9_fd_create_vsock() function handles vsock connection setup by parsing the CID from the mount source, creating an AF_VSOCK socket, and connecting to the specified endpoint. All other transport operations (close, request, cancel) use the shared fd transport implementation. Add CONFIG_NET_9P_VSOCK option that conditionally compiles vsock support into 9pnet_fd.ko. This follows the pattern where socket-based transports (TCP, Unix, vsock) share trans_fd.c, while specialized hardware transports (virtio, xen, rdma) have dedicated files. Usage: mount -t 9p -o trans=3Dvsock[,port=3D] /mnt/point Signed-off-by: Matus Skvarla --- include/net/9p/client.h | 6 ++- net/9p/Kconfig | 9 +++++ net/9p/trans_fd.c | 89 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+), 1 deletion(-) diff --git a/include/net/9p/client.h b/include/net/9p/client.h index 838a94218b59..4eb2f6b22496 100644 --- a/include/net/9p/client.h +++ b/include/net/9p/client.h @@ -122,8 +122,12 @@ struct p9_client { struct { u16 port; bool privport; - } tcp; +#if IS_ENABLED(CONFIG_NET_9P_VSOCK) + struct { + u16 port; + } vsock; +#endif } trans_opts; =20 struct idr fids; diff --git a/net/9p/Kconfig b/net/9p/Kconfig index 22f8c167845d..63a5b5b25063 100644 --- a/net/9p/Kconfig +++ b/net/9p/Kconfig @@ -32,6 +32,15 @@ config NET_9P_VIRTIO This builds support for a transports between guest partitions and a host partition. =20 +config NET_9P_VSOCK + depends on VSOCKETS + bool "9P VSOCK Transport" + help + This builds support for a transport for 9pfs over + virtual sockets (vsock). This is useful for communication + between virtual machines and their host without requiring + TCP/IP networking configuration or additional userspace software. + config NET_9P_XEN depends on XEN select XEN_XENBUS_FRONTEND diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c index dbad3213ba84..6f35f2d84313 100644 --- a/net/9p/trans_fd.c +++ b/net/9p/trans_fd.c @@ -28,6 +28,9 @@ #include #include #include +#if IS_ENABLED(CONFIG_NET_9P_VSOCK) +#include +#endif =20 #include /* killme */ =20 @@ -36,6 +39,9 @@ =20 static struct p9_trans_module p9_tcp_trans; static struct p9_trans_module p9_fd_trans; +#if IS_ENABLED(CONFIG_NET_9P_VSOCK) +static struct p9_trans_module p9_vsock_trans; +#endif =20 enum { Rworksched =3D 1, /* read work scheduled or running */ @@ -714,6 +720,12 @@ static int p9_fd_show_options(struct seq_file *m, stru= ct p9_client *clnt) if (clnt->trans_opts.fd.wfd !=3D ~0) seq_printf(m, ",wfd=3D%u", clnt->trans_opts.fd.wfd); } +#if IS_ENABLED(CONFIG_NET_9P_VSOCK) + else if (clnt->trans_mod =3D=3D &p9_vsock_trans) { + if (clnt->trans_opts.vsock.port !=3D P9_FD_PORT) + seq_printf(m, ",port=3D%u", clnt->trans_opts.vsock.port); + } +#endif return 0; } =20 @@ -968,6 +980,60 @@ p9_fd_create_unix(struct p9_client *client, struct fs_= context *fc) return p9_socket_open(client, csocket); } =20 +#if IS_ENABLED(CONFIG_NET_9P_VSOCK) +static int +p9_fd_create_vsock(struct p9_client *client, struct fs_context *fc) +{ + const char *addr =3D fc->source; + struct v9fs_context *ctx =3D fc->fs_private; + int err; + struct socket *csocket; + struct sockaddr_vm addr_vm =3D { 0 }; + struct p9_fd_opts opts; + unsigned int cid; + + /* opts are already parsed in context */ + opts =3D ctx->fd_opts; + + if (!addr) + return -EINVAL; + + err =3D kstrtouint(addr, 10, &cid); + if (err < 0) { + pr_err("%s (%d): invalid CID: %s\n", + __func__, task_pid_nr(current), addr); + return err; + } + + csocket =3D NULL; + + client->trans_opts.vsock.port =3D opts.port; + err =3D __sock_create(current->nsproxy->net_ns, AF_VSOCK, + SOCK_STREAM, 0, &csocket, 1); + if (err) { + pr_err("%s (%d): problem creating socket\n", + __func__, task_pid_nr(current)); + return err; + } + + addr_vm.svm_family =3D AF_VSOCK; + addr_vm.svm_port =3D opts.port; + addr_vm.svm_cid =3D cid; + + err =3D READ_ONCE(csocket->ops)->connect(csocket, + (struct sockaddr_unsized *)&addr_vm, + sizeof(addr_vm), 0); + if (err < 0) { + pr_err("%s (%d): problem connecting socket to %s:%u\n", + __func__, task_pid_nr(current), addr, opts.port); + sock_release(csocket); + return err; + } + + return p9_socket_open(client, csocket); +} +#endif /* CONFIG_NET_9P_VSOCK */ + static int p9_fd_create(struct p9_client *client, struct fs_context *fc) { @@ -1038,6 +1104,23 @@ static struct p9_trans_module p9_fd_trans =3D { }; MODULE_ALIAS_9P("fd"); =20 +#if IS_ENABLED(CONFIG_NET_9P_VSOCK) +static struct p9_trans_module p9_vsock_trans =3D { + .name =3D "vsock", + .maxsize =3D MAX_SOCK_BUF, + .def =3D false, + .supports_vmalloc =3D true, + .create =3D p9_fd_create_vsock, + .close =3D p9_fd_close, + .request =3D p9_fd_request, + .cancel =3D p9_fd_cancel, + .cancelled =3D p9_fd_cancelled, + .show_options =3D p9_fd_show_options, + .owner =3D THIS_MODULE, +}; +MODULE_ALIAS_9P("vsock"); +#endif + /** * p9_poll_workfn - poll worker thread * @work: work queue @@ -1075,6 +1158,9 @@ static int __init p9_trans_fd_init(void) v9fs_register_trans(&p9_tcp_trans); v9fs_register_trans(&p9_unix_trans); v9fs_register_trans(&p9_fd_trans); +#if IS_ENABLED(CONFIG_NET_9P_VSOCK) + v9fs_register_trans(&p9_vsock_trans); +#endif =20 return 0; } @@ -1085,6 +1171,9 @@ static void __exit p9_trans_fd_exit(void) v9fs_unregister_trans(&p9_tcp_trans); v9fs_unregister_trans(&p9_unix_trans); v9fs_unregister_trans(&p9_fd_trans); +#if IS_ENABLED(CONFIG_NET_9P_VSOCK) + v9fs_unregister_trans(&p9_vsock_trans); +#endif } =20 module_init(p9_trans_fd_init); --=20 2.47.1