* [PATCH RFC 01/41] loop: refuse backing files that aren't open for reading
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 12:53 ` Jan Kara
2026-11-10 9:14 ` [PATCH RFC 02/41] nvmet: check that the file backend supports ->{read,write}_iter Christian Brauner
` (39 subsequent siblings)
40 siblings, 1 reply; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable),
stable
loop_configure() takes any file as long as it implements ->read_iter().
Loop itself never checked whether the file was actually opened for
reading. Buffered I/O went through vfs_iter_read() which refuses files
without FMODE_READ. Direct I/O has called ->read_iter() of the backing
file directly ever since loop grew support for it.
Since commit f2fed441c69b ("loop: stop using vfs_iter_{read,write} for
buffered I/O") buffered I/O calls ->read_iter() directly as well. That
commit was about O_DIRECT handling and the FMODE_READ check went away
as a side effect.
So whoever can set up a loop device can read a file it was only allowed
to open for writing. Open the file O_WRONLY, configure a loop device
with it and read the contents through the loop device.
Refuse backing files that aren't open for reading. Loop always reads
from its backing file so a write-only backing file never made sense in
the first place.
Fixes: bc07c10a3603 ("block: loop: support DIO & AIO")
Fixes: f2fed441c69b ("loop: stop using vfs_iter_{read,write} for buffered I/O")
Cc: stable@vger.kernel.org
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
drivers/block/loop.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index a3325ceab484..c96e35c3ef42 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -528,6 +528,9 @@ static void loop_assign_backing_file(struct loop_device *lo, struct file *file)
static int loop_check_backing_file(struct file *file)
{
+ if (!(file->f_mode & FMODE_READ))
+ return -EBADF;
+
if (!file->f_op->read_iter)
return -EINVAL;
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* Re: [PATCH RFC 01/41] loop: refuse backing files that aren't open for reading
2026-11-10 9:14 ` [PATCH RFC 01/41] loop: refuse backing files that aren't open for reading Christian Brauner
@ 2026-11-10 12:53 ` Jan Kara
0 siblings, 0 replies; 59+ messages in thread
From: Jan Kara @ 2026-11-10 12:53 UTC (permalink / raw)
To: Christian Brauner
Cc: linux-fsdevel, Jann Horn, Chris Mason, Josef Bacik,
Christoph Hellwig, linux-block, linux-kernel, linux-nvme,
Alexander Viro, Jan Kara, linux-scsi, target-devel, driver-core,
linux-mm, bpf, linux-security-module, selinux, apparmor,
linux-nfs, netdev, fuse-devel, linux-efi, xen-devel, ocfs2-devel,
linux-s390, linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, stable
On Tue 10-11-26 10:14:17, Christian Brauner wrote:
> loop_configure() takes any file as long as it implements ->read_iter().
> Loop itself never checked whether the file was actually opened for
> reading. Buffered I/O went through vfs_iter_read() which refuses files
> without FMODE_READ. Direct I/O has called ->read_iter() of the backing
> file directly ever since loop grew support for it.
>
> Since commit f2fed441c69b ("loop: stop using vfs_iter_{read,write} for
> buffered I/O") buffered I/O calls ->read_iter() directly as well. That
> commit was about O_DIRECT handling and the FMODE_READ check went away
> as a side effect.
>
> So whoever can set up a loop device can read a file it was only allowed
> to open for writing. Open the file O_WRONLY, configure a loop device
> with it and read the contents through the loop device.
>
> Refuse backing files that aren't open for reading. Loop always reads
> from its backing file so a write-only backing file never made sense in
> the first place.
>
> Fixes: bc07c10a3603 ("block: loop: support DIO & AIO")
> Fixes: f2fed441c69b ("loop: stop using vfs_iter_{read,write} for buffered I/O")
> Cc: stable@vger.kernel.org
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Looks good. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> drivers/block/loop.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/block/loop.c b/drivers/block/loop.c
> index a3325ceab484..c96e35c3ef42 100644
> --- a/drivers/block/loop.c
> +++ b/drivers/block/loop.c
> @@ -528,6 +528,9 @@ static void loop_assign_backing_file(struct loop_device *lo, struct file *file)
>
> static int loop_check_backing_file(struct file *file)
> {
> + if (!(file->f_mode & FMODE_READ))
> + return -EBADF;
> +
> if (!file->f_op->read_iter)
> return -EINVAL;
>
>
> --
> 2.53.0
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 59+ messages in thread
* [PATCH RFC 02/41] nvmet: check that the file backend supports ->{read,write}_iter
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 01/41] loop: refuse backing files that aren't open for reading Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 12:53 ` Jan Kara
2026-11-10 9:14 ` [PATCH RFC 03/41] target: fileio: check that the backing file " Christian Brauner
` (38 subsequent siblings)
40 siblings, 1 reply; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
The file backend calls ->read_iter() and ->write_iter() of the backing
file directly but never checks that they exist. Everything that isn't a
block device ends up in the file backend. So a namespace pointing to a
file without them calls a NULL pointer on its first I/O. Only
buffered_io=1 gets that far as the O_DIRECT open fails for such files.
Refuse them when the namespace is enabled the same way zloop does since
commit 0c10f8a1a7ae ("zloop: check that the zone backing file support
->{read,write}_iter").
Fixes: d5eff33ee6f8 ("nvmet: add simple file backed ns support")
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
drivers/nvme/target/io-cmd-file.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/nvme/target/io-cmd-file.c b/drivers/nvme/target/io-cmd-file.c
index 695963dd932e..dfa8aa46188c 100644
--- a/drivers/nvme/target/io-cmd-file.c
+++ b/drivers/nvme/target/io-cmd-file.c
@@ -47,6 +47,11 @@ int nvmet_file_ns_enable(struct nvmet_ns *ns)
return ret;
}
+ if (!ns->file->f_op->read_iter || !ns->file->f_op->write_iter) {
+ ret = -EINVAL;
+ goto err;
+ }
+
nvmet_file_ns_revalidate(ns);
/*
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* Re: [PATCH RFC 02/41] nvmet: check that the file backend supports ->{read,write}_iter
2026-11-10 9:14 ` [PATCH RFC 02/41] nvmet: check that the file backend supports ->{read,write}_iter Christian Brauner
@ 2026-11-10 12:53 ` Jan Kara
0 siblings, 0 replies; 59+ messages in thread
From: Jan Kara @ 2026-11-10 12:53 UTC (permalink / raw)
To: Christian Brauner
Cc: linux-fsdevel, Jann Horn, Chris Mason, Josef Bacik,
Christoph Hellwig, linux-block, linux-kernel, linux-nvme,
Alexander Viro, Jan Kara, linux-scsi, target-devel, driver-core,
linux-mm, bpf, linux-security-module, selinux, apparmor,
linux-nfs, netdev, fuse-devel, linux-efi, xen-devel, ocfs2-devel,
linux-s390, linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest
On Tue 10-11-26 10:14:18, Christian Brauner wrote:
> The file backend calls ->read_iter() and ->write_iter() of the backing
> file directly but never checks that they exist. Everything that isn't a
> block device ends up in the file backend. So a namespace pointing to a
> file without them calls a NULL pointer on its first I/O. Only
> buffered_io=1 gets that far as the O_DIRECT open fails for such files.
>
> Refuse them when the namespace is enabled the same way zloop does since
> commit 0c10f8a1a7ae ("zloop: check that the zone backing file support
> ->{read,write}_iter").
>
> Fixes: d5eff33ee6f8 ("nvmet: add simple file backed ns support")
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Looks good. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> drivers/nvme/target/io-cmd-file.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/drivers/nvme/target/io-cmd-file.c b/drivers/nvme/target/io-cmd-file.c
> index 695963dd932e..dfa8aa46188c 100644
> --- a/drivers/nvme/target/io-cmd-file.c
> +++ b/drivers/nvme/target/io-cmd-file.c
> @@ -47,6 +47,11 @@ int nvmet_file_ns_enable(struct nvmet_ns *ns)
> return ret;
> }
>
> + if (!ns->file->f_op->read_iter || !ns->file->f_op->write_iter) {
> + ret = -EINVAL;
> + goto err;
> + }
> +
> nvmet_file_ns_revalidate(ns);
>
> /*
>
> --
> 2.53.0
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 59+ messages in thread
* [PATCH RFC 03/41] target: fileio: check that the backing file supports ->{read,write}_iter
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 01/41] loop: refuse backing files that aren't open for reading Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 02/41] nvmet: check that the file backend supports ->{read,write}_iter Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 12:54 ` Jan Kara
2026-11-10 9:14 ` [PATCH RFC 04/41] fs: add SB_I_PSEUDO Christian Brauner
` (37 subsequent siblings)
40 siblings, 1 reply; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
With fd_async_io=1 the fileio backend calls ->read_iter() and
->write_iter() of the backing file directly. The synchronous path goes
through vfs_iter_read() and vfs_iter_write() which check for them but
the aio path doesn't. So a backing file without them calls a NULL
pointer on its first I/O.
Refuse such files when configuring the device. On the synchronous path
every read or write that needed the missing method failed with EINVAL
anyway.
Fixes: 769031c92c8b ("scsi: target: target/file: Add support of direct and async I/O")
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
drivers/target/target_core_file.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c
index ab9824a4852f..a5391e57e9aa 100644
--- a/drivers/target/target_core_file.c
+++ b/drivers/target/target_core_file.c
@@ -144,6 +144,14 @@ static int fd_configure_device(struct se_device *dev)
goto fail;
}
fd_dev->fd_file = file;
+
+ if (!file->f_op->read_iter || !file->f_op->write_iter) {
+ pr_err("FILEIO: %s lacks ->read_iter or ->write_iter\n",
+ fd_dev->fd_dev_name);
+ ret = -EINVAL;
+ goto fail;
+ }
+
/*
* If using a block backend with this struct file, we extract
* fd_dev->fd_[block,dev]_size from struct block_device.
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* Re: [PATCH RFC 03/41] target: fileio: check that the backing file supports ->{read,write}_iter
2026-11-10 9:14 ` [PATCH RFC 03/41] target: fileio: check that the backing file " Christian Brauner
@ 2026-11-10 12:54 ` Jan Kara
0 siblings, 0 replies; 59+ messages in thread
From: Jan Kara @ 2026-11-10 12:54 UTC (permalink / raw)
To: Christian Brauner
Cc: linux-fsdevel, Jann Horn, Chris Mason, Josef Bacik,
Christoph Hellwig, linux-block, linux-kernel, linux-nvme,
Alexander Viro, Jan Kara, linux-scsi, target-devel, driver-core,
linux-mm, bpf, linux-security-module, selinux, apparmor,
linux-nfs, netdev, fuse-devel, linux-efi, xen-devel, ocfs2-devel,
linux-s390, linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest
On Tue 10-11-26 10:14:19, Christian Brauner wrote:
> With fd_async_io=1 the fileio backend calls ->read_iter() and
> ->write_iter() of the backing file directly. The synchronous path goes
> through vfs_iter_read() and vfs_iter_write() which check for them but
> the aio path doesn't. So a backing file without them calls a NULL
> pointer on its first I/O.
>
> Refuse such files when configuring the device. On the synchronous path
> every read or write that needed the missing method failed with EINVAL
> anyway.
>
> Fixes: 769031c92c8b ("scsi: target: target/file: Add support of direct and async I/O")
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Looks good. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> drivers/target/target_core_file.c | 8 ++++++++
> 1 file changed, 8 insertions(+)
>
> diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c
> index ab9824a4852f..a5391e57e9aa 100644
> --- a/drivers/target/target_core_file.c
> +++ b/drivers/target/target_core_file.c
> @@ -144,6 +144,14 @@ static int fd_configure_device(struct se_device *dev)
> goto fail;
> }
> fd_dev->fd_file = file;
> +
> + if (!file->f_op->read_iter || !file->f_op->write_iter) {
> + pr_err("FILEIO: %s lacks ->read_iter or ->write_iter\n",
> + fd_dev->fd_dev_name);
> + ret = -EINVAL;
> + goto fail;
> + }
> +
> /*
> * If using a block backend with this struct file, we extract
> * fd_dev->fd_[block,dev]_size from struct block_device.
>
> --
> 2.53.0
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 59+ messages in thread
* [PATCH RFC 04/41] fs: add SB_I_PSEUDO
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (2 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 03/41] target: fileio: check that the backing file " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 12:55 ` Jan Kara
2026-11-10 9:14 ` [PATCH RFC 05/41] kernfs: use fc_init_pseudo() Christian Brauner
` (36 subsequent siblings)
40 siblings, 1 reply; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Currently, there's no way to tell whether the files of a filesystem
store data or whether they are kernel interfaces. Files on pseudo
filesystems such as procfs or sysfs generate their contents when they're
read and writes to them are commands to the kernel.
But a few places in the kernel take an arbitrary file and use it as
storage: loop, zloop, the nvme target's file backend, the scsi target's
fileio backend, fuse passthrough, the usb mass storage gadget and erofs
file-backed mounts. At most they check the file type and whether the
file implements ->read_iter() and ->write_iter(). That's not enough.
kernfs provides both for every sysfs attribute for example.
Add SB_I_PSEUDO so a filesystem can state that its regular files are
kernel interfaces and must not be used as storage.
Pseudo filesystems also never hold executables or device nodes. But
currently each of them decides on its own whether to raise SB_I_NOEXEC
and SB_I_NODEV. Some do, most don't. Add fc_init_pseudo() as the common
initialization point for all pseudo filesystems that raises all three
flags and switch init_pseudo() over to it. The following patches
convert the mountable pseudo filesystems.
Nothing checks SB_I_PSEUDO yet so no functional changes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/libfs.c | 2 +-
include/linux/fs/super_types.h | 1 +
include/linux/pseudo_fs.h | 11 +++++++++++
3 files changed, 13 insertions(+), 1 deletion(-)
diff --git a/fs/libfs.c b/fs/libfs.c
index 96a6e9b1535f..8c8789489fdf 100644
--- a/fs/libfs.c
+++ b/fs/libfs.c
@@ -735,7 +735,7 @@ struct pseudo_fs_context *init_pseudo(struct fs_context *fc,
fc->fs_private = ctx;
fc->ops = &pseudo_fs_context_ops;
fc->sb_flags |= SB_NOUSER;
- fc->s_iflags |= SB_I_NOEXEC | SB_I_NODEV;
+ fc_init_pseudo(fc);
fc->global = true;
}
return ctx;
diff --git a/include/linux/fs/super_types.h b/include/linux/fs/super_types.h
index 72f4288e16c5..472200bdf081 100644
--- a/include/linux/fs/super_types.h
+++ b/include/linux/fs/super_types.h
@@ -359,5 +359,6 @@ struct super_block {
#define SB_I_NOIDMAP 0x00002000 /* No idmapped mounts on this superblock */
#define SB_I_ALLOW_HSM 0x00004000 /* Allow HSM events on this superblock */
#define SB_I_NO_DATA_INTEGRITY 0x00008000 /* fs cannot guarantee data persistence on sync */
+#define SB_I_PSEUDO 0x00010000 /* regular files are kernel interfaces, not storage */
#endif /* _LINUX_FS_SUPER_TYPES_H */
diff --git a/include/linux/pseudo_fs.h b/include/linux/pseudo_fs.h
index a651e60d9410..0ca408aa60af 100644
--- a/include/linux/pseudo_fs.h
+++ b/include/linux/pseudo_fs.h
@@ -2,6 +2,7 @@
#define __LINUX_PSEUDO_FS__
#include <linux/fs_context.h>
+#include <linux/fs/super_types.h>
struct pseudo_fs_context {
const struct super_operations *ops;
@@ -15,4 +16,14 @@ struct pseudo_fs_context {
struct pseudo_fs_context *init_pseudo(struct fs_context *fc,
unsigned long magic);
+/*
+ * Common initialization for all pseudo filesystems, mountable or not. Their
+ * regular files are kernel interfaces. They don't store data and pseudo
+ * filesystems never hold executables or device nodes.
+ */
+static inline void fc_init_pseudo(struct fs_context *fc)
+{
+ fc->s_iflags |= SB_I_PSEUDO | SB_I_NOEXEC | SB_I_NODEV;
+}
+
#endif
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* Re: [PATCH RFC 04/41] fs: add SB_I_PSEUDO
2026-11-10 9:14 ` [PATCH RFC 04/41] fs: add SB_I_PSEUDO Christian Brauner
@ 2026-11-10 12:55 ` Jan Kara
0 siblings, 0 replies; 59+ messages in thread
From: Jan Kara @ 2026-11-10 12:55 UTC (permalink / raw)
To: Christian Brauner
Cc: linux-fsdevel, Jann Horn, Chris Mason, Josef Bacik,
Christoph Hellwig, linux-block, linux-kernel, linux-nvme,
Alexander Viro, Jan Kara, linux-scsi, target-devel, driver-core,
linux-mm, bpf, linux-security-module, selinux, apparmor,
linux-nfs, netdev, fuse-devel, linux-efi, xen-devel, ocfs2-devel,
linux-s390, linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest
On Tue 10-11-26 10:14:20, Christian Brauner wrote:
> Currently, there's no way to tell whether the files of a filesystem
> store data or whether they are kernel interfaces. Files on pseudo
> filesystems such as procfs or sysfs generate their contents when they're
> read and writes to them are commands to the kernel.
>
> But a few places in the kernel take an arbitrary file and use it as
> storage: loop, zloop, the nvme target's file backend, the scsi target's
> fileio backend, fuse passthrough, the usb mass storage gadget and erofs
> file-backed mounts. At most they check the file type and whether the
> file implements ->read_iter() and ->write_iter(). That's not enough.
> kernfs provides both for every sysfs attribute for example.
>
> Add SB_I_PSEUDO so a filesystem can state that its regular files are
> kernel interfaces and must not be used as storage.
>
> Pseudo filesystems also never hold executables or device nodes. But
> currently each of them decides on its own whether to raise SB_I_NOEXEC
> and SB_I_NODEV. Some do, most don't. Add fc_init_pseudo() as the common
> initialization point for all pseudo filesystems that raises all three
> flags and switch init_pseudo() over to it. The following patches
> convert the mountable pseudo filesystems.
>
> Nothing checks SB_I_PSEUDO yet so no functional changes.
>
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Looks good. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> fs/libfs.c | 2 +-
> include/linux/fs/super_types.h | 1 +
> include/linux/pseudo_fs.h | 11 +++++++++++
> 3 files changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/fs/libfs.c b/fs/libfs.c
> index 96a6e9b1535f..8c8789489fdf 100644
> --- a/fs/libfs.c
> +++ b/fs/libfs.c
> @@ -735,7 +735,7 @@ struct pseudo_fs_context *init_pseudo(struct fs_context *fc,
> fc->fs_private = ctx;
> fc->ops = &pseudo_fs_context_ops;
> fc->sb_flags |= SB_NOUSER;
> - fc->s_iflags |= SB_I_NOEXEC | SB_I_NODEV;
> + fc_init_pseudo(fc);
> fc->global = true;
> }
> return ctx;
> diff --git a/include/linux/fs/super_types.h b/include/linux/fs/super_types.h
> index 72f4288e16c5..472200bdf081 100644
> --- a/include/linux/fs/super_types.h
> +++ b/include/linux/fs/super_types.h
> @@ -359,5 +359,6 @@ struct super_block {
> #define SB_I_NOIDMAP 0x00002000 /* No idmapped mounts on this superblock */
> #define SB_I_ALLOW_HSM 0x00004000 /* Allow HSM events on this superblock */
> #define SB_I_NO_DATA_INTEGRITY 0x00008000 /* fs cannot guarantee data persistence on sync */
> +#define SB_I_PSEUDO 0x00010000 /* regular files are kernel interfaces, not storage */
>
> #endif /* _LINUX_FS_SUPER_TYPES_H */
> diff --git a/include/linux/pseudo_fs.h b/include/linux/pseudo_fs.h
> index a651e60d9410..0ca408aa60af 100644
> --- a/include/linux/pseudo_fs.h
> +++ b/include/linux/pseudo_fs.h
> @@ -2,6 +2,7 @@
> #define __LINUX_PSEUDO_FS__
>
> #include <linux/fs_context.h>
> +#include <linux/fs/super_types.h>
>
> struct pseudo_fs_context {
> const struct super_operations *ops;
> @@ -15,4 +16,14 @@ struct pseudo_fs_context {
> struct pseudo_fs_context *init_pseudo(struct fs_context *fc,
> unsigned long magic);
>
> +/*
> + * Common initialization for all pseudo filesystems, mountable or not. Their
> + * regular files are kernel interfaces. They don't store data and pseudo
> + * filesystems never hold executables or device nodes.
> + */
> +static inline void fc_init_pseudo(struct fs_context *fc)
> +{
> + fc->s_iflags |= SB_I_PSEUDO | SB_I_NOEXEC | SB_I_NODEV;
> +}
> +
> #endif
>
> --
> 2.53.0
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 59+ messages in thread
* [PATCH RFC 05/41] kernfs: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (3 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 04/41] fs: add SB_I_PSEUDO Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 12:56 ` Jan Kara
2026-11-10 9:14 ` [PATCH RFC 06/41] proc: " Christian Brauner
` (35 subsequent siblings)
40 siblings, 1 reply; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize all kernfs based filesystems as pseudo filesystems in
kernfs_get_tree() instead of raising SB_I_NOEXEC and SB_I_NODEV by hand
in kernfs_fill_super(). This adds SB_I_PSEUDO for sysfs, cgroupfs and
resctrl.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/kernfs/mount.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/fs/kernfs/mount.c b/fs/kernfs/mount.c
index a0be784bfb06..6b60d212b003 100644
--- a/fs/kernfs/mount.c
+++ b/fs/kernfs/mount.c
@@ -8,6 +8,7 @@
*/
#include <linux/fs.h>
+#include <linux/pseudo_fs.h>
#include <linux/mount.h>
#include <linux/init.h>
#include <linux/magic.h>
@@ -298,8 +299,6 @@ static int kernfs_fill_super(struct super_block *sb, struct kernfs_fs_context *k
struct dentry *root;
info->sb = sb;
- /* Userspace would break if executables or devices appear on sysfs */
- sb->s_iflags |= SB_I_NOEXEC | SB_I_NODEV;
sb->s_blocksize = PAGE_SIZE;
sb->s_blocksize_bits = PAGE_SHIFT;
sb->s_magic = kfc->magic;
@@ -388,6 +387,7 @@ int kernfs_get_tree(struct fs_context *fc)
info->ns = kfc->ns_tag;
INIT_LIST_HEAD(&info->node);
+ fc_init_pseudo(fc);
fc->s_fs_info = info;
sb = sget_fc(fc, kernfs_test_super, kernfs_set_super);
if (IS_ERR(sb))
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* Re: [PATCH RFC 05/41] kernfs: use fc_init_pseudo()
2026-11-10 9:14 ` [PATCH RFC 05/41] kernfs: use fc_init_pseudo() Christian Brauner
@ 2026-11-10 12:56 ` Jan Kara
0 siblings, 0 replies; 59+ messages in thread
From: Jan Kara @ 2026-11-10 12:56 UTC (permalink / raw)
To: Christian Brauner
Cc: linux-fsdevel, Jann Horn, Chris Mason, Josef Bacik,
Christoph Hellwig, linux-block, linux-kernel, linux-nvme,
Alexander Viro, Jan Kara, linux-scsi, target-devel, driver-core,
linux-mm, bpf, linux-security-module, selinux, apparmor,
linux-nfs, netdev, fuse-devel, linux-efi, xen-devel, ocfs2-devel,
linux-s390, linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest
On Tue 10-11-26 10:14:21, Christian Brauner wrote:
> Initialize all kernfs based filesystems as pseudo filesystems in
> kernfs_get_tree() instead of raising SB_I_NOEXEC and SB_I_NODEV by hand
> in kernfs_fill_super(). This adds SB_I_PSEUDO for sysfs, cgroupfs and
> resctrl.
>
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Makes sense. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> fs/kernfs/mount.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/fs/kernfs/mount.c b/fs/kernfs/mount.c
> index a0be784bfb06..6b60d212b003 100644
> --- a/fs/kernfs/mount.c
> +++ b/fs/kernfs/mount.c
> @@ -8,6 +8,7 @@
> */
>
> #include <linux/fs.h>
> +#include <linux/pseudo_fs.h>
> #include <linux/mount.h>
> #include <linux/init.h>
> #include <linux/magic.h>
> @@ -298,8 +299,6 @@ static int kernfs_fill_super(struct super_block *sb, struct kernfs_fs_context *k
> struct dentry *root;
>
> info->sb = sb;
> - /* Userspace would break if executables or devices appear on sysfs */
> - sb->s_iflags |= SB_I_NOEXEC | SB_I_NODEV;
> sb->s_blocksize = PAGE_SIZE;
> sb->s_blocksize_bits = PAGE_SHIFT;
> sb->s_magic = kfc->magic;
> @@ -388,6 +387,7 @@ int kernfs_get_tree(struct fs_context *fc)
> info->ns = kfc->ns_tag;
> INIT_LIST_HEAD(&info->node);
>
> + fc_init_pseudo(fc);
> fc->s_fs_info = info;
> sb = sget_fc(fc, kernfs_test_super, kernfs_set_super);
> if (IS_ERR(sb))
>
> --
> 2.53.0
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 59+ messages in thread
* [PATCH RFC 06/41] proc: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (4 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 05/41] kernfs: use fc_init_pseudo() Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 12:56 ` Jan Kara
2026-11-10 9:14 ` [PATCH RFC 07/41] binfmt_misc: " Christian Brauner
` (34 subsequent siblings)
40 siblings, 1 reply; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize procfs as a pseudo filesystem instead of raising
SB_I_NOEXEC and SB_I_NODEV by hand. This adds SB_I_PSEUDO.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/proc/root.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/fs/proc/root.c b/fs/proc/root.c
index 7fbbe92bf73a..ca0e75081934 100644
--- a/fs/proc/root.c
+++ b/fs/proc/root.c
@@ -17,6 +17,7 @@
#include <linux/bitops.h>
#include <linux/user_namespace.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/mount.h>
#include <linux/pid_namespace.h>
#include <linux/fs_parser.h>
@@ -265,8 +266,6 @@ static int proc_fill_super(struct super_block *s, struct fs_context *fc)
if (ret)
return ret;
- /* User space would break if executables or devices appear on proc */
- s->s_iflags |= SB_I_NOEXEC | SB_I_NODEV;
s->s_flags |= SB_NODIRATIME | SB_NOSUID | SB_NOEXEC;
s->s_blocksize = 1024;
s->s_blocksize_bits = 10;
@@ -350,6 +349,7 @@ static int proc_init_fs_context(struct fs_context *fc)
put_user_ns(fc->user_ns);
fc->user_ns = get_user_ns(ctx->pid_ns->user_ns);
fc->fs_private = ctx;
+ fc_init_pseudo(fc);
fc->ops = &proc_fs_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* Re: [PATCH RFC 06/41] proc: use fc_init_pseudo()
2026-11-10 9:14 ` [PATCH RFC 06/41] proc: " Christian Brauner
@ 2026-11-10 12:56 ` Jan Kara
0 siblings, 0 replies; 59+ messages in thread
From: Jan Kara @ 2026-11-10 12:56 UTC (permalink / raw)
To: Christian Brauner
Cc: linux-fsdevel, Jann Horn, Chris Mason, Josef Bacik,
Christoph Hellwig, linux-block, linux-kernel, linux-nvme,
Alexander Viro, Jan Kara, linux-scsi, target-devel, driver-core,
linux-mm, bpf, linux-security-module, selinux, apparmor,
linux-nfs, netdev, fuse-devel, linux-efi, xen-devel, ocfs2-devel,
linux-s390, linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest
On Tue 10-11-26 10:14:22, Christian Brauner wrote:
> Initialize procfs as a pseudo filesystem instead of raising
> SB_I_NOEXEC and SB_I_NODEV by hand. This adds SB_I_PSEUDO.
>
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Makes sense. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> fs/proc/root.c | 4 ++--
> 1 file changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/fs/proc/root.c b/fs/proc/root.c
> index 7fbbe92bf73a..ca0e75081934 100644
> --- a/fs/proc/root.c
> +++ b/fs/proc/root.c
> @@ -17,6 +17,7 @@
> #include <linux/bitops.h>
> #include <linux/user_namespace.h>
> #include <linux/fs_context.h>
> +#include <linux/pseudo_fs.h>
> #include <linux/mount.h>
> #include <linux/pid_namespace.h>
> #include <linux/fs_parser.h>
> @@ -265,8 +266,6 @@ static int proc_fill_super(struct super_block *s, struct fs_context *fc)
> if (ret)
> return ret;
>
> - /* User space would break if executables or devices appear on proc */
> - s->s_iflags |= SB_I_NOEXEC | SB_I_NODEV;
> s->s_flags |= SB_NODIRATIME | SB_NOSUID | SB_NOEXEC;
> s->s_blocksize = 1024;
> s->s_blocksize_bits = 10;
> @@ -350,6 +349,7 @@ static int proc_init_fs_context(struct fs_context *fc)
> put_user_ns(fc->user_ns);
> fc->user_ns = get_user_ns(ctx->pid_ns->user_ns);
> fc->fs_private = ctx;
> + fc_init_pseudo(fc);
> fc->ops = &proc_fs_context_ops;
> return 0;
> }
>
> --
> 2.53.0
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 59+ messages in thread
* [PATCH RFC 07/41] binfmt_misc: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (5 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 06/41] proc: " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 12:56 ` Jan Kara
2026-11-10 9:14 ` [PATCH RFC 08/41] mqueue: " Christian Brauner
` (33 subsequent siblings)
40 siblings, 1 reply; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize binfmt_misc as a pseudo filesystem instead of raising
SB_I_NOEXEC and SB_I_NODEV by hand. This adds SB_I_PSEUDO.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/binfmt_misc.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c
index d945b4f6e158..7dc233becd98 100644
--- a/fs/binfmt_misc.c
+++ b/fs/binfmt_misc.c
@@ -22,6 +22,7 @@
#include <linux/file.h>
#include <linux/fs.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/init.h>
#include <linux/kstrtox.h>
#include <linux/limits.h>
@@ -1575,8 +1576,7 @@ static int bm_fill_super(struct super_block *sb, struct fs_context *fc)
if (user_ns != current_user_ns())
return -EINVAL;
- /* Never exec off this instance and never let anything stack on it. */
- sb->s_iflags |= SB_I_NOEXEC | SB_I_NODEV;
+ /* Never let anything stack on this instance. */
sb->s_stack_depth = FILESYSTEM_MAX_STACK_DEPTH;
/*
@@ -1660,6 +1660,7 @@ static void bm_kill_sb(struct super_block *sb)
static int bm_init_fs_context(struct fs_context *fc)
{
+ fc_init_pseudo(fc);
fc->ops = &bm_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* Re: [PATCH RFC 07/41] binfmt_misc: use fc_init_pseudo()
2026-11-10 9:14 ` [PATCH RFC 07/41] binfmt_misc: " Christian Brauner
@ 2026-11-10 12:56 ` Jan Kara
0 siblings, 0 replies; 59+ messages in thread
From: Jan Kara @ 2026-11-10 12:56 UTC (permalink / raw)
To: Christian Brauner
Cc: linux-fsdevel, Jann Horn, Chris Mason, Josef Bacik,
Christoph Hellwig, linux-block, linux-kernel, linux-nvme,
Alexander Viro, Jan Kara, linux-scsi, target-devel, driver-core,
linux-mm, bpf, linux-security-module, selinux, apparmor,
linux-nfs, netdev, fuse-devel, linux-efi, xen-devel, ocfs2-devel,
linux-s390, linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest
On Tue 10-11-26 10:14:23, Christian Brauner wrote:
> Initialize binfmt_misc as a pseudo filesystem instead of raising
> SB_I_NOEXEC and SB_I_NODEV by hand. This adds SB_I_PSEUDO.
>
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
OK. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> fs/binfmt_misc.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c
> index d945b4f6e158..7dc233becd98 100644
> --- a/fs/binfmt_misc.c
> +++ b/fs/binfmt_misc.c
> @@ -22,6 +22,7 @@
> #include <linux/file.h>
> #include <linux/fs.h>
> #include <linux/fs_context.h>
> +#include <linux/pseudo_fs.h>
> #include <linux/init.h>
> #include <linux/kstrtox.h>
> #include <linux/limits.h>
> @@ -1575,8 +1576,7 @@ static int bm_fill_super(struct super_block *sb, struct fs_context *fc)
> if (user_ns != current_user_ns())
> return -EINVAL;
>
> - /* Never exec off this instance and never let anything stack on it. */
> - sb->s_iflags |= SB_I_NOEXEC | SB_I_NODEV;
> + /* Never let anything stack on this instance. */
> sb->s_stack_depth = FILESYSTEM_MAX_STACK_DEPTH;
>
> /*
> @@ -1660,6 +1660,7 @@ static void bm_kill_sb(struct super_block *sb)
>
> static int bm_init_fs_context(struct fs_context *fc)
> {
> + fc_init_pseudo(fc);
> fc->ops = &bm_context_ops;
> return 0;
> }
>
> --
> 2.53.0
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 59+ messages in thread
* [PATCH RFC 08/41] mqueue: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (6 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 07/41] binfmt_misc: " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 09/41] bpf: use fc_init_pseudo() for bpffs Christian Brauner
` (32 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize mqueue as a pseudo filesystem instead of raising
SB_I_NOEXEC and SB_I_NODEV by hand. This adds SB_I_PSEUDO.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
ipc/mqueue.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/ipc/mqueue.c b/ipc/mqueue.c
index 322c3dd98c44..8bbe32d0881f 100644
--- a/ipc/mqueue.c
+++ b/ipc/mqueue.c
@@ -18,6 +18,7 @@
#include <linux/file.h>
#include <linux/mount.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/namei.h>
#include <linux/sysctl.h>
#include <linux/poll.h>
@@ -405,7 +406,6 @@ static int mqueue_fill_super(struct super_block *sb, struct fs_context *fc)
struct inode *inode;
struct ipc_namespace *ns = sb->s_fs_info;
- sb->s_iflags |= SB_I_NOEXEC | SB_I_NODEV;
sb->s_blocksize = PAGE_SIZE;
sb->s_blocksize_bits = PAGE_SHIFT;
sb->s_magic = MQUEUE_MAGIC;
@@ -457,6 +457,7 @@ static int mqueue_init_fs_context(struct fs_context *fc)
put_user_ns(fc->user_ns);
fc->user_ns = get_user_ns(ctx->ipc_ns->user_ns);
fc->fs_private = ctx;
+ fc_init_pseudo(fc);
fc->ops = &mqueue_fs_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 09/41] bpf: use fc_init_pseudo() for bpffs
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (7 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 08/41] mqueue: " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 10/41] nullfs: use fc_init_pseudo() Christian Brauner
` (31 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize bpffs as a pseudo filesystem instead of raising
SB_I_NOEXEC and SB_I_NODEV by hand. This adds SB_I_PSEUDO.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
kernel/bpf/inode.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/kernel/bpf/inode.c b/kernel/bpf/inode.c
index c6f328e4752e..57cf3775c076 100644
--- a/kernel/bpf/inode.c
+++ b/kernel/bpf/inode.c
@@ -15,6 +15,7 @@
#include <linux/namei.h>
#include <linux/fs.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/fs_parser.h>
#include <linux/kdev_t.h>
#include <linux/filter.h>
@@ -1197,8 +1198,6 @@ static int bpf_fill_super(struct super_block *sb, struct fs_context *fc)
sb->s_magic = BPF_FS_MAGIC;
sb->s_op = &bpf_super_ops;
sb->s_xattr = bpf_fs_xattr_handlers;
- sb->s_iflags |= SB_I_NOEXEC;
- sb->s_iflags |= SB_I_NODEV;
sb->s_time_gran = 1;
inode = bpf_get_inode(sb, NULL, S_IFDIR | 0777);
@@ -1261,6 +1260,7 @@ static int bpf_init_fs_context(struct fs_context *fc)
opts->delegate_attachs = 0;
fc->s_fs_info = opts;
+ fc_init_pseudo(fc);
fc->ops = &bpf_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 10/41] nullfs: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (8 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 09/41] bpf: use fc_init_pseudo() for bpffs Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 12:57 ` Jan Kara
2026-11-10 9:14 ` [PATCH RFC 11/41] failfs: " Christian Brauner
` (30 subsequent siblings)
40 siblings, 1 reply; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize nullfs as a pseudo filesystem instead of raising
SB_I_NOEXEC and SB_I_NODEV by hand. This adds SB_I_PSEUDO.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/nullfs.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/fs/nullfs.c b/fs/nullfs.c
index 319c2f5c5a67..2fe24cb97160 100644
--- a/fs/nullfs.c
+++ b/fs/nullfs.c
@@ -2,6 +2,7 @@
/* Copyright (c) 2026 Christian Brauner <brauner@kernel.org> */
#include <linux/fs/super_types.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/magic.h>
#include <linux/splice.h>
#include <linux/uio.h>
@@ -174,7 +175,7 @@ static int nullfs_init_fs_context(struct fs_context *fc)
{
fc->ops = &nullfs_fs_context_ops;
fc->sb_flags |= SB_NOUSER;
- fc->s_iflags |= SB_I_NOEXEC | SB_I_NODEV;
+ fc_init_pseudo(fc);
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* Re: [PATCH RFC 10/41] nullfs: use fc_init_pseudo()
2026-11-10 9:14 ` [PATCH RFC 10/41] nullfs: use fc_init_pseudo() Christian Brauner
@ 2026-11-10 12:57 ` Jan Kara
0 siblings, 0 replies; 59+ messages in thread
From: Jan Kara @ 2026-11-10 12:57 UTC (permalink / raw)
To: Christian Brauner
Cc: linux-fsdevel, Jann Horn, Chris Mason, Josef Bacik,
Christoph Hellwig, linux-block, linux-kernel, linux-nvme,
Alexander Viro, Jan Kara, linux-scsi, target-devel, driver-core,
linux-mm, bpf, linux-security-module, selinux, apparmor,
linux-nfs, netdev, fuse-devel, linux-efi, xen-devel, ocfs2-devel,
linux-s390, linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest
On Tue 10-11-26 10:14:26, Christian Brauner wrote:
> Initialize nullfs as a pseudo filesystem instead of raising
> SB_I_NOEXEC and SB_I_NODEV by hand. This adds SB_I_PSEUDO.
>
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Looks good. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> fs/nullfs.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/fs/nullfs.c b/fs/nullfs.c
> index 319c2f5c5a67..2fe24cb97160 100644
> --- a/fs/nullfs.c
> +++ b/fs/nullfs.c
> @@ -2,6 +2,7 @@
> /* Copyright (c) 2026 Christian Brauner <brauner@kernel.org> */
> #include <linux/fs/super_types.h>
> #include <linux/fs_context.h>
> +#include <linux/pseudo_fs.h>
> #include <linux/magic.h>
> #include <linux/splice.h>
> #include <linux/uio.h>
> @@ -174,7 +175,7 @@ static int nullfs_init_fs_context(struct fs_context *fc)
> {
> fc->ops = &nullfs_fs_context_ops;
> fc->sb_flags |= SB_NOUSER;
> - fc->s_iflags |= SB_I_NOEXEC | SB_I_NODEV;
> + fc_init_pseudo(fc);
> return 0;
> }
>
>
> --
> 2.53.0
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 59+ messages in thread
* [PATCH RFC 11/41] failfs: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (9 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 10/41] nullfs: use fc_init_pseudo() Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 12:57 ` Jan Kara
2026-11-10 9:14 ` [PATCH RFC 12/41] rust_binderfs: " Christian Brauner
` (29 subsequent siblings)
40 siblings, 1 reply; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize failfs as a pseudo filesystem instead of raising
SB_I_NOEXEC and SB_I_NODEV by hand. This adds SB_I_PSEUDO.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/failfs.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/fs/failfs.c b/fs/failfs.c
index 437cdc981c2d..f03334f361c0 100644
--- a/fs/failfs.c
+++ b/fs/failfs.c
@@ -3,6 +3,7 @@
#include <linux/fs.h>
#include <linux/fs/super_types.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/fs_struct.h>
#include <linux/magic.h>
#include <linux/mount.h>
@@ -132,7 +133,7 @@ static int failfs_init_fs_context(struct fs_context *fc)
fc->ops = &failfs_context_ops;
fc->global = true;
fc->sb_flags |= SB_NOUSER;
- fc->s_iflags |= SB_I_NOEXEC | SB_I_NODEV;
+ fc_init_pseudo(fc);
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* Re: [PATCH RFC 11/41] failfs: use fc_init_pseudo()
2026-11-10 9:14 ` [PATCH RFC 11/41] failfs: " Christian Brauner
@ 2026-11-10 12:57 ` Jan Kara
0 siblings, 0 replies; 59+ messages in thread
From: Jan Kara @ 2026-11-10 12:57 UTC (permalink / raw)
To: Christian Brauner
Cc: linux-fsdevel, Jann Horn, Chris Mason, Josef Bacik,
Christoph Hellwig, linux-block, linux-kernel, linux-nvme,
Alexander Viro, Jan Kara, linux-scsi, target-devel, driver-core,
linux-mm, bpf, linux-security-module, selinux, apparmor,
linux-nfs, netdev, fuse-devel, linux-efi, xen-devel, ocfs2-devel,
linux-s390, linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest
On Tue 10-11-26 10:14:27, Christian Brauner wrote:
> Initialize failfs as a pseudo filesystem instead of raising
> SB_I_NOEXEC and SB_I_NODEV by hand. This adds SB_I_PSEUDO.
>
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Looks good. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> fs/failfs.c | 3 ++-
> 1 file changed, 2 insertions(+), 1 deletion(-)
>
> diff --git a/fs/failfs.c b/fs/failfs.c
> index 437cdc981c2d..f03334f361c0 100644
> --- a/fs/failfs.c
> +++ b/fs/failfs.c
> @@ -3,6 +3,7 @@
> #include <linux/fs.h>
> #include <linux/fs/super_types.h>
> #include <linux/fs_context.h>
> +#include <linux/pseudo_fs.h>
> #include <linux/fs_struct.h>
> #include <linux/magic.h>
> #include <linux/mount.h>
> @@ -132,7 +133,7 @@ static int failfs_init_fs_context(struct fs_context *fc)
> fc->ops = &failfs_context_ops;
> fc->global = true;
> fc->sb_flags |= SB_NOUSER;
> - fc->s_iflags |= SB_I_NOEXEC | SB_I_NODEV;
> + fc_init_pseudo(fc);
> return 0;
> }
>
>
> --
> 2.53.0
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 59+ messages in thread
* [PATCH RFC 12/41] rust_binderfs: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (10 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 11/41] failfs: " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 13/41] devpts: " Christian Brauner
` (28 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize binderfs as a pseudo filesystem instead of raising SB_I_NOEXEC
by hand. This adds SB_I_PSEUDO. binderfs_fill_super() keeps clearing
SB_I_NODEV for the binder device nodes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
drivers/android/binder/rust_binderfs.c | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/android/binder/rust_binderfs.c b/drivers/android/binder/rust_binderfs.c
index 5f020226720d..04468c5b5c11 100644
--- a/drivers/android/binder/rust_binderfs.c
+++ b/drivers/android/binder/rust_binderfs.c
@@ -3,6 +3,7 @@
#include <linux/compiler_types.h>
#include <linux/errno.h>
#include <linux/fs.h>
+#include <linux/pseudo_fs.h>
#include <linux/fsnotify.h>
#include <linux/gfp.h>
#include <linux/idr.h>
@@ -667,7 +668,6 @@ static int binderfs_fill_super(struct super_block *sb, struct fs_context *fc)
* necessary and safe.
*/
sb->s_iflags &= ~SB_I_NODEV;
- sb->s_iflags |= SB_I_NOEXEC;
sb->s_magic = RUST_BINDERFS_SUPER_MAGIC;
sb->s_op = &binderfs_super_ops;
sb->s_time_gran = 1;
@@ -759,6 +759,7 @@ static int binderfs_init_fs_context(struct fs_context *fc)
ctx->stats_mode = binderfs_stats_mode_unset;
fc->fs_private = ctx;
+ fc_init_pseudo(fc);
fc->ops = &binderfs_fs_context_ops;
return 0;
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 13/41] devpts: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (11 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 12/41] rust_binderfs: " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 14/41] debugfs: " Christian Brauner
` (27 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize devpts as a pseudo filesystem. This raises SB_I_PSEUDO and
SB_I_NOEXEC. devpts never holds executables. devpts_fill_super() keeps
clearing SB_I_NODEV for the pty device nodes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/devpts/inode.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/fs/devpts/inode.c b/fs/devpts/inode.c
index bd1e8eb26edb..47ef12241d92 100644
--- a/fs/devpts/inode.c
+++ b/fs/devpts/inode.c
@@ -13,6 +13,7 @@
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/fs_parser.h>
#include <linux/sched.h>
#include <linux/namei.h>
@@ -438,6 +439,7 @@ static int devpts_init_fs_context(struct fs_context *fc)
fsi->mount_opts.reserve = true;
fc->s_fs_info = fsi;
+ fc_init_pseudo(fc);
fc->ops = &devpts_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 14/41] debugfs: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (12 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 13/41] devpts: " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 12:59 ` Jan Kara
2026-11-10 9:14 ` [PATCH RFC 15/41] tracefs: " Christian Brauner
` (26 subsequent siblings)
40 siblings, 1 reply; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize debugfs as a pseudo filesystem. This raises SB_I_PSEUDO and
also SB_I_NOEXEC and SB_I_NODEV. debugfs never holds executables or
device nodes.
SB_I_NOEXEC also refuses PROT_EXEC mappings. The debugfs files that
can be mapped, kcov, relay channels and powernv's memtrace, map data.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/debugfs/inode.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c
index b4915551ad31..f163f0bc5703 100644
--- a/fs/debugfs/inode.c
+++ b/fs/debugfs/inode.c
@@ -15,6 +15,7 @@
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/fs_parser.h>
#include <linux/pagemap.h>
#include <linux/init.h>
@@ -317,6 +318,7 @@ static int debugfs_init_fs_context(struct fs_context *fc)
fsi->mode = DEBUGFS_DEFAULT_MODE;
fc->s_fs_info = fsi;
+ fc_init_pseudo(fc);
fc->ops = &debugfs_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* Re: [PATCH RFC 14/41] debugfs: use fc_init_pseudo()
2026-11-10 9:14 ` [PATCH RFC 14/41] debugfs: " Christian Brauner
@ 2026-11-10 12:59 ` Jan Kara
0 siblings, 0 replies; 59+ messages in thread
From: Jan Kara @ 2026-11-10 12:59 UTC (permalink / raw)
To: Christian Brauner
Cc: linux-fsdevel, Jann Horn, Chris Mason, Josef Bacik,
Christoph Hellwig, linux-block, linux-kernel, linux-nvme,
Alexander Viro, Jan Kara, linux-scsi, target-devel, driver-core,
linux-mm, bpf, linux-security-module, selinux, apparmor,
linux-nfs, netdev, fuse-devel, linux-efi, xen-devel, ocfs2-devel,
linux-s390, linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest
On Tue 10-11-26 10:14:30, Christian Brauner wrote:
> Initialize debugfs as a pseudo filesystem. This raises SB_I_PSEUDO and
> also SB_I_NOEXEC and SB_I_NODEV. debugfs never holds executables or
> device nodes.
>
> SB_I_NOEXEC also refuses PROT_EXEC mappings. The debugfs files that
> can be mapped, kcov, relay channels and powernv's memtrace, map data.
>
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
OK, makes sense. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> fs/debugfs/inode.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/fs/debugfs/inode.c b/fs/debugfs/inode.c
> index b4915551ad31..f163f0bc5703 100644
> --- a/fs/debugfs/inode.c
> +++ b/fs/debugfs/inode.c
> @@ -15,6 +15,7 @@
> #include <linux/module.h>
> #include <linux/fs.h>
> #include <linux/fs_context.h>
> +#include <linux/pseudo_fs.h>
> #include <linux/fs_parser.h>
> #include <linux/pagemap.h>
> #include <linux/init.h>
> @@ -317,6 +318,7 @@ static int debugfs_init_fs_context(struct fs_context *fc)
> fsi->mode = DEBUGFS_DEFAULT_MODE;
>
> fc->s_fs_info = fsi;
> + fc_init_pseudo(fc);
> fc->ops = &debugfs_context_ops;
> return 0;
> }
>
> --
> 2.53.0
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 59+ messages in thread
* [PATCH RFC 15/41] tracefs: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (13 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 14/41] debugfs: " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 16/41] configfs: " Christian Brauner
` (25 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize tracefs as a pseudo filesystem. This raises SB_I_PSEUDO and
also SB_I_NOEXEC and SB_I_NODEV. tracefs never holds executables or
device nodes.
SB_I_NOEXEC also refuses PROT_EXEC mappings. The only tracefs files
that can be mapped are the ring buffers and __rb_map_vma() refuses
VM_EXEC already.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/tracefs/inode.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/fs/tracefs/inode.c b/fs/tracefs/inode.c
index 5020365ca704..e04febd868eb 100644
--- a/fs/tracefs/inode.c
+++ b/fs/tracefs/inode.c
@@ -12,6 +12,7 @@
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/fs_parser.h>
#include <linux/kobject.h>
#include <linux/namei.h>
@@ -510,6 +511,7 @@ static int tracefs_init_fs_context(struct fs_context *fc)
fsi->mode = TRACEFS_DEFAULT_MODE;
fc->s_fs_info = fsi;
+ fc_init_pseudo(fc);
fc->ops = &tracefs_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 16/41] configfs: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (14 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 15/41] tracefs: " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 12:59 ` Jan Kara
2026-11-10 9:14 ` [PATCH RFC 17/41] securityfs: " Christian Brauner
` (24 subsequent siblings)
40 siblings, 1 reply; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize configfs as a pseudo filesystem. This raises SB_I_PSEUDO and
also SB_I_NOEXEC and SB_I_NODEV. configfs never holds executables or
device nodes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/configfs/mount.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/fs/configfs/mount.c b/fs/configfs/mount.c
index d8cac1cbf3bd..60ba24e7ae2b 100644
--- a/fs/configfs/mount.c
+++ b/fs/configfs/mount.c
@@ -13,6 +13,7 @@
#include <linux/module.h>
#include <linux/mount.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/pagemap.h>
#include <linux/init.h>
#include <linux/slab.h>
@@ -106,6 +107,7 @@ static const struct fs_context_operations configfs_context_ops = {
static int configfs_init_fs_context(struct fs_context *fc)
{
+ fc_init_pseudo(fc);
fc->ops = &configfs_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* Re: [PATCH RFC 16/41] configfs: use fc_init_pseudo()
2026-11-10 9:14 ` [PATCH RFC 16/41] configfs: " Christian Brauner
@ 2026-11-10 12:59 ` Jan Kara
0 siblings, 0 replies; 59+ messages in thread
From: Jan Kara @ 2026-11-10 12:59 UTC (permalink / raw)
To: Christian Brauner
Cc: linux-fsdevel, Jann Horn, Chris Mason, Josef Bacik,
Christoph Hellwig, linux-block, linux-kernel, linux-nvme,
Alexander Viro, Jan Kara, linux-scsi, target-devel, driver-core,
linux-mm, bpf, linux-security-module, selinux, apparmor,
linux-nfs, netdev, fuse-devel, linux-efi, xen-devel, ocfs2-devel,
linux-s390, linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest
On Tue 10-11-26 10:14:32, Christian Brauner wrote:
> Initialize configfs as a pseudo filesystem. This raises SB_I_PSEUDO and
> also SB_I_NOEXEC and SB_I_NODEV. configfs never holds executables or
> device nodes.
>
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Makes sense. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> fs/configfs/mount.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/fs/configfs/mount.c b/fs/configfs/mount.c
> index d8cac1cbf3bd..60ba24e7ae2b 100644
> --- a/fs/configfs/mount.c
> +++ b/fs/configfs/mount.c
> @@ -13,6 +13,7 @@
> #include <linux/module.h>
> #include <linux/mount.h>
> #include <linux/fs_context.h>
> +#include <linux/pseudo_fs.h>
> #include <linux/pagemap.h>
> #include <linux/init.h>
> #include <linux/slab.h>
> @@ -106,6 +107,7 @@ static const struct fs_context_operations configfs_context_ops = {
>
> static int configfs_init_fs_context(struct fs_context *fc)
> {
> + fc_init_pseudo(fc);
> fc->ops = &configfs_context_ops;
> return 0;
> }
>
> --
> 2.53.0
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 59+ messages in thread
* [PATCH RFC 17/41] securityfs: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (15 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 16/41] configfs: " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 18/41] selinux: use fc_init_pseudo() for selinuxfs Christian Brauner
` (23 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize securityfs as a pseudo filesystem. This raises SB_I_PSEUDO and
also SB_I_NOEXEC and SB_I_NODEV. securityfs never holds executables or
device nodes.
AppArmor puts a .null device node into securityfs but only ever opens
it via dentry_open() which doesn't care about SB_I_NODEV.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
security/inode.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/security/inode.c b/security/inode.c
index 080402367674..93997a9f16fc 100644
--- a/security/inode.c
+++ b/security/inode.c
@@ -14,6 +14,7 @@
#include <linux/kobject.h>
#include <linux/fs.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/mount.h>
#include <linux/pagemap.h>
#include <linux/init.h>
@@ -64,6 +65,7 @@ static const struct fs_context_operations securityfs_context_ops = {
static int securityfs_init_fs_context(struct fs_context *fc)
{
+ fc_init_pseudo(fc);
fc->ops = &securityfs_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 18/41] selinux: use fc_init_pseudo() for selinuxfs
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (16 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 17/41] securityfs: " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 19/41] smack: use fc_init_pseudo() for smackfs Christian Brauner
` (22 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize selinuxfs as a pseudo filesystem. This raises SB_I_PSEUDO and
SB_I_NOEXEC. selinuxfs never holds executables. SB_I_NOEXEC also
refuses PROT_EXEC mappings but the status and policy files are only
ever mapped for reading.
But selinuxfs needs device nodes. The kernel replaces file descriptors
with /sys/fs/selinux/null on exec via dentry_open() which doesn't care
about SB_I_NODEV. Android init however opens /sys/fs/selinux/null by
path as /dev/null doesn't exist yet at that point. So clear SB_I_NODEV
again in sel_fill_super().
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
security/selinux/selinuxfs.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/security/selinux/selinuxfs.c b/security/selinux/selinuxfs.c
index 310e19efff1d..d7ae853b6d68 100644
--- a/security/selinux/selinuxfs.c
+++ b/security/selinux/selinuxfs.c
@@ -18,6 +18,7 @@
#include <linux/vmalloc.h>
#include <linux/fs.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/hex.h>
#include <linux/mount.h>
#include <linux/mutex.h>
@@ -1852,6 +1853,9 @@ static int sel_fill_super(struct super_block *sb, struct fs_context *fc)
/* last one */ {"", NULL, 0}
};
+ /* Android init opens the null device below by path. */
+ sb->s_iflags &= ~SB_I_NODEV;
+
ret = selinux_fs_info_create(sb);
if (ret)
goto err;
@@ -1955,6 +1959,7 @@ static const struct fs_context_operations sel_context_ops = {
static int sel_init_fs_context(struct fs_context *fc)
{
+ fc_init_pseudo(fc);
fc->ops = &sel_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 19/41] smack: use fc_init_pseudo() for smackfs
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (17 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 18/41] selinux: use fc_init_pseudo() for selinuxfs Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 20/41] apparmor: use fc_init_pseudo() for apparmorfs Christian Brauner
` (21 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize smackfs as a pseudo filesystem. This raises SB_I_PSEUDO and
also SB_I_NOEXEC and SB_I_NODEV. smackfs never holds executables or
device nodes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
security/smack/smackfs.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c
index a72bc7fabea9..4a56bbeaeca3 100644
--- a/security/smack/smackfs.c
+++ b/security/smack/smackfs.c
@@ -25,6 +25,7 @@
#include <linux/magic.h>
#include <linux/mount.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include "smack.h"
#define BEBITS (sizeof(__be32) * 8)
@@ -2880,6 +2881,7 @@ static const struct fs_context_operations smk_context_ops = {
*/
static int smk_init_fs_context(struct fs_context *fc)
{
+ fc_init_pseudo(fc);
fc->ops = &smk_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 20/41] apparmor: use fc_init_pseudo() for apparmorfs
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (18 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 19/41] smack: use fc_init_pseudo() for smackfs Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 21/41] nfsd: use fc_init_pseudo() Christian Brauner
` (20 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize apparmorfs as a pseudo filesystem. This raises SB_I_PSEUDO and
also SB_I_NOEXEC and SB_I_NODEV. apparmorfs never holds executables or
device nodes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
security/apparmor/apparmorfs.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/security/apparmor/apparmorfs.c b/security/apparmor/apparmorfs.c
index a99366467217..351ea3a7120e 100644
--- a/security/apparmor/apparmorfs.c
+++ b/security/apparmor/apparmorfs.c
@@ -21,6 +21,7 @@
#include <linux/rcupdate.h>
#include <linux/fs.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/poll.h>
#include <linux/zstd.h>
#include <linux/string.h>
@@ -263,6 +264,7 @@ static const struct fs_context_operations apparmorfs_context_ops = {
static int apparmorfs_init_fs_context(struct fs_context *fc)
{
+ fc_init_pseudo(fc);
fc->ops = &apparmorfs_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 21/41] nfsd: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (19 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 20/41] apparmor: use fc_init_pseudo() for apparmorfs Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 14:55 ` Chuck Lever
2026-11-10 9:14 ` [PATCH RFC 22/41] sunrpc: use fc_init_pseudo() for rpc_pipefs Christian Brauner
` (19 subsequent siblings)
40 siblings, 1 reply; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize the nfsd filesystem as a pseudo filesystem. This raises
SB_I_PSEUDO and also SB_I_NOEXEC and SB_I_NODEV. It never holds
executables or device nodes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/nfsd/nfsctl.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index f32311f2d7cf..ce2666deddbd 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -9,6 +9,7 @@
#include <linux/namei.h>
#include <linux/ctype.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/sunrpc/cache.h>
#include <linux/sunrpc/svcsock.h>
@@ -1375,6 +1376,7 @@ static int nfsd_init_fs_context(struct fs_context *fc)
{
put_user_ns(fc->user_ns);
fc->user_ns = get_user_ns(fc->net_ns->user_ns);
+ fc_init_pseudo(fc);
fc->ops = &nfsd_fs_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* Re: [PATCH RFC 21/41] nfsd: use fc_init_pseudo()
2026-11-10 9:14 ` [PATCH RFC 21/41] nfsd: use fc_init_pseudo() Christian Brauner
@ 2026-11-10 14:55 ` Chuck Lever
0 siblings, 0 replies; 59+ messages in thread
From: Chuck Lever @ 2026-11-10 14:55 UTC (permalink / raw)
To: Christian Brauner, linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
Linuxppc Dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest
On Tue, Nov 10, 2026, at 4:14 AM, Christian Brauner wrote:
> Initialize the nfsd filesystem as a pseudo filesystem. This raises
> SB_I_PSEUDO and also SB_I_NOEXEC and SB_I_NODEV. It never holds
> executables or device nodes.
>
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
> ---
> fs/nfsd/nfsctl.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
> index f32311f2d7cf..ce2666deddbd 100644
> --- a/fs/nfsd/nfsctl.c
> +++ b/fs/nfsd/nfsctl.c
> @@ -9,6 +9,7 @@
> #include <linux/namei.h>
> #include <linux/ctype.h>
> #include <linux/fs_context.h>
> +#include <linux/pseudo_fs.h>
>
> #include <linux/sunrpc/cache.h>
> #include <linux/sunrpc/svcsock.h>
> @@ -1375,6 +1376,7 @@ static int nfsd_init_fs_context(struct fs_context *fc)
> {
> put_user_ns(fc->user_ns);
> fc->user_ns = get_user_ns(fc->net_ns->user_ns);
> + fc_init_pseudo(fc);
> fc->ops = &nfsd_fs_context_ops;
> return 0;
> }
>
> --
> 2.53.0
Acked-by: Chuck Lever <cel@kernel.org>
--
Chuck Lever (Come to NFS bake-a-thon! https://nfsv4bat.org)
^ permalink raw reply [flat|nested] 59+ messages in thread
* [PATCH RFC 22/41] sunrpc: use fc_init_pseudo() for rpc_pipefs
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (20 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 21/41] nfsd: use fc_init_pseudo() Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 23/41] fuse: use fc_init_pseudo() for fusectl Christian Brauner
` (18 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize rpc_pipefs as a pseudo filesystem. This raises SB_I_PSEUDO and
also SB_I_NOEXEC and SB_I_NODEV. rpc_pipefs never holds executables or
device nodes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
net/sunrpc/rpc_pipe.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/net/sunrpc/rpc_pipe.c b/net/sunrpc/rpc_pipe.c
index 9d349cfbc483..37277a6d2415 100644
--- a/net/sunrpc/rpc_pipe.c
+++ b/net/sunrpc/rpc_pipe.c
@@ -15,6 +15,7 @@
#include <linux/pagemap.h>
#include <linux/mount.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/namei.h>
#include <linux/fsnotify.h>
#include <linux/kernel.h>
@@ -1181,6 +1182,7 @@ static int rpc_init_fs_context(struct fs_context *fc)
{
put_user_ns(fc->user_ns);
fc->user_ns = get_user_ns(fc->net_ns->user_ns);
+ fc_init_pseudo(fc);
fc->ops = &rpc_fs_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 23/41] fuse: use fc_init_pseudo() for fusectl
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (21 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 22/41] sunrpc: use fc_init_pseudo() for rpc_pipefs Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 24/41] efivarfs: use fc_init_pseudo() Christian Brauner
` (17 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize fusectl as a pseudo filesystem. This raises SB_I_PSEUDO and
also SB_I_NOEXEC and SB_I_NODEV. fusectl never holds executables or
device nodes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/fuse/control.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/fs/fuse/control.c b/fs/fuse/control.c
index 21ffde596d61..4497362e7df0 100644
--- a/fs/fuse/control.c
+++ b/fs/fuse/control.c
@@ -10,6 +10,7 @@
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/namei.h>
#define FUSE_CTL_SUPER_MAGIC 0x65735543
@@ -334,6 +335,7 @@ static const struct fs_context_operations fuse_ctl_context_ops = {
static int fuse_ctl_init_fs_context(struct fs_context *fsc)
{
+ fc_init_pseudo(fsc);
fsc->ops = &fuse_ctl_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 24/41] efivarfs: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (22 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 23/41] fuse: use fc_init_pseudo() for fusectl Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 25/41] pstore: " Christian Brauner
` (16 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize efivarfs as a pseudo filesystem. This raises SB_I_PSEUDO and
also SB_I_NOEXEC and SB_I_NODEV. efivarfs never holds executables or
device nodes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/efivarfs/super.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/fs/efivarfs/super.c b/fs/efivarfs/super.c
index 12746ced6dc6..e598d42c5f42 100644
--- a/fs/efivarfs/super.c
+++ b/fs/efivarfs/super.c
@@ -8,6 +8,7 @@
#include <linux/efi.h>
#include <linux/fs.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/fs_parser.h>
#include <linux/module.h>
#include <linux/pagemap.h>
@@ -554,6 +555,7 @@ static int efivarfs_init_fs_context(struct fs_context *fc)
}
fc->s_fs_info = sfi;
+ fc_init_pseudo(fc);
fc->ops = &efivarfs_context_ops;
return 0;
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 25/41] pstore: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (23 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 24/41] efivarfs: use fc_init_pseudo() Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 26/41] xenfs: " Christian Brauner
` (15 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize pstore as a pseudo filesystem. This raises SB_I_PSEUDO and
also SB_I_NOEXEC and SB_I_NODEV. pstore never holds executables or
device nodes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/pstore/inode.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/fs/pstore/inode.c b/fs/pstore/inode.c
index cf499ba72702..4658561cf90b 100644
--- a/fs/pstore/inode.c
+++ b/fs/pstore/inode.c
@@ -18,6 +18,7 @@
#include <linux/ramfs.h>
#include <linux/fs_parser.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/sched.h>
#include <linux/magic.h>
#include <linux/pstore.h>
@@ -491,6 +492,7 @@ static int pstore_init_fs_context(struct fs_context *fc)
ctx->kmsg_bytes = kmsg_bytes;
fc->fs_private = ctx;
+ fc_init_pseudo(fc);
fc->ops = &pstore_context_ops;
return 0;
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 26/41] xenfs: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (24 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 25/41] pstore: " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 27/41] openpromfs: " Christian Brauner
` (14 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize xenfs as a pseudo filesystem. This raises SB_I_PSEUDO and
also SB_I_NOEXEC and SB_I_NODEV. xenfs never holds executables or
device nodes.
SB_I_NOEXEC also refuses PROT_EXEC mappings. xenfs maps the xenstore
page and guest memory through privcmd, both data.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
drivers/xen/xenfs/super.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/xen/xenfs/super.c b/drivers/xen/xenfs/super.c
index 37ea7c5c0346..aba7d038ed73 100644
--- a/drivers/xen/xenfs/super.c
+++ b/drivers/xen/xenfs/super.c
@@ -15,6 +15,7 @@
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/magic.h>
#include <xen/xen.h>
@@ -80,6 +81,7 @@ static const struct fs_context_operations xenfs_context_ops = {
static int xenfs_init_fs_context(struct fs_context *fc)
{
+ fc_init_pseudo(fc);
fc->ops = &xenfs_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 27/41] openpromfs: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (25 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 26/41] xenfs: " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 28/41] ocfs2: use fc_init_pseudo() for dlmfs Christian Brauner
` (13 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize openpromfs as a pseudo filesystem. This raises SB_I_PSEUDO and
also SB_I_NOEXEC and SB_I_NODEV. openpromfs never holds executables or
device nodes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/openpromfs/inode.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/fs/openpromfs/inode.c b/fs/openpromfs/inode.c
index fb8d84bdedfb..6cd02d456bac 100644
--- a/fs/openpromfs/inode.c
+++ b/fs/openpromfs/inode.c
@@ -10,6 +10,7 @@
#include <linux/string.h>
#include <linux/fs.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/seq_file.h>
@@ -419,6 +420,7 @@ static const struct fs_context_operations openpromfs_context_ops = {
static int openpromfs_init_fs_context(struct fs_context *fc)
{
+ fc_init_pseudo(fc);
fc->ops = &openpromfs_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 28/41] ocfs2: use fc_init_pseudo() for dlmfs
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (26 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 27/41] openpromfs: " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 13:01 ` Jan Kara
2026-11-10 9:14 ` [PATCH RFC 29/41] s390/hypfs: use fc_init_pseudo() Christian Brauner
` (12 subsequent siblings)
40 siblings, 1 reply; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize dlmfs as a pseudo filesystem. This raises SB_I_PSEUDO and
also SB_I_NOEXEC and SB_I_NODEV. dlmfs never holds executables or
device nodes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/ocfs2/dlmfs/dlmfs.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c
index d3bfcada3e3b..1789ec96dc13 100644
--- a/fs/ocfs2/dlmfs/dlmfs.c
+++ b/fs/ocfs2/dlmfs/dlmfs.c
@@ -21,6 +21,7 @@
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/pagemap.h>
#include <linux/types.h>
#include <linux/slab.h>
@@ -563,6 +564,7 @@ static const struct fs_context_operations dlmfs_context_ops = {
static int dlmfs_init_fs_context(struct fs_context *fc)
{
+ fc_init_pseudo(fc);
fc->ops = &dlmfs_context_ops;
return 0;
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* Re: [PATCH RFC 28/41] ocfs2: use fc_init_pseudo() for dlmfs
2026-11-10 9:14 ` [PATCH RFC 28/41] ocfs2: use fc_init_pseudo() for dlmfs Christian Brauner
@ 2026-11-10 13:01 ` Jan Kara
0 siblings, 0 replies; 59+ messages in thread
From: Jan Kara @ 2026-11-10 13:01 UTC (permalink / raw)
To: Christian Brauner
Cc: linux-fsdevel, Jann Horn, Chris Mason, Josef Bacik,
Christoph Hellwig, linux-block, linux-kernel, linux-nvme,
Alexander Viro, Jan Kara, linux-scsi, target-devel, driver-core,
linux-mm, bpf, linux-security-module, selinux, apparmor,
linux-nfs, netdev, fuse-devel, linux-efi, xen-devel, ocfs2-devel,
linux-s390, linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest
On Tue 10-11-26 10:14:44, Christian Brauner wrote:
> Initialize dlmfs as a pseudo filesystem. This raises SB_I_PSEUDO and
> also SB_I_NOEXEC and SB_I_NODEV. dlmfs never holds executables or
> device nodes.
>
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Looks good. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> fs/ocfs2/dlmfs/dlmfs.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/fs/ocfs2/dlmfs/dlmfs.c b/fs/ocfs2/dlmfs/dlmfs.c
> index d3bfcada3e3b..1789ec96dc13 100644
> --- a/fs/ocfs2/dlmfs/dlmfs.c
> +++ b/fs/ocfs2/dlmfs/dlmfs.c
> @@ -21,6 +21,7 @@
> #include <linux/module.h>
> #include <linux/fs.h>
> #include <linux/fs_context.h>
> +#include <linux/pseudo_fs.h>
> #include <linux/pagemap.h>
> #include <linux/types.h>
> #include <linux/slab.h>
> @@ -563,6 +564,7 @@ static const struct fs_context_operations dlmfs_context_ops = {
>
> static int dlmfs_init_fs_context(struct fs_context *fc)
> {
> + fc_init_pseudo(fc);
> fc->ops = &dlmfs_context_ops;
>
> return 0;
>
> --
> 2.53.0
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 59+ messages in thread
* [PATCH RFC 29/41] s390/hypfs: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (27 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 28/41] ocfs2: use fc_init_pseudo() for dlmfs Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 30/41] powerpc/spufs: " Christian Brauner
` (11 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize hypfs as a pseudo filesystem. This raises SB_I_PSEUDO and
also SB_I_NOEXEC and SB_I_NODEV. hypfs never holds executables or
device nodes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
arch/s390/hypfs/inode.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/s390/hypfs/inode.c b/arch/s390/hypfs/inode.c
index 559b011e6880..8662169de477 100644
--- a/arch/s390/hypfs/inode.c
+++ b/arch/s390/hypfs/inode.c
@@ -12,6 +12,7 @@
#include <linux/errno.h>
#include <linux/fs.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/fs_parser.h>
#include <linux/namei.h>
#include <linux/vfs.h>
@@ -301,6 +302,7 @@ static int hypfs_init_fs_context(struct fs_context *fc)
sbi->gid = current_gid();
fc->s_fs_info = sbi;
+ fc_init_pseudo(fc);
fc->ops = &hypfs_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 30/41] powerpc/spufs: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (28 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 29/41] s390/hypfs: use fc_init_pseudo() Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 31/41] usb: gadget: f_fs: " Christian Brauner
` (10 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize spufs as a pseudo filesystem. This raises SB_I_PSEUDO and
also SB_I_NOEXEC and SB_I_NODEV. spufs never holds executables or
device nodes.
SB_I_NOEXEC also refuses PROT_EXEC mappings. The spufs files that can
be mapped expose local store and problem state areas of the SPU,
nothing the PPU executes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
arch/powerpc/platforms/cell/spufs/inode.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c
index f066d9c7344d..54b45932aecd 100644
--- a/arch/powerpc/platforms/cell/spufs/inode.c
+++ b/arch/powerpc/platforms/cell/spufs/inode.c
@@ -11,6 +11,7 @@
#include <linux/file.h>
#include <linux/fs.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/fs_parser.h>
#include <linux/fsnotify.h>
#include <linux/backing-dev.h>
@@ -741,6 +742,7 @@ static int spufs_init_fs_context(struct fs_context *fc)
fc->fs_private = ctx;
fc->s_fs_info = sbi;
+ fc_init_pseudo(fc);
fc->ops = &spufs_context_ops;
return 0;
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 31/41] usb: gadget: f_fs: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (29 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 30/41] powerpc/spufs: " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 32/41] usb: gadget: gadgetfs: " Christian Brauner
` (9 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize functionfs as a pseudo filesystem. This raises SB_I_PSEUDO and
also SB_I_NOEXEC and SB_I_NODEV. functionfs never holds executables or
device nodes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
drivers/usb/gadget/function/f_fs.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c
index c64a268e98a4..a6b3788399a5 100644
--- a/drivers/usb/gadget/function/f_fs.c
+++ b/drivers/usb/gadget/function/f_fs.c
@@ -15,6 +15,7 @@
/* #define VERBOSE_DEBUG */
#include <linux/blkdev.h>
+#include <linux/pseudo_fs.h>
#include <linux/dma-buf.h>
#include <linux/dma-fence.h>
#include <linux/dma-resv.h>
@@ -2166,6 +2167,7 @@ static int ffs_fs_init_fs_context(struct fs_context *fc)
ctx->no_disconnect = false;
fc->fs_private = ctx;
+ fc_init_pseudo(fc);
fc->ops = &ffs_fs_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 32/41] usb: gadget: gadgetfs: use fc_init_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (30 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 31/41] usb: gadget: f_fs: " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 33/41] fs: add file_is_pseudo() Christian Brauner
` (8 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Initialize gadgetfs as a pseudo filesystem. This raises SB_I_PSEUDO and
also SB_I_NOEXEC and SB_I_NODEV. gadgetfs never holds executables or
device nodes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
drivers/usb/gadget/legacy/inode.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c
index 7f6d8460152f..8490e5d0351e 100644
--- a/drivers/usb/gadget/legacy/inode.c
+++ b/drivers/usb/gadget/legacy/inode.c
@@ -13,6 +13,7 @@
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/fs_context.h>
+#include <linux/pseudo_fs.h>
#include <linux/pagemap.h>
#include <linux/uts.h>
#include <linux/wait.h>
@@ -2223,6 +2224,7 @@ static const struct fs_context_operations gadgetfs_context_ops = {
static int gadgetfs_init_fs_context(struct fs_context *fc)
{
+ fc_init_pseudo(fc);
fc->ops = &gadgetfs_context_ops;
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 33/41] fs: add file_is_pseudo()
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (31 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 32/41] usb: gadget: gadgetfs: " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 13:02 ` Jan Kara
2026-11-10 9:14 ` [PATCH RFC 34/41] loop: refuse files on pseudo filesystems as backing files Christian Brauner
` (7 subsequent siblings)
40 siblings, 1 reply; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Add a helper to check whether a file is a regular file on a pseudo
filesystem. Only regular files count. Device nodes on pseudo filesystems
such as devpts, binderfs or the block devices on bdevfs are what they
are.
Look at the inode that actually provides the data via d_real_inode().
overlayfs accepts sysfs, cgroup2, debugfs, tracefs, configfs and
securityfs as lower layers and reads of such an overlayfs file are
served by the file on the pseudo filesystem. Checking the overlayfs
inode would miss that.
No functional changes.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
include/linux/fs.h | 12 ++++++++++++
1 file changed, 12 insertions(+)
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 99caef43ff3c..407ffb6342ec 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2553,6 +2553,18 @@ static inline const struct inode *file_user_inode(const struct file *f)
return file_inode(f);
}
+/*
+ * Regular files on pseudo filesystems are kernel interfaces and must not be
+ * used as storage. Look through stacking filesystems at the inode that
+ * provides the data.
+ */
+static inline bool file_is_pseudo(const struct file *file)
+{
+ const struct inode *inode = d_real_inode(file->f_path.dentry);
+
+ return S_ISREG(inode->i_mode) && (inode->i_sb->s_iflags & SB_I_PSEUDO);
+}
+
static inline struct file *file_clone_open(struct file *file)
{
return dentry_open(&file->f_path, file->f_flags, file->f_cred);
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* Re: [PATCH RFC 33/41] fs: add file_is_pseudo()
2026-11-10 9:14 ` [PATCH RFC 33/41] fs: add file_is_pseudo() Christian Brauner
@ 2026-11-10 13:02 ` Jan Kara
0 siblings, 0 replies; 59+ messages in thread
From: Jan Kara @ 2026-11-10 13:02 UTC (permalink / raw)
To: Christian Brauner
Cc: linux-fsdevel, Jann Horn, Chris Mason, Josef Bacik,
Christoph Hellwig, linux-block, linux-kernel, linux-nvme,
Alexander Viro, Jan Kara, linux-scsi, target-devel, driver-core,
linux-mm, bpf, linux-security-module, selinux, apparmor,
linux-nfs, netdev, fuse-devel, linux-efi, xen-devel, ocfs2-devel,
linux-s390, linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest
On Tue 10-11-26 10:14:49, Christian Brauner wrote:
> Add a helper to check whether a file is a regular file on a pseudo
> filesystem. Only regular files count. Device nodes on pseudo filesystems
> such as devpts, binderfs or the block devices on bdevfs are what they
> are.
>
> Look at the inode that actually provides the data via d_real_inode().
> overlayfs accepts sysfs, cgroup2, debugfs, tracefs, configfs and
> securityfs as lower layers and reads of such an overlayfs file are
> served by the file on the pseudo filesystem. Checking the overlayfs
> inode would miss that.
>
> No functional changes.
>
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Looks good. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> include/linux/fs.h | 12 ++++++++++++
> 1 file changed, 12 insertions(+)
>
> diff --git a/include/linux/fs.h b/include/linux/fs.h
> index 99caef43ff3c..407ffb6342ec 100644
> --- a/include/linux/fs.h
> +++ b/include/linux/fs.h
> @@ -2553,6 +2553,18 @@ static inline const struct inode *file_user_inode(const struct file *f)
> return file_inode(f);
> }
>
> +/*
> + * Regular files on pseudo filesystems are kernel interfaces and must not be
> + * used as storage. Look through stacking filesystems at the inode that
> + * provides the data.
> + */
> +static inline bool file_is_pseudo(const struct file *file)
> +{
> + const struct inode *inode = d_real_inode(file->f_path.dentry);
> +
> + return S_ISREG(inode->i_mode) && (inode->i_sb->s_iflags & SB_I_PSEUDO);
> +}
> +
> static inline struct file *file_clone_open(struct file *file)
> {
> return dentry_open(&file->f_path, file->f_flags, file->f_cred);
>
> --
> 2.53.0
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 59+ messages in thread
* [PATCH RFC 34/41] loop: refuse files on pseudo filesystems as backing files
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (32 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 33/41] fs: add file_is_pseudo() Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 13:03 ` Jan Kara
2026-11-10 9:14 ` [PATCH RFC 35/41] zloop: refuse zone files on pseudo filesystems Christian Brauner
` (6 subsequent siblings)
40 siblings, 1 reply; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Currently loop accepts any regular file that implements ->read_iter() as
a backing file and any that also implements ->write_iter() as a writable
one. That includes files on procfs, sysfs and other pseudo filesystems.
For example, /proc/kcore attaches read-only as a loop device the size of
the kernel's virtual address space, 64 PiB with 5-level paging. sysfs
attributes attach read-write as 4096 byte loop devices. Writing a block
to the loop device of /sys/kernel/mm/transparent_hugepage/enabled
changes the THP setting.
That's not just nonsensical, it can be abused. Loop calls ->read_iter()
and ->write_iter() of the backing file directly from its worker which
runs with kernel credentials. But pseudo files enforce part of their
access rules at read and write time against current. Dozens of sysfs
->show() and ->store() methods call capable(). Behind a loop device all
of these checks are done against the loop worker instead of the task
that opened the file. And setting up a loop device requires no
capabilities, only access to the device nodes. So on v7.4-rc1:
- uid 0 without any capabilities can't write to /sys/kernel/reboot/mode
as mode_store() requires CAP_SYS_BOOT. Writing "warm" through a loop
device works.
- uid 0 without any capabilities can't read the files in
/sys/firmware/dmi/entries/*/ as dmi_sysfs_attr_show() requires
CAP_SYS_ADMIN. Reading them through a loop device works.
- An unprivileged container that was handed a loop device can't change
gro_flush_timeout of its own network devices as
gro_flush_timeout_store() requires CAP_NET_ADMIN in the initial user
namespace. Writing it through a loop device works.
The same goes for hard_offline_page, the md and sd attributes, rfkill
and others.
Refuse files on pseudo filesystems as loop backing files. Note that
file_is_pseudo() looks through overlayfs so stacking overlayfs on top of
sysfs doesn't get around this.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
drivers/block/loop.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index c96e35c3ef42..1482580a1979 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -537,6 +537,9 @@ static int loop_check_backing_file(struct file *file)
if ((file->f_mode & FMODE_WRITE) && !file->f_op->write_iter)
return -EINVAL;
+ if (file_is_pseudo(file))
+ return -EINVAL;
+
return 0;
}
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* Re: [PATCH RFC 34/41] loop: refuse files on pseudo filesystems as backing files
2026-11-10 9:14 ` [PATCH RFC 34/41] loop: refuse files on pseudo filesystems as backing files Christian Brauner
@ 2026-11-10 13:03 ` Jan Kara
0 siblings, 0 replies; 59+ messages in thread
From: Jan Kara @ 2026-11-10 13:03 UTC (permalink / raw)
To: Christian Brauner
Cc: linux-fsdevel, Jann Horn, Chris Mason, Josef Bacik,
Christoph Hellwig, linux-block, linux-kernel, linux-nvme,
Alexander Viro, Jan Kara, linux-scsi, target-devel, driver-core,
linux-mm, bpf, linux-security-module, selinux, apparmor,
linux-nfs, netdev, fuse-devel, linux-efi, xen-devel, ocfs2-devel,
linux-s390, linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest
On Tue 10-11-26 10:14:50, Christian Brauner wrote:
> Currently loop accepts any regular file that implements ->read_iter() as
> a backing file and any that also implements ->write_iter() as a writable
> one. That includes files on procfs, sysfs and other pseudo filesystems.
> For example, /proc/kcore attaches read-only as a loop device the size of
> the kernel's virtual address space, 64 PiB with 5-level paging. sysfs
> attributes attach read-write as 4096 byte loop devices. Writing a block
> to the loop device of /sys/kernel/mm/transparent_hugepage/enabled
> changes the THP setting.
>
> That's not just nonsensical, it can be abused. Loop calls ->read_iter()
> and ->write_iter() of the backing file directly from its worker which
> runs with kernel credentials. But pseudo files enforce part of their
> access rules at read and write time against current. Dozens of sysfs
> ->show() and ->store() methods call capable(). Behind a loop device all
> of these checks are done against the loop worker instead of the task
> that opened the file. And setting up a loop device requires no
> capabilities, only access to the device nodes. So on v7.4-rc1:
>
> - uid 0 without any capabilities can't write to /sys/kernel/reboot/mode
> as mode_store() requires CAP_SYS_BOOT. Writing "warm" through a loop
> device works.
>
> - uid 0 without any capabilities can't read the files in
> /sys/firmware/dmi/entries/*/ as dmi_sysfs_attr_show() requires
> CAP_SYS_ADMIN. Reading them through a loop device works.
>
> - An unprivileged container that was handed a loop device can't change
> gro_flush_timeout of its own network devices as
> gro_flush_timeout_store() requires CAP_NET_ADMIN in the initial user
> namespace. Writing it through a loop device works.
>
> The same goes for hard_offline_page, the md and sd attributes, rfkill
> and others.
>
> Refuse files on pseudo filesystems as loop backing files. Note that
> file_is_pseudo() looks through overlayfs so stacking overlayfs on top of
> sysfs doesn't get around this.
>
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Looks good. Feel free to add:
Reviewed-by: Jan Kara <jack@suse.cz>
Honza
> ---
> drivers/block/loop.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/drivers/block/loop.c b/drivers/block/loop.c
> index c96e35c3ef42..1482580a1979 100644
> --- a/drivers/block/loop.c
> +++ b/drivers/block/loop.c
> @@ -537,6 +537,9 @@ static int loop_check_backing_file(struct file *file)
> if ((file->f_mode & FMODE_WRITE) && !file->f_op->write_iter)
> return -EINVAL;
>
> + if (file_is_pseudo(file))
> + return -EINVAL;
> +
> return 0;
> }
>
>
> --
> 2.53.0
>
--
Jan Kara <jack@suse.com>
SUSE Labs, CR
^ permalink raw reply [flat|nested] 59+ messages in thread
* [PATCH RFC 35/41] zloop: refuse zone files on pseudo filesystems
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (33 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 34/41] loop: refuse files on pseudo filesystems as backing files Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 36/41] nvmet: refuse files on pseudo filesystems as namespace backing files Christian Brauner
` (5 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
zloop opens its zone files by name below the base directory but a bind
mount can put any file there, including a procfs or sysfs file. Refuse
files on pseudo filesystems as zone files just like loop does.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
drivers/block/zloop.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/block/zloop.c b/drivers/block/zloop.c
index 65634a39b0bf..dcc06dd47b04 100644
--- a/drivers/block/zloop.c
+++ b/drivers/block/zloop.c
@@ -1137,6 +1137,11 @@ static int zloop_init_zone(struct zloop_device *zlo, struct zloop_options *opts,
goto out_fput;
}
+ if (file_is_pseudo(zone->file)) {
+ ret = -EINVAL;
+ goto out_fput;
+ }
+
if (zlo->block_size) {
ret = zloop_get_block_size(zlo, zone);
if (ret)
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 36/41] nvmet: refuse files on pseudo filesystems as namespace backing files
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (34 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 35/41] zloop: refuse zone files on pseudo filesystems Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 15:07 ` Bui Nguyen Nhu Quynh
2026-11-10 9:14 ` [PATCH RFC 37/41] target: fileio: refuse files on pseudo filesystems as " Christian Brauner
` (4 subsequent siblings)
40 siblings, 1 reply; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
The file backend takes any path that isn't a block device. With
buffered_io=1 that includes files on procfs or sysfs which then get read
and written by a kernel worker on behalf of the host. Refuse files on
pseudo filesystems just like loop does.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
drivers/nvme/target/io-cmd-file.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/nvme/target/io-cmd-file.c b/drivers/nvme/target/io-cmd-file.c
index dfa8aa46188c..71c69bac5394 100644
--- a/drivers/nvme/target/io-cmd-file.c
+++ b/drivers/nvme/target/io-cmd-file.c
@@ -52,6 +52,11 @@ int nvmet_file_ns_enable(struct nvmet_ns *ns)
goto err;
}
+ if (file_is_pseudo(ns->file)) {
+ ret = -EINVAL;
+ goto err;
+ }
+
nvmet_file_ns_revalidate(ns);
/*
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* Re: [PATCH RFC 36/41] nvmet: refuse files on pseudo filesystems as namespace backing files
2026-11-10 9:14 ` [PATCH RFC 36/41] nvmet: refuse files on pseudo filesystems as namespace backing files Christian Brauner
@ 2026-11-10 15:07 ` Bui Nguyen Nhu Quynh
0 siblings, 0 replies; 59+ messages in thread
From: Bui Nguyen Nhu Quynh @ 2026-11-10 15:07 UTC (permalink / raw)
To: Christian Brauner, linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest
On 11/10/2026 4:14 PM, Christian Brauner wrote:
> The file backend takes any path that isn't a block device. With
> buffered_io=1 that includes files on procfs or sysfs which then get read
> and written by a kernel worker on behalf of the host. Refuse files on
> pseudo filesystems just like loop does.
>
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
> ---
> drivers/nvme/target/io-cmd-file.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/drivers/nvme/target/io-cmd-file.c b/drivers/nvme/target/io-cmd-file.c
> index dfa8aa46188c..71c69bac5394 100644
> --- a/drivers/nvme/target/io-cmd-file.c
> +++ b/drivers/nvme/target/io-cmd-file.c
> @@ -52,6 +52,11 @@ int nvmet_file_ns_enable(struct nvmet_ns *ns)
> goto err;
> }
>
> + if (file_is_pseudo(ns->file)) {
> + ret = -EINVAL;
> + goto err;
> + }
> +
> nvmet_file_ns_revalidate(ns);
>
> /*
>
I noticed patch 41/41 doesn't include a test for nvmet. Would it make
sense to add one with buffered_io=1? The test would need a pseudo file
that can be opened with O_RDWR and supports both read_iter and
write_iter. Otherwise, it could pass without ever reaching the new
file_is_pseudo() check.
Thanks.
^ permalink raw reply [flat|nested] 59+ messages in thread
* [PATCH RFC 37/41] target: fileio: refuse files on pseudo filesystems as backing files
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (35 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 36/41] nvmet: refuse files on pseudo filesystems as namespace backing files Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 38/41] fuse: refuse files on pseudo filesystems as passthrough " Christian Brauner
` (3 subsequent siblings)
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
fd_dev_name can name any file including files on procfs or sysfs. The
initiator then gets to read and write kernel interfaces through the LUN
with kernel credentials. Refuse files on pseudo filesystems just like
loop does.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
drivers/target/target_core_file.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/drivers/target/target_core_file.c b/drivers/target/target_core_file.c
index a5391e57e9aa..7a3cf63dc979 100644
--- a/drivers/target/target_core_file.c
+++ b/drivers/target/target_core_file.c
@@ -152,6 +152,13 @@ static int fd_configure_device(struct se_device *dev)
goto fail;
}
+ if (file_is_pseudo(file)) {
+ pr_err("FILEIO: %s is on a pseudo filesystem\n",
+ fd_dev->fd_dev_name);
+ ret = -EINVAL;
+ goto fail;
+ }
+
/*
* If using a block backend with this struct file, we extract
* fd_dev->fd_[block,dev]_size from struct block_device.
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 38/41] fuse: refuse files on pseudo filesystems as passthrough backing files
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (36 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 37/41] target: fileio: refuse files on pseudo filesystems as " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 10:14 ` Amir Goldstein
2026-11-10 9:14 ` [PATCH RFC 39/41] usb: gadget: f_mass_storage: refuse files on pseudo filesystems Christian Brauner
` (2 subsequent siblings)
40 siblings, 1 reply; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
The fuse server can register any regular file as a backing file. procfs
and binfmt_misc files are already refused by the stacking depth check as
both set s_stack_depth to FILESYSTEM_MAX_STACK_DEPTH. sysfs and the
other pseudo filesystems aren't. Reads and writes of the fuse file would
then be done on the pseudo file with the fuse server's credentials.
Refuse files on pseudo filesystems just like loop does.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/fuse/backing.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/fs/fuse/backing.c b/fs/fuse/backing.c
index 8c21a8a74efb..4e4fb810ddaa 100644
--- a/fs/fuse/backing.c
+++ b/fs/fuse/backing.c
@@ -147,6 +147,9 @@ static int fuse_backing_open_file(struct fuse_conn *fc, struct fuse_backing *fb,
if (inode->i_sb->s_stack_depth >= fc->max_stack_depth)
return -ELOOP;
+ if (file_is_pseudo(file))
+ return -EINVAL;
+
fb->type = FUSE_BACKING_PATH;
fb->path = file->f_path;
path_get(&fb->path);
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* Re: [PATCH RFC 38/41] fuse: refuse files on pseudo filesystems as passthrough backing files
2026-11-10 9:14 ` [PATCH RFC 38/41] fuse: refuse files on pseudo filesystems as passthrough " Christian Brauner
@ 2026-11-10 10:14 ` Amir Goldstein
0 siblings, 0 replies; 59+ messages in thread
From: Amir Goldstein @ 2026-11-10 10:14 UTC (permalink / raw)
To: Christian Brauner
Cc: linux-fsdevel, Jann Horn, Chris Mason, Josef Bacik,
Christoph Hellwig, linux-block, linux-kernel, linux-nvme,
Alexander Viro, Jan Kara, linux-scsi, target-devel, driver-core,
linux-mm, bpf, linux-security-module, selinux, apparmor,
linux-nfs, netdev, fuse-devel, linux-efi, xen-devel, ocfs2-devel,
linux-s390, linuxppc-dev, linux-usb, linux-erofs,
linux-kselftest
On Tue, Nov 10, 2026 at 10:14:54AM +0100, Christian Brauner wrote:
> The fuse server can register any regular file as a backing file. procfs
> and binfmt_misc files are already refused by the stacking depth check as
> both set s_stack_depth to FILESYSTEM_MAX_STACK_DEPTH. sysfs and the
> other pseudo filesystems aren't. Reads and writes of the fuse file would
> then be done on the pseudo file with the fuse server's credentials.
> Refuse files on pseudo filesystems just like loop does.
>
> Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
> ---
> fs/fuse/backing.c | 3 +++
> 1 file changed, 3 insertions(+)
>
> diff --git a/fs/fuse/backing.c b/fs/fuse/backing.c
> index 8c21a8a74efb..4e4fb810ddaa 100644
> --- a/fs/fuse/backing.c
> +++ b/fs/fuse/backing.c
> @@ -147,6 +147,9 @@ static int fuse_backing_open_file(struct fuse_conn *fc, struct fuse_backing *fb,
> if (inode->i_sb->s_stack_depth >= fc->max_stack_depth)
> return -ELOOP;
>
> + if (file_is_pseudo(file))
> + return -EINVAL;
> +
> fb->type = FUSE_BACKING_PATH;
> fb->path = file->f_path;
> path_get(&fb->path);
>
> --
> 2.53.0
>
Reviewed-by: Amir Goldstein <amir73il@gmail.com>
^ permalink raw reply [flat|nested] 59+ messages in thread
* [PATCH RFC 39/41] usb: gadget: f_mass_storage: refuse files on pseudo filesystems
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (37 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 38/41] fuse: refuse files on pseudo filesystems as passthrough " Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 40/41] erofs: refuse files on pseudo filesystems as backing files Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 41/41] selftests/filesystems: add backing file tests for pseudo files Christian Brauner
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
fsg_lun_open() takes any regular file as the backing file of a LUN. The
file-storage kthread then reads and writes it with kernel_read() and
kernel_write() on behalf of the USB host. With a procfs or sysfs file
behind a LUN the host gets to read and write kernel interfaces with
kernel credentials. Refuse files on pseudo filesystems just like loop
does.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
drivers/usb/gadget/function/storage_common.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/drivers/usb/gadget/function/storage_common.c b/drivers/usb/gadget/function/storage_common.c
index 75831f2c7abe..83683ade20c2 100644
--- a/drivers/usb/gadget/function/storage_common.c
+++ b/drivers/usb/gadget/function/storage_common.c
@@ -211,6 +211,11 @@ int fsg_lun_open(struct fsg_lun *curlun, const char *filename)
goto out;
}
+ if (file_is_pseudo(filp)) {
+ LINFO(curlun, "file on a pseudo filesystem: %s\n", filename);
+ goto out;
+ }
+
/*
* If we can't read the file, it's no good.
* If we can't write the file, use it read-only.
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 40/41] erofs: refuse files on pseudo filesystems as backing files
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (38 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 39/41] usb: gadget: f_mass_storage: refuse files on pseudo filesystems Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
2026-11-10 9:14 ` [PATCH RFC 41/41] selftests/filesystems: add backing file tests for pseudo files Christian Brauner
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
File-backed mounts take any regular file as the image and the same goes
for the extra devices of such a mount. erofs reads them with the
credentials of the mounter so this doesn't hand out anything the mounter
couldn't read anyway. But files on pseudo filesystems aren't images.
Refuse them just like loop does.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
fs/erofs/super.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/fs/erofs/super.c b/fs/erofs/super.c
index ce05557bd998..980d5fc2b576 100644
--- a/fs/erofs/super.c
+++ b/fs/erofs/super.c
@@ -158,7 +158,8 @@ static int erofs_init_device(struct erofs_buf *buf, struct super_block *sb,
if (!erofs_is_fileio_mode(sbi)) {
dif->dax_dev = fs_dax_get_by_bdev(file_bdev(file),
&dif->dax_part_off, NULL, NULL);
- } else if (!S_ISREG(file_inode(file)->i_mode)) {
+ } else if (!S_ISREG(file_inode(file)->i_mode) ||
+ file_is_pseudo(file)) {
fput(file);
return -EINVAL;
}
@@ -835,6 +836,9 @@ static int erofs_file_get_tree(struct fs_context *fc)
{
struct erofs_sb_info *sbi = fc->s_fs_info;
+ if (file_is_pseudo(sbi->dif0.file))
+ return invalfc(fc, "source is on a pseudo filesystem");
+
if (!test_opt(&sbi->opt, SUPERBLOCK_SHARE))
return get_tree_nodev(fc, erofs_fc_fill_super);
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread* [PATCH RFC 41/41] selftests/filesystems: add backing file tests for pseudo files
2026-11-10 9:14 [PATCH RFC 00/41] fs: don't use pseudo filesystem files as storage Christian Brauner
` (39 preceding siblings ...)
2026-11-10 9:14 ` [PATCH RFC 40/41] erofs: refuse files on pseudo filesystems as backing files Christian Brauner
@ 2026-11-10 9:14 ` Christian Brauner
40 siblings, 0 replies; 59+ messages in thread
From: Christian Brauner @ 2026-11-10 9:14 UTC (permalink / raw)
To: linux-fsdevel
Cc: Jann Horn, Chris Mason, Josef Bacik, Christoph Hellwig,
linux-block, linux-kernel, linux-nvme, Alexander Viro, Jan Kara,
linux-scsi, target-devel, driver-core, linux-mm, bpf,
linux-security-module, selinux, apparmor, linux-nfs, netdev,
fuse-devel, linux-efi, xen-devel, ocfs2-devel, linux-s390,
linuxppc-dev, linux-usb, Amir Goldstein, linux-erofs,
linux-kselftest, Christian Brauner (Amutable)
Add tests that files on pseudo filesystems can't be used as storage:
- a procfs file attached read-only to a loop device
- sysfs files attached read-only and read-write to a loop device
- a sysfs file behind a lower-only overlayfs attached to a loop device
- a sysfs file as the backing file of a usb mass storage gadget LUN
- a sysfs file as the source of a file-backed erofs mount
And make sure that a memfd and another loop device still work as loop
backing files and that loop refuses a backing file that isn't open for
reading.
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
---
tools/testing/selftests/filesystems/.gitignore | 1 +
tools/testing/selftests/filesystems/Makefile | 2 +-
tools/testing/selftests/filesystems/config | 9 +
.../selftests/filesystems/pseudo_backing_test.c | 274 +++++++++++++++++++++
4 files changed, 285 insertions(+), 1 deletion(-)
diff --git a/tools/testing/selftests/filesystems/.gitignore b/tools/testing/selftests/filesystems/.gitignore
index cf79000e4092..8df38eabb125 100644
--- a/tools/testing/selftests/filesystems/.gitignore
+++ b/tools/testing/selftests/filesystems/.gitignore
@@ -7,3 +7,4 @@ kernfs_test
idmapped_tmpfile
ustat_test
rw_hint_test
+pseudo_backing_test
diff --git a/tools/testing/selftests/filesystems/Makefile b/tools/testing/selftests/filesystems/Makefile
index fbd5c27505ef..0ebb9005bcd2 100644
--- a/tools/testing/selftests/filesystems/Makefile
+++ b/tools/testing/selftests/filesystems/Makefile
@@ -2,7 +2,7 @@
CFLAGS += $(KHDR_INCLUDES)
TEST_GEN_PROGS := devpts_pts anon_inode_test kernfs_test fclog ustat_test rw_hint_test
-TEST_GEN_PROGS += idmapped_tmpfile
+TEST_GEN_PROGS += idmapped_tmpfile pseudo_backing_test
TEST_GEN_PROGS_EXTENDED := dnotify_test
include ../lib.mk
diff --git a/tools/testing/selftests/filesystems/config b/tools/testing/selftests/filesystems/config
index 9f45bc493a30..228196160d29 100644
--- a/tools/testing/selftests/filesystems/config
+++ b/tools/testing/selftests/filesystems/config
@@ -6,3 +6,12 @@ CONFIG_NET=y
CONFIG_NET_NS=y
CONFIG_INET=y
CONFIG_SYSFS=y
+CONFIG_BLK_DEV_LOOP=y
+CONFIG_OVERLAY_FS=y
+CONFIG_TMPFS=y
+CONFIG_CONFIGFS_FS=y
+CONFIG_USB_GADGET=y
+CONFIG_USB_CONFIGFS=y
+CONFIG_USB_CONFIGFS_MASS_STORAGE=y
+CONFIG_EROFS_FS=y
+CONFIG_EROFS_FS_BACKED_BY_FILE=y
diff --git a/tools/testing/selftests/filesystems/pseudo_backing_test.c b/tools/testing/selftests/filesystems/pseudo_backing_test.c
new file mode 100644
index 000000000000..bc8e17ab8e6e
--- /dev/null
+++ b/tools/testing/selftests/filesystems/pseudo_backing_test.c
@@ -0,0 +1,274 @@
+// SPDX-License-Identifier: GPL-2.0
+#define _GNU_SOURCE
+
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+#include <sched.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <linux/loop.h>
+#include <linux/magic.h>
+#include <sys/ioctl.h>
+#include <sys/mman.h>
+#include <sys/mount.h>
+#include <sys/stat.h>
+#include <sys/vfs.h>
+
+#include "kselftest_harness.h"
+#include "wrappers.h"
+
+/*
+ * Put @fd behind a free loop device. The device is set up with
+ * LO_FLAGS_AUTOCLEAR and goes away again when it is closed here.
+ */
+static int loop_attach(int fd, bool rw, char *dev, size_t len)
+{
+ struct loop_config cfg = {};
+ int ctl, nr, lfd, ret = 0;
+
+ ctl = open("/dev/loop-control", O_RDWR | O_CLOEXEC);
+ if (ctl < 0)
+ return -errno;
+ nr = ioctl(ctl, LOOP_CTL_GET_FREE);
+ if (nr < 0)
+ ret = -errno;
+ close(ctl);
+ if (ret)
+ return ret;
+
+ snprintf(dev, len, "/dev/loop%d", nr);
+ lfd = open(dev, (rw ? O_RDWR : O_RDONLY) | O_CLOEXEC);
+ if (lfd < 0)
+ return -errno;
+
+ cfg.fd = fd;
+ cfg.info.lo_flags = LO_FLAGS_AUTOCLEAR;
+ if (!rw)
+ cfg.info.lo_flags |= LO_FLAGS_READ_ONLY;
+ if (ioctl(lfd, LOOP_CONFIGURE, &cfg)) {
+ ret = -errno;
+ close(lfd);
+ } else {
+ ret = lfd;
+ }
+ return ret;
+}
+
+static int attach_path(const char *path, bool rw)
+{
+ char dev[PATH_MAX];
+ int fd, ret;
+
+ fd = open(path, (rw ? O_RDWR : O_RDONLY) | O_CLOEXEC);
+ if (fd < 0)
+ return -errno;
+ ret = loop_attach(fd, rw, dev, sizeof(dev));
+ close(fd);
+ if (ret >= 0) {
+ close(ret);
+ ret = 0;
+ }
+ return ret;
+}
+
+static bool can_use_loop(void)
+{
+ return geteuid() == 0 && access("/dev/loop-control", R_OK | W_OK) == 0;
+}
+
+TEST(memfd_backing_file)
+{
+ char dev[PATH_MAX];
+ int fd, lfd;
+
+ if (!can_use_loop())
+ SKIP(return, "loop devices unavailable");
+
+ fd = memfd_create("pseudo_backing_test", MFD_CLOEXEC);
+ ASSERT_GE(fd, 0);
+ ASSERT_EQ(ftruncate(fd, 1 << 20), 0);
+
+ lfd = loop_attach(fd, true, dev, sizeof(dev));
+ ASSERT_GE(lfd, 0);
+ EXPECT_EQ(close(lfd), 0);
+ EXPECT_EQ(close(fd), 0);
+}
+
+TEST(loop_device_backing_file)
+{
+ char dev[PATH_MAX], dev2[PATH_MAX];
+ int fd, lfd, bfd, lfd2;
+
+ if (!can_use_loop())
+ SKIP(return, "loop devices unavailable");
+
+ fd = memfd_create("pseudo_backing_test", MFD_CLOEXEC);
+ ASSERT_GE(fd, 0);
+ ASSERT_EQ(ftruncate(fd, 1 << 20), 0);
+ lfd = loop_attach(fd, true, dev, sizeof(dev));
+ ASSERT_GE(lfd, 0);
+
+ /* A block device stays fine as a backing file. */
+ bfd = open(dev, O_RDWR | O_CLOEXEC);
+ ASSERT_GE(bfd, 0);
+ lfd2 = loop_attach(bfd, true, dev2, sizeof(dev2));
+ ASSERT_GE(lfd2, 0);
+
+ EXPECT_EQ(close(lfd2), 0);
+ EXPECT_EQ(close(bfd), 0);
+ EXPECT_EQ(close(lfd), 0);
+ EXPECT_EQ(close(fd), 0);
+}
+
+TEST(write_only_backing_file)
+{
+ char dev[PATH_MAX], path[PATH_MAX];
+ int fd, wfd, lfd;
+
+ if (!can_use_loop())
+ SKIP(return, "loop devices unavailable");
+
+ fd = memfd_create("pseudo_backing_test", MFD_CLOEXEC);
+ ASSERT_GE(fd, 0);
+ ASSERT_EQ(ftruncate(fd, 1 << 20), 0);
+
+ /* Loop reads from its backing file so it must be open for reading. */
+ snprintf(path, sizeof(path), "/proc/self/fd/%d", fd);
+ wfd = open(path, O_WRONLY | O_CLOEXEC);
+ ASSERT_GE(wfd, 0);
+
+ lfd = loop_attach(wfd, true, dev, sizeof(dev));
+ if (lfd >= 0)
+ close(lfd);
+ EXPECT_EQ(lfd, -EBADF);
+ EXPECT_EQ(close(wfd), 0);
+ EXPECT_EQ(close(fd), 0);
+}
+
+TEST(procfs_backing_file)
+{
+ if (!can_use_loop())
+ SKIP(return, "loop devices unavailable");
+
+ ASSERT_EQ(attach_path("/proc/cpuinfo", false), -EINVAL);
+}
+
+TEST(sysfs_backing_file)
+{
+ if (!can_use_loop())
+ SKIP(return, "loop devices unavailable");
+
+ ASSERT_EQ(attach_path("/sys/kernel/warn_count", false), -EINVAL);
+
+ if (access("/sys/kernel/reboot/mode", F_OK))
+ SKIP(return, "no /sys/kernel/reboot/mode");
+ ASSERT_EQ(attach_path("/sys/kernel/reboot/mode", true), -EINVAL);
+}
+
+TEST(overlayfs_on_sysfs_backing_file)
+{
+ if (!can_use_loop())
+ SKIP(return, "loop devices unavailable");
+
+ ASSERT_EQ(unshare(CLONE_NEWNS), 0);
+ ASSERT_EQ(mount(NULL, "/", NULL, MS_REC | MS_PRIVATE, NULL), 0);
+ ASSERT_EQ(mount("tmpfs", "/tmp", "tmpfs", 0, NULL), 0);
+ ASSERT_EQ(mkdir("/tmp/empty", 0755), 0);
+ ASSERT_EQ(mkdir("/tmp/merged", 0755), 0);
+
+ /* A lower-only overlayfs serves reads from sysfs. */
+ if (mount("overlay", "/tmp/merged", "overlay", MS_RDONLY,
+ "lowerdir=/sys/kernel:/tmp/empty"))
+ SKIP(return, "no overlayfs on top of sysfs: %s", strerror(errno));
+
+ ASSERT_EQ(attach_path("/tmp/merged/warn_count", false), -EINVAL);
+}
+
+#define CONFIGFS_DIR "/sys/kernel/config"
+#define GADGET_DIR CONFIGFS_DIR "/usb_gadget/pseudo_backing_test"
+#define MASS_STORAGE_DIR GADGET_DIR "/functions/mass_storage.0"
+
+TEST(usb_mass_storage_backing_file)
+{
+ const char *path = "/sys/kernel/warn_count";
+ struct statfs sfs;
+ ssize_t ret;
+ int fd, err;
+
+ if (geteuid())
+ SKIP(return, "needs root");
+
+ /* Mounting configfs on top of itself fails with EBUSY. */
+ if (statfs(CONFIGFS_DIR, &sfs) || sfs.f_type != CONFIGFS_MAGIC) {
+ ASSERT_EQ(unshare(CLONE_NEWNS), 0);
+ ASSERT_EQ(mount(NULL, "/", NULL, MS_REC | MS_PRIVATE, NULL), 0);
+ if (mount("configfs", CONFIGFS_DIR, "configfs", 0, NULL))
+ SKIP(return, "no configfs: %s", strerror(errno));
+ }
+
+ if (mkdir(GADGET_DIR, 0755))
+ SKIP(return, "no usb gadget configfs: %s", strerror(errno));
+ if (mkdir(MASS_STORAGE_DIR, 0755)) {
+ err = errno;
+ rmdir(GADGET_DIR);
+ SKIP(return, "no usb mass storage function: %s", strerror(err));
+ }
+
+ /* Writing the path opens the LUN's backing file right away. */
+ fd = open(MASS_STORAGE_DIR "/lun.0/file", O_WRONLY | O_CLOEXEC);
+ EXPECT_GE(fd, 0);
+ if (fd >= 0) {
+ ret = write(fd, path, strlen(path));
+ err = errno;
+ EXPECT_EQ(ret, -1);
+ EXPECT_EQ(err, EINVAL);
+ EXPECT_EQ(close(fd), 0);
+ }
+
+ EXPECT_EQ(rmdir(MASS_STORAGE_DIR), 0);
+ EXPECT_EQ(rmdir(GADGET_DIR), 0);
+}
+
+TEST(erofs_backing_file)
+{
+ bool refused = false;
+ char buf[256];
+ int fsfd, ret, err;
+ ssize_t n;
+
+ if (geteuid())
+ SKIP(return, "needs root");
+
+ fsfd = sys_fsopen("erofs", FSOPEN_CLOEXEC);
+ if (fsfd < 0)
+ SKIP(return, "no erofs: %s", strerror(errno));
+
+ ASSERT_EQ(sys_fsconfig(fsfd, FSCONFIG_SET_STRING, "source",
+ "/sys/kernel/warn_count", 0), 0);
+ ret = sys_fsconfig(fsfd, FSCONFIG_CMD_CREATE, NULL, NULL, 0);
+ err = errno;
+ if (ret && err == ENOTBLK) {
+ close(fsfd);
+ SKIP(return, "no file-backed erofs mounts");
+ }
+ ASSERT_EQ(ret, -1);
+ ASSERT_EQ(err, EINVAL);
+
+ /*
+ * Something that isn't an erofs image fails with EINVAL as well so
+ * check that the source itself was refused.
+ */
+ while ((n = read(fsfd, buf, sizeof(buf) - 1)) > 0) {
+ buf[n] = '\0';
+ if (strstr(buf, "pseudo filesystem"))
+ refused = true;
+ }
+ EXPECT_TRUE(refused);
+ EXPECT_EQ(close(fsfd), 0);
+}
+
+TEST_HARNESS_MAIN
--
2.53.0
^ permalink raw reply [flat|nested] 59+ messages in thread