uring_available()tells whether the kernel lets the process serve FUSE over io_uring: the fuse module'senable_uringparameter is on and the process may create an io_uring. Checking it before mounting saves a mount that would fall back to/dev/fuse.- 254: Split the library into a layered Cargo workspace and break the layers out into
their own crates —
fuse-backend-core(ABI, API/server, buffers),fuse-backend-fusedevandfuse-backend-virtiofs(transports), andfuse-backend-passthroughandfuse-backend-overlayfs(filesystem drivers) — so they can be depended on directly instead of only through the umbrella crate. - 254: Add standalone
passthroughandoverlayfscargo features that select a filesystem driver on its own, without any transport. - 252: Extract the
Vfsunion multiplexer (with itspseudo_fsbacking store) into a seventh crate,fuse-backend-vfs, resolving RFC open question 3. It sits between the facade andfuse-backend-coreand carries thearc-swapandpersist(versionize/dbs-snapshot) stack that the multiplexer needs. - 188: docs: document the experimental status of async-io support.
- 188: Add a unified serving layer to the fusedev transport. The
FuseServingtrait is implemented bySyncFuseServing(classic/dev/fusewith synchronous handlers, always available),AsyncFuseServing(async-iofeature) andUringFuseServing(fusedev-uringfeature): each takes ownership of a mountedFuseSession, spawns workers per its configuration and turnsDropinto teardown (stop accepting, finish in-flight requests, unmount, join the workers), whileFuseServing::wait()waits out teardown driven from outside the process. - 188: Add
SyncFuseServing, the serving loop every hand-rolled fusedev daemon duplicated, as a library type: N epoll-based worker channels — or, withSyncServingConfig::blocking, blocking channels cloned withFUSE_DEV_IOC_CLONE— each dispatching requests to aServer<F>until the session is torn down. On macOS the session exposes a single channel, so multi-worker configurations are rejected. - 188: Add
AsyncFuseServing/AsyncServingConfig, scaling the classic transport out to N asynchronous workers, andUringFuseServing/UringConfigfor the experimental FUSE-over-io_uring transport (kernel 6.14+). Both join theFuseServinginterface, so a daemon can pick its transport at runtime behindBox<dyn FuseServing>and fall back to the classic transport onError::UringNotSupported. - 269:
AsyncFileSystemmethods default to calling theirFileSystemcounterparts, so a file system only implements the handlers it serves asynchronously. - 269:
FuseSession::detach()lazily unmounts a Linux session through&self, so the owner of a serving layer can start the teardown while another thread waits inFuseServing::wait().
- Bump the declared minimum supported Rust version (MSRV) from 1.80 to 1.86.
Trait-object upcasting (stabilized in Rust 1.86) is required by the default
AsyncFileSystemread/write handlers and by the passthrough O_DIRECT relay, so with theasync-iofeature enabled the workspace has not built on older toolchains for a while — the 1.80 declaration was already inaccurate. CI gains an MSRV job that checks the crates declaringrust-versionwith the declared version, so the next accidental bump is caught. - The FUSE-over-io_uring transport answers opcodes it doesn't know with ENOSYS instead of EIO.
Kernels that send
FUSE_STATXonly fall back toFUSE_GETATTRafter ENOSYS, sostatx()calls that ask for more than the basic fields, like the birth timestat(1)shows, failed. - 254:
fuse-backend-rsis now a thin facade re-exporting the sub-crates. Every historicalfuse_backend_rs::{abi, api, buffer, common, transport, passthrough, overlayfs}import path and cargo feature name (fusedev,virtiofs,vhost-user-fs,async-io,persist,fuse-t,fusedev-uring) still resolves to the same types, so existing dependency lines are unchanged. - 254: Small breaking surface from the layering fix (a 0.x release may break API):
transport::Writeris a trait now instead of an enum, so code naming its variants must adapt; the transport-specificReaderconstructors (from_fuse_buffer,from_descriptor_chain) moved onto theFuseDevReaderExtandVirtioFsReaderExtextension traits and need that trait in scope (theReader::from_…spelling is otherwise unchanged); and ontransport::Errorthe never-constructedConvertIndirectDescriptorvariant was removed, whileFindMemoryRegionandInvalidChainare now gated behind thevirtiofsfeature. Those variants stay on the sametransport::Errortype (there is no separate virtiofs error type), so avirtiofsbuild matching them is unaffected. - 252: Replace the
lazy_staticdependency withstd::sync::LazyLockand declare an explicit MSRV of Rust 1.80 (rust-version = "1.80") on every published crate. No API change; this drops one dependency and formalizes the minimum toolchain, which was previously undeclared (CI builds onstable). - 252:
Vfs,arc-swapand thepersistsnapshot stack (versionize/dbs-snapshot) move out offuse-backend-coreintofuse-backend-vfs, so a consumer that brings its ownFileSystemand does not need the multiplexer can depend onfuse-backend-coredirectly and skiparc-swapentirely (cargo tree -p fuse-backend-core --all-featuresshows noarc-swapordbs-snapshot). The umbrella crate depends onfuse-backend-vfsunconditionally and still re-exports the historicalapi::vfs::*and flatapi::Vfspaths under every feature combination (guarded bytests/legacy_paths.rs), so existing imports and thepersist/async-iofeature names are unchanged, and snapshots stay byte-compatible. - #221:
FuseDevWriterno longer derivesPartialEq/Eq; comparing two writers for equality was never meaningful (they wrap a mutable reply buffer) and no code in the workspace relied on it.
- READDIR and READDIRPLUS answer ENOMEM when the reply can't hold the reply header plus the requested size. The check left out the header, so a writer short by up to 16 bytes started the listing and failed partway.
- A
UringFuseServingworker that stops frees its ring entries only after the kernel has given them all back, and leaks them if that takes more than a second. A worker that stopped on an error while the connection was up freed entries the kernel could still copy requests into. A signal that interrupts the worker'sio_uring_enter()calls no longer stops it. - 278: Treat
EOPNOTSUPP/ENOTSUPandENOSYSfromgetxattras "not opaque" inLayer::is_opaque(), soOverlayFs::import()no longer aborts when a layer's backing filesystem has no xattr support at all (tmpfs answersEOPNOTSUPPtouser.*xattrs before Linux 6.12, and aPassthroughFslayer withxattrdisabled answersENOSYS). - 269: For a session mounted with
set_target_mntns(),FuseSession::umount()unmounts in that mount namespace. It no longer follows a symlink at the mountpoint.
- 254: Drop the vestigial
vhostandvirtio-bindingsdependencies that the pre-splitvhost-user-fsbuild carried but never referenced;vhost-user-fsis now an alias for thevirtiofsbuild.
- 261: feat(fusedev): add try_with_writer on FuseSession
- 222: Drop virtiofs DAX support as it never made it to the spec
- 187: Feat/support fuse resend notify
- 211: Add notify_inval_inode and extend get_rootfs to return fs_idx for umount
- 189: fix by_id not free when use_host_ino=true
- 191: fix request size too large when use direct io
- 205: Fix: unable to perform sync on directory
- 212: Fix fuse out header len in notify_resend
- 156: Fuse OverlayFs implementation.
- 166: Import latest improvement for passthroughfs from virtiofsd project.
- 169: Optimize implementation of lookup() for passthroughfs.
- 170: abi: unify st_nlink.
- 172: ptfs: refine implementation of seal_size_check().
- 173: ptfs: use BorrowedFd instead of RawFd when possible.
- 174: ptfs: add support for new cache mode Metadata.
- 177: fusedev: add clone_fuse_file method to FuseSession.
- 125: fusedev: add fd-passthrough support.
- 178: Fix batch forget can't handle too large msg.
- 180: fix: fuse-t nobrowse.
- 181: Fix CI: xfstests: restrict xfstests version.
- 184: bugfix: read/write fd dropped unexpectedly.
- 185: fix: fuse t channel read bug in during multiple reads
- 144: feat: implement fuse-t feature
- 149: feat: add "persist" feature
- 152: Add the ability to clean up the dentry cache can be used to clean up resources when VFS umount.
- 153: linux_session: Make allow_other mount option optional
- 159: UID/GID remapping support
- 162: abi: Disable unsupported flags and functionality on MacOS
- 163: vfs: add method to export root pseudofs's reference
- 167: CI: add xfstests for passthrough fs
- 154: fuse: Ensure fd has same flags as read/write
- 165: build: fix a build failure related to conditional compilation
- 138: linuxsession: support mount in given mount namespace
- 141: linux_session: support set fusermount binary
- 140: fuse: Ensure readdir returns same ino as lookup
- 135: ZeroCopyWriter pass through available bytes from inner writer
- #115
- transport: pre-allocate VecDeque to avoid expending at runtime
- passthroughfs: convert MultiKeyBTreeMap to InodeStore for InodeMap
- passthroughfs: add config to specify entry and attr timeout for dir
- passthroughfs: add config to control count mntid in altkey or not
- #119: Support non-privileged users
- [#126 #127](cloud-hypervisor#126 cloud-hypervisor#127): vfs: ensure entry attr st_ino consistency
- #131: implement stable unique inode for passthroughfs
- #120: api: forget and batch forget must not reply
- #123: fix possible IO hang due to string convertion failure
- #129: abi: st_nlink is u32 on aarch64
- #105: abi: fix the conflict of PERFILE_DAX flag
- #106: bugfix: passthrough: refect CFileHandle struct
- #102: passthrough: reduce the memory footprint of file handle
- #103: vfs: correctly set attr.st_ino for loopup()
- #96: async_runtime: add probe of io_uring support
- #88: add ability to disallow operations that could change file size
- #97: log: print some variables in hexadecimal
- #96: async_runtime: improved async file implement
- #95: open file with O_APPEND cleared when writeback is enabled
- #90: open file for reading if writeback cache is enabled
- virtio-queue from 0.4 to 0.6
- vhost from 0.4 to 0.5
- Fix no_opendir option handling
- Update dependency
- Fix a bug in fusedev
- Add toio-uring/tokio based async io framework
- #77: Implement Sync for FileVolatileSlice
- #74: Fixed some issues about EINTR and EAGIN handled incorrectly
- MacOS support
- linux_abi renamed to fuse_abi
- switch from epoll to mio for cross-platform support
- VFS umount no longer evicts pseudofs inodes
- virtiofs transport Reader/Writer takes generic typed memory argument
- Optionally enable MAX_PAGES feature
- Allow customizing the default FUSE features before creating a new vfs structure
- Support more FUSE server APIs
- The FUSE server has no default FUSE feature set now. The default feature set is only defined in VfsOptions. Non VFS users have to define the default FUSE feature set in the init() method.
- Enhance passthrough to reduce active fds by using file handle
- implement Fromfusedev::Error for std::io::Error
- Use
vhostcrate from crates.io - Introduce readlinkat_proc_file helper
- Update vm-memory to 0.7.0
- Add @eryugey to CODEOWNERS file
- Validate path components
- Prevent ".." escape in do_lookup in passthroughfs
- Prevent opening of special file in passthroughfs
- Fix compile error in vfs async test
- Record real root inode's ino of file system backends in vfs
- support KILLPRIV_v2
- enhance vfs to support DAX window map/unmap operations
- Set README.md file for crate
- Add CHANGELOG.md