Hey Linus, This is the batch of pull requests for the v7.0 merge window. This cycle has a few infrastructure pieces worth highlighting. There's nullfs, a completely catatonic minimal pseudo filesystem that serves as the immutable root of the mount hierarchy. The mutable rootfs (tmpfs/ramfs) is mounted on top of it. This allows userspace to simply pivot_root() in the initramfs without the traditional switch_root workarounds. nullfs is enabled unconditionally. If we see any real regression we'll hide it behind a boot option. There's an easy to revert change to make that happen. It will also serve as a foundation for creating completely empty mount namespaces in a future cycle. Along with nullfs, we remove the deprecated linuxrc-based initrd code path is removed. It was deprecated in 2020 and this completes the removal. Initramfs is entirely unaffected. The non-linuxrc initrd path (root=/dev/ram0) is preserved but now carries a deprecation warning targeting January 2027 removal. There a new OPEN_TREE_NAMESPACE extension for open_tree(). Container runtimes currently use CLONE_NEWNS to copy the caller's entire mount namespace only to then pivot_root() and recursively unmount everything they just copied. With large mount tables and thousands of parallel container launches this creates significant contention on the namespace semaphore. OPEN_TREE_NAMESPACE copies only the specified mount tree and returns a mount namespace fd instead of a detached mount fd — functioning as a combined unshare(CLONE_NEWNS) + pivot_root() in a single syscall. Using it for container creation brings about a 40% increase in throughput. We added a new STATMOUNT_BY_FD extension to statmount(). It now accepts a file descriptor as a parameter, returning mount information for the mount the fd resides on, including detached mounts. With every in-tree filesystem now converted to the new mount API, we can remove all the legacy code in fs_context.c for unconverted filesystems - about 280 lines including legacy_init_fs_context() and friends. The mount(2) syscall path for userspace is untouched. The timestamp update path is reworked to propagate IOCB_NOWAIT through ->update_time so that filesystems which can update timestamps without blocking are no longer penalized. Previously, file_update_time_flags() unconditionally returned -EAGAIN when IOCB_NOWAIT was set, making non-blocking direct writes impossible on essentially all filesystems. XFS implements non-blocking timestamp updates as the first user. Lease support is changed to require explicit opt-in. Previously kernel_setlease() fell through to generic_setlease() when a filesystem did not define ->setlease(), silently granting lease support to every filesystem. The new default returns -EINVAL when ->setlease is NULL. With the new default simple_nosetlease() becomes redundant and is removed. There's a new generic fserror infrastructure for reporting metadata corruption and file I/O errors to userspace via fsnotify. EFSCORRUPTED and EUCLEAN are promoted from private per-filesystem definitions to canonical errno.h values across all architectures. A new super_operations::report_error callback lets filesystem drivers respond to file I/O errors themselves. knfsd can now use atomic_open() via dentry_create(), eliminating the racy vfs_create() + vfs_open() sequence for combined exclusive create and open operations. Btrfs drops its private copies of may_delete() and may_create() in favor of newly exported may_delete_dentry() and may_create_dentry(), removing ~70 lines of duplicated code that had drifted out of sync with the VFS originals. On the scalability side, pid allocation is reworked to only take pidmap_lock once instead of twice during alloc_pid(), improving thread creation/teardown throughput by 10-16%. File lock presence is tracked via a flag in ->i_opflags instead of reading ->i_flctx, avoiding false-sharing on open/close hot paths with a measured 4-16% improvement. A redundant DCACHE_MANAGED_DENTRY check in __follow_mount_rcu() that caused a 100% mispredicted branch is removed. Smaller items include minix superblock validation hardening (syzbot), iomap plumbing for erofs page cache sharing preliminaries, a fix for invalid folio access after folio_end_read(), posix_acl_to_xattr() now allocating the buffer internally since every caller was doing it anyway, chardev cleanup API conversion, the start of deprecating legacy BSD process accounting (acct(2)), Rust VFS helper annotations for LTO inlining, and the usual collection of kernel-doc fixes and cleanups. Note that I will have some pull requests coming in during the second half of the merge window as linux-next had to temporarily drop them last week when a selftest build error happened. So I'm delaying them a bit. Thanks! Christian
Hey Linus,
/* Summary */
This contains the rust changes for this cycle.
llow inlining C helpers into Rust when using LTO: Add the __rust_helper
annotation to all VFS-related Rust helper functions.
Currently, C helpers cannot be inlined into Rust code even under LTO because
LLVM detects slightly different codegen options between the C and Rust
compilation units (differing null-pointer-check flags, builtin lists, and
target feature strings). The __rust_helper macro is the first step toward
fixing this: it is currently #defined to nothing, but a follow-up series will
change it to __always_inline when compiling with LTO (while keeping it empty
for bindgen, which ignores inline functions).
This picks up the VFS portion (fs, pid_namespace, poll) of a larger tree-wide
series.
/* Testing */
gcc (Debian 14.2.0-19) 14.2.0
Debian clang version 19.1.7 (3+b1)
No build failures or warnings were observed.
/* Conflicts */
Merge conflicts with mainline
=============================
No known conflicts.
Merge conflicts with other trees
================================
The following changes since commit 8f0b4cce4481fb22653697cced8d0d04027cb1e8:
Linux 6.19-rc1 (2025-12-14 16:05:07 +1200)
are available in the Git repository at:
git@gitolite.kernel.org:pub/scm/linux/kernel/git/vfs/vfs tags/vfs-7.0-rc1.rust
for you to fetch changes up to 5334fc280735dcf5882511a219a99b5759e14870:
Merge patch series "Allow inlining C helpers into Rust when using LTO" (2025-12-15 14:13:04 +0100)
----------------------------------------------------------------
vfs-7.0-rc1.rust
Please consider pulling these changes from the signed vfs-7.0-rc1.rust tag.
Thanks!
Christian
----------------------------------------------------------------
Alice Ryhl (3):
rust: fs: add __rust_helper to helpers
rust: pid_namespace: add __rust_helper to helpers
rust: poll: add __rust_helper to helpers
Christian Brauner (1):
Merge patch series "Allow inlining C helpers into Rust when using LTO"
rust/helpers/fs.c | 2 +-
rust/helpers/pid_namespace.c | 8 +++++---
rust/helpers/poll.c | 5 +++--
3 files changed, 9 insertions(+), 6 deletions(-)
Hey Linus,
/* Summary */
This contains the changes to support non-blocking timestamp updates.
Since 66fa3cedf16a ("fs: Add async write file modification handling.")
file_update_time_flags() unconditionally returns -EAGAIN when any
timestamp needs updating and IOCB_NOWAIT is set. This makes
non-blocking direct writes impossible on file systems with granular
enough timestamps, which in practice means all of them.
This series reworks the timestamp update path to propagate IOCB_NOWAIT
through ->update_time so that file systems which can update timestamps
without blocking are no longer penalized.
With that groundwork in place, the core change passes IOCB_NOWAIT into
->update_time and returns -EAGAIN only when the file system indicates it
would block. XFS implements non-blocking timestamp updates by using the
new ->sync_lazytime and open-coding generic_update_time without the
S_NOWAIT check, since the lazytime path through the generic helpers can
never block in XFS.
/* Testing */
gcc (Debian 14.2.0-19) 14.2.0
Debian clang version 19.1.7 (3+b1)
No build failures or warnings were observed.
/* Conflicts */
Merge conflicts with mainline
=============================
No known conflicts.
Merge conflicts with other trees
================================
The following changes since commit 8f0b4cce4481fb22653697cced8d0d04027cb1e8:
Linux 6.19-rc1 (2025-12-14 16:05:07 +1200)
are available in the Git repository at:
git@gitolite.kernel.org:pub/scm/linux/kernel/git/vfs/vfs tags/vfs-7.0-rc1.nonblocking_timestamps
for you to fetch changes up to 77ef2c3ff5916d358c436911ca6a961060709f04:
Merge patch series "re-enable IOCB_NOWAIT writes to files v6" (2026-01-12 14:01:42 +0100)
----------------------------------------------------------------
vfs-7.0-rc1.nonblocking_timestamps
Please consider pulling these changes from the signed vfs-7.0-rc1.nonblocking_timestamps tag.
Thanks!
Christian
----------------------------------------------------------------
Christian Brauner (1):
Merge patch series "re-enable IOCB_NOWAIT writes to files v6"
Christoph Hellwig (11):
fs: remove inode_update_time
fs: allow error returns from generic_update_time
nfs: split nfs_update_timestamps
fat: cleanup the flags for fat_truncate_time
fs: refactor ->update_time handling
fs: factor out a sync_lazytime helper
fs: add a ->sync_lazytime method
fs: add support for non-blocking timestamp updates
fs: refactor file_update_time_flags
xfs: implement ->sync_lazytime
xfs: enable non-blocking timestamp updates
Documentation/filesystems/locking.rst | 5 +-
Documentation/filesystems/vfs.rst | 9 +-
fs/bad_inode.c | 3 +-
fs/btrfs/inode.c | 13 ++-
fs/fat/dir.c | 2 +-
fs/fat/fat.h | 11 +-
fs/fat/file.c | 14 +--
fs/fat/inode.c | 2 +-
fs/fat/misc.c | 59 ++++------
fs/fat/namei_msdos.c | 13 +--
fs/fat/namei_vfat.c | 9 +-
fs/fs-writeback.c | 33 ++++--
fs/gfs2/inode.c | 9 +-
fs/inode.c | 202 ++++++++++++++++++----------------
fs/internal.h | 3 +-
fs/nfs/inode.c | 37 +++----
fs/orangefs/inode.c | 29 +++--
fs/orangefs/orangefs-kernel.h | 3 +-
fs/overlayfs/inode.c | 7 +-
fs/overlayfs/overlayfs.h | 3 +-
fs/sync.c | 4 +-
fs/ubifs/file.c | 28 ++---
fs/ubifs/ubifs.h | 3 +-
fs/xfs/xfs_iops.c | 49 ++++++---
fs/xfs/xfs_super.c | 29 -----
include/linux/fs.h | 30 +++--
include/trace/events/writeback.h | 6 -
27 files changed, 325 insertions(+), 290 deletions(-)
Hey Linus,
/* Summary */
This contains the changes to support generif I/O error reporting.
Filesystems currently have no standard mechanism for reporting metadata
corruption and file I/O errors to userspace via fsnotify. Each
filesystem (xfs, ext4, erofs, f2fs, etc.) privately defines
EFSCORRUPTED, and error reporting to fanotify is inconsistent or absent
entirely.
This series introduces a generic fserror infrastructure built around
struct super_block that gives filesystems a standard way to queue
metadata and file I/O error reports for delivery to fsnotify. Errors
are queued via mempools and queue_work to avoid holding filesystem locks
in the notification path; unmount waits for pending events to drain. A
new super_operations::report_error callback lets filesystem drivers
respond to file I/O errors themselves (to be used by an upcoming XFS
self-healing patchset).
On the uapi side, EFSCORRUPTED and EUCLEAN are promoted from private
per-filesystem definitions to canonical errno.h values across all
architectures.
/* Testing */
gcc (Debian 14.2.0-19) 14.2.0
Debian clang version 19.1.7 (3+b1)
No build failures or warnings were observed.
/* Conflicts */
Merge conflicts with mainline
=============================
No known conflicts.
Merge conflicts with other trees
================================
The following changes since commit 8f0b4cce4481fb22653697cced8d0d04027cb1e8:
Linux 6.19-rc1 (2025-12-14 16:05:07 +1200)
are available in the Git repository at:
git@gitolite.kernel.org:pub/scm/linux/kernel/git/vfs/vfs tags/vfs-7.0-rc1.fserror
for you to fetch changes up to 347b7042fb26beaae1ea46d0f6c47251fb52985f:
Merge patch series "fs: generic file IO error reporting" (2026-01-13 09:58:07 +0100)
----------------------------------------------------------------
vfs-7.0-rc1.fserror
Please consider pulling these changes from the signed vfs-7.0-rc1.fserror tag.
Thanks!
Christian
----------------------------------------------------------------
Christian Brauner (1):
Merge patch series "fs: generic file IO error reporting"
Darrick J. Wong (6):
uapi: promote EFSCORRUPTED and EUCLEAN to errno.h
fs: report filesystem and file I/O errors to fsnotify
iomap: report file I/O errors to the VFS
xfs: report fs metadata errors via fsnotify
xfs: translate fsdax media errors into file "data lost" errors when convenient
ext4: convert to new fserror helpers
arch/alpha/include/uapi/asm/errno.h | 2 +
arch/mips/include/uapi/asm/errno.h | 2 +
arch/parisc/include/uapi/asm/errno.h | 2 +
arch/sparc/include/uapi/asm/errno.h | 2 +
fs/Makefile | 2 +-
fs/erofs/internal.h | 2 -
fs/ext2/ext2.h | 1 -
fs/ext4/ext4.h | 3 -
fs/ext4/ioctl.c | 2 +
fs/ext4/super.c | 13 +-
fs/f2fs/f2fs.h | 3 -
fs/fserror.c | 194 +++++++++++++++++++++++++++++
fs/iomap/buffered-io.c | 23 +++-
fs/iomap/direct-io.c | 12 ++
fs/iomap/ioend.c | 6 +
fs/minix/minix.h | 2 -
fs/super.c | 3 +
fs/udf/udf_sb.h | 2 -
fs/xfs/xfs_fsops.c | 4 +
fs/xfs/xfs_health.c | 14 +++
fs/xfs/xfs_linux.h | 2 -
fs/xfs/xfs_notify_failure.c | 4 +
include/linux/fs/super_types.h | 7 ++
include/linux/fserror.h | 75 +++++++++++
include/linux/jbd2.h | 3 -
include/uapi/asm-generic/errno.h | 2 +
tools/arch/alpha/include/uapi/asm/errno.h | 2 +
tools/arch/mips/include/uapi/asm/errno.h | 2 +
tools/arch/parisc/include/uapi/asm/errno.h | 2 +
tools/arch/sparc/include/uapi/asm/errno.h | 2 +
tools/include/uapi/asm-generic/errno.h | 2 +
31 files changed, 373 insertions(+), 24 deletions(-)
create mode 100644 fs/fserror.c
create mode 100644 include/linux/fserror.h
Hey Linus,
/* Summary */
This contains some changes for btrfs that are taken to the vfs tree to
stop duplicating VFS code for subvolume/snapshot dentry
Btrfs has carried private copies of the VFS may_delete() and
may_create() functions in fs/btrfs/ioctl.c for permission checks
during subvolume creation and snapshot destruction. These copies have
drifted out of sync with the VFS originals — btrfs_may_delete() is
missing the uid/gid validity check and btrfs_may_create() is missing
the audit_inode_child() call.
Export the VFS functions as may_create_dentry() and
may_delete_dentry() and switch btrfs to use them, removing ~70 lines
of duplicated code.
/* Testing */
gcc (Debian 14.2.0-19) 14.2.0
Debian clang version 19.1.7 (3+b1)
No build failures or warnings were observed.
/* Conflicts */
Merge conflicts with mainline
=============================
No known conflicts.
Merge conflicts with other trees
================================
The following changes since commit 8f0b4cce4481fb22653697cced8d0d04027cb1e8:
Linux 6.19-rc1 (2025-12-14 16:05:07 +1200)
are available in the Git repository at:
git@gitolite.kernel.org:pub/scm/linux/kernel/git/vfs/vfs tags/vfs-7.0-rc1.btrfs
for you to fetch changes up to f97f020075e83d05695d3f86469d50e21eccffab:
Merge patch series "btrfs: stop duplicating VFS code for subvolume/snapshot dentry" (2026-01-14 17:17:53 +0100)
----------------------------------------------------------------
vfs-7.0-rc1.btrfs
Please consider pulling these changes from the signed vfs-7.0-rc1.btrfs tag.
Thanks!
Christian
----------------------------------------------------------------
Christian Brauner (1):
Merge patch series "btrfs: stop duplicating VFS code for subvolume/snapshot dentry"
Filipe Manana (4):
fs: export may_delete() as may_delete_dentry()
fs: export may_create() as may_create_dentry()
btrfs: use may_delete_dentry() in btrfs_ioctl_snap_destroy()
btrfs: use may_create_dentry() in btrfs_mksubvol()
fs/btrfs/ioctl.c | 73 ++----------------------------------------------------
fs/namei.c | 36 ++++++++++++++-------------
include/linux/fs.h | 5 ++++
3 files changed, 26 insertions(+), 88 deletions(-)
Hey Linus,
/* Summary */
This contains minix changes for this cycle.
Add required sanity checking to minix_check_superblock() The minix
filesystem driver does not validate several superblock fields before
using them during mount, allowing a crafted filesystem image to trigger
out-of-bounds accesses (reported by syzbot).
Consolidate and strengthen superblock validation in
minix_check_superblock().
/* Testing */
gcc (Debian 14.2.0-19) 14.2.0
Debian clang version 19.1.7 (3+b1)
No build failures or warnings were observed.
/* Conflicts */
Merge conflicts with mainline
=============================
No known conflicts.
Merge conflicts with other trees
================================
The following changes since commit 8f0b4cce4481fb22653697cced8d0d04027cb1e8:
Linux 6.19-rc1 (2025-12-14 16:05:07 +1200)
are available in the Git repository at:
git@gitolite.kernel.org:pub/scm/linux/kernel/git/vfs/vfs tags/vfs-7.0-rc1.minix
for you to fetch changes up to 8c97a6ddc95690a938ded44b4e3202f03f15078c:
minix: Add required sanity checking to minix_check_superblock() (2026-01-19 12:16:06 +0100)
----------------------------------------------------------------
vfs-7.0-rc1.minix
Please consider pulling these changes from the signed vfs-7.0-rc1.minix tag.
Thanks!
Christian
----------------------------------------------------------------
Jori Koolstra (1):
minix: Add required sanity checking to minix_check_superblock()
fs/minix/inode.c | 50 +++++++++++++++++++++++++++++---------------------
1 file changed, 29 insertions(+), 21 deletions(-)
Hey Linus,
/* Summary */
Allow knfsd to use atomic_open():
While knfsd offers combined exclusive create and open results to
clients, on some filesystems those results are not atomic. The
separate vfs_create() + vfs_open() sequence in dentry_create() can
produce races and unexpected errors. For example, open O_CREAT with
mode 0 will succeed in creating the file but return -EACCES from
vfs_open(). Additionally, network filesystems benefit from reducing
remote round-trip operations by using a single atomic_open() call.
Teach dentry_create() -- whose sole caller is knfsd -- to use
atomic_open() for filesystems that support it.
/* Testing */
gcc (Debian 14.2.0-19) 14.2.0
Debian clang version 19.1.7 (3+b1)
No build failures or warnings were observed.
/* Conflicts */
Merge conflicts with mainline
=============================
No known conflicts.
Merge conflicts with other trees
================================
The following changes since commit 8f0b4cce4481fb22653697cced8d0d04027cb1e8:
Linux 6.19-rc1 (2025-12-14 16:05:07 +1200)
are available in the Git repository at:
git@gitolite.kernel.org:pub/scm/linux/kernel/git/vfs/vfs tags/vfs-7.0-rc1.atomic_open
for you to fetch changes up to 6ea258d1f6895c61af212473b51477d39b8c99d2:
fs/namei: fix kernel-doc markup for dentry_create (2026-01-20 14:54:01 +0100)
----------------------------------------------------------------
vfs-7.0-rc1.atomic_open
Please consider pulling these changes from the signed vfs-7.0-rc1.atomic_open tag.
Thanks!
Christian
----------------------------------------------------------------
Benjamin Coddington (3):
VFS: move dentry_create() from fs/open.c to fs/namei.c
VFS: Prepare atomic_open() for dentry_create()
VFS/knfsd: Teach dentry_create() to use atomic_open()
Christian Brauner (1):
Merge patch series "Allow knfsd to use atomic_open()"
Jay Winston (1):
fs/namei: fix kernel-doc markup for dentry_create
fs/namei.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++++-----
fs/nfsd/nfs4proc.c | 11 ++++++--
fs/open.c | 39 --------------------------
include/linux/fs.h | 2 +-
4 files changed, 82 insertions(+), 50 deletions(-)
Hey Linus,
/* Summary */
This contains the mount changes for this cycle.
statmount: accept fd as a parameter
Extend struct mnt_id_req with a file descriptor field and a new
STATMOUNT_BY_FD flag. When set, statmount() returns mount information for the
mount the fd resides on — including detached mounts (unmounted via
umount2(MNT_DETACH)). For detached mounts the STATMOUNT_MNT_POINT and
STATMOUNT_MNT_NS_ID mask bits are cleared since neither is meaningful. The
capability check is skipped for STATMOUNT_BY_FD since holding an fd already
implies prior access to the mount and equivalent information is available
through fstatfs() and /proc/pid/mountinfo without privilege. Includes
comprehensive selftests covering both attached and detached mount cases.
fs: Remove internal old mount API code (1 patch)
Now that every in-tree filesystem has been converted to the new mount API,
remove all the legacy shim code in fs_context.c that handled unconverted
filesystems. This deletes ~280 lines including legacy_init_fs_context(), the
legacy_fs_context struct, and associated wrappers. The mount(2) syscall path
for userspace remains untouched. Documentation references to the legacy
callbacks are cleaned up.
mount: add OPEN_TREE_NAMESPACE (2 patches)
Add OPEN_TREE_NAMESPACE to open_tree(). Container runtimes currently use
CLONE_NEWNS to copy the caller's entire mount namespace — only to then
pivot_root() and recursively unmount everything they just copied. With large
mount tables and thousands of parallel container launches this creates
significant contention on the namespace semaphore.
OPEN_TREE_NAMESPACE copies only the specified mount tree (like
OPEN_TREE_CLONE) but returns a mount namespace fd instead of a detached mount
fd. The new namespace contains the copied tree mounted on top of a clone of
the real rootfs. This functions as a combined unshare(CLONE_NEWNS) +
pivot_root() in a single syscall. Works with user namespaces: an
unshare(CLONE_NEWUSER) followed by OPEN_TREE_NAMESPACE creates a mount
namespace owned by the new user namespace. Mount namespace file mounts are
excluded from the copy to prevent cycles. Includes ~1000 lines of selftests.
/* Testing */
gcc (Debian 14.2.0-19) 14.2.0
Debian clang version 19.1.7 (3+b1)
No build failures or warnings were observed.
/* Conflicts */
Merge conflicts with mainline
=============================
No known conflicts.
Merge conflicts with other trees
================================
The following changes since commit 8f0b4cce4481fb22653697cced8d0d04027cb1e8:
Linux 6.19-rc1 (2025-12-14 16:05:07 +1200)
are available in the Git repository at:
git@gitolite.kernel.org:pub/scm/linux/kernel/git/vfs/vfs tags/vfs-7.0-rc1.namespace
for you to fetch changes up to 1bce1a664ac25d37a327c433a01bc347f0a81bd6:
Merge patch series "mount: add OPEN_TREE_NAMESPACE" (2026-01-16 19:21:40 +0100)
----------------------------------------------------------------
vfs-7.0-rc1.namespace
Please consider pulling these changes from the signed vfs-7.0-rc1.namespace tag.
Thanks!
Christian
----------------------------------------------------------------
Bhavik Sachdev (3):
statmount: permission check should return EPERM
statmount: accept fd as a parameter
selftests: statmount: tests for STATMOUNT_BY_FD
Christian Brauner (4):
Merge patch series "statmount: accept fd as a parameter"
mount: add OPEN_TREE_NAMESPACE
selftests/open_tree: add OPEN_TREE_NAMESPACE tests
Merge patch series "mount: add OPEN_TREE_NAMESPACE"
Eric Sandeen (1):
fs: Remove internal old mount API code
Documentation/filesystems/locking.rst | 8 -
Documentation/filesystems/mount_api.rst | 2 -
Documentation/filesystems/porting.rst | 7 +-
Documentation/filesystems/vfs.rst | 58 +-
fs/fs_context.c | 208 +---
fs/fsopen.c | 10 -
fs/internal.h | 2 +-
fs/namespace.c | 265 ++++-
fs/nsfs.c | 13 +
include/linux/fs.h | 2 -
include/linux/fs/super_types.h | 1 -
include/uapi/linux/mount.h | 13 +-
.../selftests/filesystems/open_tree_ns/.gitignore | 1 +
.../selftests/filesystems/open_tree_ns/Makefile | 10 +
.../filesystems/open_tree_ns/open_tree_ns_test.c | 1030 ++++++++++++++++++++
.../selftests/filesystems/statmount/statmount.h | 15 +-
.../filesystems/statmount/statmount_test.c | 261 ++++-
.../filesystems/statmount/statmount_test_ns.c | 101 +-
tools/testing/selftests/filesystems/utils.c | 26 +
tools/testing/selftests/filesystems/utils.h | 1 +
20 files changed, 1669 insertions(+), 365 deletions(-)
create mode 100644 tools/testing/selftests/filesystems/open_tree_ns/.gitignore
create mode 100644 tools/testing/selftests/filesystems/open_tree_ns/Makefile
create mode 100644 tools/testing/selftests/filesystems/open_tree_ns/open_tree_ns_test.c
Hey Linus,
/* Summary */
This contains a mix of VFS cleanups, performance improvements, API fixes,
documentation, and a deprecation notice.
Scalability and performance:
- Rework pid allocation to only take pidmap_lock once instead of twice
during alloc_pid(), improving thread creation/teardown throughput by
10-16% depending on false-sharing luck. Pad the namespace refcount to
reduce false-sharing.
- Track file lock presence via a flag in ->i_opflags instead of reading
->i_flctx, avoiding false-sharing with ->i_readcount on open/close
hot paths. Measured 4-16% improvement on 24-core open-in-a-loop
benchmarks.
- Use a consume fence in locks_inode_context() to match the
store-release/load-consume idiom, eliminating a hardware fence on
some architectures.
- Annotate cdev_lock with __cacheline_aligned_in_smp to prevent
false-sharing.
- Remove a redundant DCACHE_MANAGED_DENTRY check in
__follow_mount_rcu() that never fires since the caller already
verifies it, eliminating a 100% mispredicted branch.
- Fix a 100% mispredicted likely() hint in devcgroup_inode_permission()
that became wrong after a prior code reorder.
Bug fixes and correctness:
- Make insert_inode_locked() wait for inode destruction instead of
skipping, fixing a corner case where two matching inodes could exist
in the hash.
- Move f_mode initialization before file_ref_init() in alloc_file() to
respect the SLAB_TYPESAFE_BY_RCU ordering contract.
- Add a WARN_ON_ONCE guard in try_to_free_buffers() for folios with no
buffers attached, preventing a null pointer dereference when
AS_RELEASE_ALWAYS is set but no release_folio op exists.
- Fix select restart_block to store end_time as timespec64, avoiding
truncation of tv_sec on 32-bit architectures.
- Make dump_inode() use get_kernel_nofault() to safely access inode and
superblock fields, matching the dump_mapping() pattern.
API modernization:
- Make posix_acl_to_xattr() allocate the buffer internally since every
single caller was doing it anyway. Reduces boilerplate and
unnecessary error checking across ~15 filesystems.
- Replace deprecated simple_strtoul() with kstrtoul() for the
ihash_entries, dhash_entries, mhash_entries, and mphash_entries boot
parameters, adding proper error handling.
- Convert chardev code to use guard(mutex) and __free(kfree) cleanup
patterns.
- Replace min_t() with min() or umin() in VFS code to avoid silently
truncating unsigned long to unsigned int.
- Gate LOOKUP_RCU assertions behind CONFIG_DEBUG_VFS since callers
already check the flag.
Deprecation:
- Begin deprecating legacy BSD process accounting (acct(2)). The
interface has numerous footguns and better alternatives exist (eBPF).
Documentation:
- Fix and complete kernel-doc for struct export_operations, removing
duplicated documentation between ReST and source.
- Fix kernel-doc warnings for __start_dirop() and ilookup5_nowait().
Testing:
- Add a kunit test for initramfs cpio handling of entries with
filesize > PATH_MAX.
Misc:
- Add missing <linux/init_task.h> include in fs_struct.c.
/* Testing */
gcc (Debian 14.2.0-19) 14.2.0
Debian clang version 19.1.7 (3+b1)
No build failures or warnings were observed.
/* Conflicts */
Merge conflicts with mainline
=============================
No known conflicts.
Merge conflicts with other trees
================================
The following changes since commit 8f0b4cce4481fb22653697cced8d0d04027cb1e8:
Linux 6.19-rc1 (2025-12-14 16:05:07 +1200)
are available in the Git repository at:
git@gitolite.kernel.org:pub/scm/linux/kernel/git/vfs/vfs tags/vfs-7.0-rc1.misc
for you to fetch changes up to 6cbfdf89470ef3c2110f376a507d135e7a7a7378:
posix_acl: make posix_acl_to_xattr() alloc the buffer (2026-01-16 10:51:12 +0100)
----------------------------------------------------------------
vfs-7.0-rc1.misc
Please consider pulling these changes from the signed vfs-7.0-rc1.misc tag.
Thanks!
Christian
----------------------------------------------------------------
Amir Goldstein (1):
fs: move initializing f_mode before file_ref_init()
André Almeida (4):
exportfs: Fix kernel-doc output for get_name()
exportfs: Mark struct export_operations functions at kernel-doc
exportfs: Complete kernel-doc for struct export_operations
docs: exportfs: Use source code struct documentation
Bagas Sanjaya (2):
fs: Describe @isnew parameter in ilookup5_nowait()
VFS: fix __start_dirop() kernel-doc warnings
Ben Dooks (1):
fs: add <linux/init_task.h> for 'init_fs'
Breno Leitao (2):
fs/namei: Remove redundant DCACHE_MANAGED_DENTRY check in __follow_mount_rcu
device_cgroup: remove branch hint after code refactor
Christian Brauner (3):
Merge patch series "further damage-control lack of clone scalability"
Merge patch series "vfs kernel-doc fixes for 6.19"
Merge patch series "exportfs: Some kernel-doc fixes"
David Disseldorp (1):
initramfs_test: kunit test for cpio.filesize > PATH_MAX
David Laight (1):
fs: use min() or umin() instead of min_t()
Deepakkumar Karn (1):
fs/buffer: add alert in try_to_free_buffers() for folios without buffers
Jeff Layton (1):
acct(2): begin the deprecation of legacy BSD process accounting
Mateusz Guzik (7):
fs: annotate cdev_lock with __cacheline_aligned_in_smp
ns: pad refcount
filelock: use a consume fence in locks_inode_context()
pid: only take pidmap_lock once on alloc
fs: track the inode having file locks with a flag in ->i_opflags
fs: only assert on LOOKUP_RCU when built with CONFIG_DEBUG_VFS
fs: make insert_inode_locked() wait for inode destruction
Miklos Szeredi (1):
posix_acl: make posix_acl_to_xattr() alloc the buffer
Thomas Weißschuh (1):
select: store end_time as timespec64 in restart block
Thorsten Blum (3):
fs: Replace simple_strtoul with kstrtoul in set_ihash_entries
dcache: Replace simple_strtoul with kstrtoul in set_dhash_entries
namespace: Replace simple_strtoul with kstrtoul to parse boot params
Yuto Ohnuki (1):
fs: improve dump_inode() to safely access inode fields
chen zhang (1):
chardev: Switch to guard(mutex) and __free(kfree)
Documentation/filesystems/nfs/exporting.rst | 42 ++-------
fs/9p/acl.c | 16 +---
fs/btrfs/acl.c | 10 +--
fs/buffer.c | 6 +-
fs/ceph/acl.c | 50 +++++------
fs/char_dev.c | 19 ++--
fs/dcache.c | 5 +-
fs/exec.c | 2 +-
fs/ext4/mballoc.c | 3 +-
fs/ext4/resize.c | 2 +-
fs/ext4/super.c | 2 +-
fs/fat/dir.c | 4 +-
fs/fat/file.c | 3 +-
fs/file_table.c | 10 +--
fs/fs_struct.c | 1 +
fs/fuse/acl.c | 12 +--
fs/fuse/dev.c | 2 +-
fs/fuse/file.c | 8 +-
fs/gfs2/acl.c | 13 +--
fs/inode.c | 96 ++++++++++++--------
fs/jfs/acl.c | 9 +-
fs/locks.c | 14 ++-
fs/namei.c | 11 ++-
fs/namespace.c | 10 +--
fs/ntfs3/xattr.c | 6 +-
fs/orangefs/acl.c | 8 +-
fs/posix_acl.c | 21 ++---
fs/select.c | 12 +--
fs/splice.c | 2 +-
include/linux/device_cgroup.h | 2 +-
include/linux/exportfs.h | 33 ++++---
include/linux/filelock.h | 18 +++-
include/linux/fs.h | 1 +
include/linux/ns/ns_common_types.h | 4 +-
include/linux/posix_acl_xattr.h | 5 +-
include/linux/restart_block.h | 4 +-
init/Kconfig | 7 +-
init/initramfs_test.c | 48 ++++++++++
kernel/pid.c | 131 ++++++++++++++++++----------
39 files changed, 357 insertions(+), 295 deletions(-)
On Fri, Feb 06, 2026 at 05:50:08PM +0100, Christian Brauner wrote:
> David Laight (1):
> fs: use min() or umin() instead of min_t()
This needs a fix up for 32-bit builds:
https://lore.kernel.org/20260113192243.73983-1-david.laight.linux@gmail.com/
$ make -skj"$(nproc)" ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- mrproper allmodconfig fs/fuse/file.o
In file included from <command-line>:
In function 'fuse_wr_pages',
inlined from 'fuse_perform_write' at fs/fuse/file.c:1347:27:
include/linux/compiler_types.h:705:45: error: call to '__compiletime_assert_508' declared with attribute error: min(((pos + len - 1) >> 12) - (pos >> 12) + 1, max_pages) signedness error
705 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^
include/linux/compiler_types.h:686:25: note: in definition of macro '__compiletime_assert'
686 | prefix ## suffix(); \
| ^~~~~~
include/linux/compiler_types.h:705:9: note: in expansion of macro '_compiletime_assert'
705 | _compiletime_assert(condition, msg, __compiletime_assert_, __COUNTER__)
| ^~~~~~~~~~~~~~~~~~~
include/linux/build_bug.h:39:37: note: in expansion of macro 'compiletime_assert'
39 | #define BUILD_BUG_ON_MSG(cond, msg) compiletime_assert(!(cond), msg)
| ^~~~~~~~~~~~~~~~~~
include/linux/minmax.h:93:9: note: in expansion of macro 'BUILD_BUG_ON_MSG'
93 | BUILD_BUG_ON_MSG(!__types_ok(ux, uy), \
| ^~~~~~~~~~~~~~~~
include/linux/minmax.h:98:9: note: in expansion of macro '__careful_cmp_once'
98 | __careful_cmp_once(op, x, y, __UNIQUE_ID(x_), __UNIQUE_ID(y_))
| ^~~~~~~~~~~~~~~~~~
include/linux/minmax.h:105:25: note: in expansion of macro '__careful_cmp'
105 | #define min(x, y) __careful_cmp(min, x, y)
| ^~~~~~~~~~~~~
fs/fuse/file.c:1326:16: note: in expansion of macro 'min'
1326 | return min(((pos + len - 1) >> PAGE_SHIFT) - (pos >> PAGE_SHIFT) + 1,
| ^~~
David sent another patch before that one (though it does not look like
you were explicitly sent that one). Arnd also sent one.
https://lore.kernel.org/20251216141647.13911-1-david.laight.linux@gmail.com/
https://lore.kernel.org/20251223215442.720828-1-arnd@kernel.org/
Cheers,
Nathan
© 2016 - 2026 Red Hat, Inc.