[PATCH 0/2] fuse: support per-inode open and release suppression

From: Stanislav Kinsburskii

Date: Wed Oct 07 2026 - 19:15:01 EST


For FUSE filesystems serving immutable data, warm-cache workloads can
still spend much of their time sending OPEN/OPENDIR and RELEASE/RELEASEDIR
requests. Data, attributes, lookups and directory entries may already be
cached, but opening each object still requires a userspace round trip.

The existing connection-wide no-open support cannot distinguish these
objects from control files that need the server's open and release
callbacks.

This series adds negotiated per-inode suppression. A server negotiates
FUSE_PER_INODE_NO_OPEN during INIT and marks eligible inodes with
FUSE_ATTR_NO_OPEN in their attribute replies. The kernel then handles
opens locally for those inodes, using a zero file handle and the existing
no-open cache defaults. Subsequent requests identify the object by nodeid.

Release suppression follows how each handle was opened, so changing the
inode's hint does not create an unmatched release or lose the release of
a server-opened handle. Atomic O_TRUNC still sends OPEN to the server,
and CREATE retains its existing open and release lifecycle.

The second patch adds a raw /dev/fuse selftest without requiring libfuse
support for the new protocol flags. It covers capability negotiation,
files and directories, LOOKUP and READDIRPLUS attributes, hint changes
through GETATTR, hint preservation across STATX, atomic truncation and
CREATE. The cases also run with writeback caching enabled.

Signed-off-by: Stanislav Kinsburskii <skinsburskii@xxxxxxxxx>
---
Stanislav Kinsburskii (2):
fuse: add negotiated per-inode open and release suppression
selftests: fuse: test per-inode open suppression

Documentation/filesystems/fuse/fuse-no-open.rst | 39 ++
Documentation/filesystems/fuse/index.rst | 1 +
fs/fuse/file.c | 26 +-
fs/fuse/fuse_i.h | 17 +-
fs/fuse/inode.c | 9 +
fs/fuse/ioctl.c | 3 +-
include/uapi/linux/fuse.h | 11 +-
.../testing/selftests/filesystems/fuse/.gitignore | 1 +
tools/testing/selftests/filesystems/fuse/Makefile | 2 +
.../selftests/filesystems/fuse/no_open_test.c | 511 +++++++++++++++++++++
10 files changed, 612 insertions(+), 8 deletions(-)
---
base-commit: b018686719706a781c45a874ed51374a2dc4b767
change-id: 20261007-fuse-per-inode-no-open-d40e2b4abb8a

Best regards,
--
Stanislav Kinsburskii <skinsburskii@xxxxxxxxx>