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 <[email protected]> --- 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 <[email protected]>

