|
1 | 1 | # Changelog |
2 | 2 | ## [Unreleased] |
3 | 3 | ### Added |
| 4 | +- `uring_available()` tells whether the kernel lets the process serve FUSE over io_uring: the |
| 5 | + fuse module's `enable_uring` parameter is on and the process may create an io_uring. Checking |
| 6 | + it before mounting saves a mount that would fall back to `/dev/fuse`. |
4 | 7 | - [254](https://github.com/cloud-hypervisor/fuse-backend-rs/pull/254): Split the library into a layered Cargo workspace and break the layers out into |
5 | 8 | their own crates — `fuse-backend-core` (ABI, API/server, buffers), |
6 | 9 | `fuse-backend-fusedev` and `fuse-backend-virtiofs` (transports), and |
|
35 | 38 | - `Server::init_state()` and `Server::restore_init()` let a new server take over a connection |
36 | 39 | that another server initialized. `abi::fuse_abi::UNIQUE_RESEND` is the bit that the kernel |
37 | 40 | sets in requests it sends again after `notify_resend()`. |
| 41 | +- [269](https://github.com/cloud-hypervisor/fuse-backend-rs/pull/269): `AsyncFileSystem` methods default to calling their `FileSystem` |
| 42 | + counterparts, so a file system only implements the handlers it serves asynchronously. |
| 43 | +- [269](https://github.com/cloud-hypervisor/fuse-backend-rs/pull/269): `FuseSession::detach()` lazily unmounts a Linux session through `&self`, |
| 44 | + so the owner of a serving layer can start the teardown while another thread waits in |
| 45 | + `FuseServing::wait()`. |
38 | 46 |
|
39 | 47 | ### Changed |
| 48 | +- Bump the declared minimum supported Rust version (MSRV) from 1.80 to 1.86. |
| 49 | + Trait-object upcasting (stabilized in Rust 1.86) is required by the default |
| 50 | + `AsyncFileSystem` read/write handlers and by the passthrough O_DIRECT relay, |
| 51 | + so with the `async-io` feature enabled the workspace has not built on older |
| 52 | + toolchains for a while — the 1.80 declaration was already inaccurate. CI |
| 53 | + gains an MSRV job that checks the crates declaring `rust-version` with the |
| 54 | + declared version, so the next accidental bump is caught. |
40 | 55 | - The FUSE-over-io_uring transport answers opcodes it doesn't know with ENOSYS instead of EIO. |
41 | 56 | Kernels that send `FUSE_STATX` only fall back to `FUSE_GETATTR` after ENOSYS, so `statx()` |
42 | 57 | calls that ask for more than the basic fields, like the birth time `stat(1)` shows, failed. |
|
82 | 97 | and no code in the workspace relied on it. |
83 | 98 |
|
84 | 99 | ### Fixed |
| 100 | +- READDIR and READDIRPLUS answer ENOMEM when the reply can't hold the reply header plus the |
| 101 | + requested size. The check left out the header, so a writer short by up to 16 bytes started the |
| 102 | + listing and failed partway. |
85 | 103 | - [278](https://github.com/cloud-hypervisor/fuse-backend-rs/pull/278): Treat `EOPNOTSUPP`/`ENOTSUP` and `ENOSYS` from `getxattr` as "not opaque" |
86 | 104 | in `Layer::is_opaque()`, so `OverlayFs::import()` no longer aborts when a layer's |
87 | 105 | backing filesystem has no xattr support at all (tmpfs answers `EOPNOTSUPP` to |
88 | 106 | `user.*` xattrs before Linux 6.12, and a `PassthroughFs` layer with `xattr` |
89 | 107 | disabled answers `ENOSYS`). |
| 108 | +- [269](https://github.com/cloud-hypervisor/fuse-backend-rs/pull/269): For a session mounted with `set_target_mntns()`, |
| 109 | + `FuseSession::umount()` unmounts in that mount namespace. It no longer follows a symlink at the mountpoint. |
90 | 110 |
|
91 | 111 | ### Removed |
92 | 112 | - [254](https://github.com/cloud-hypervisor/fuse-backend-rs/pull/254): Drop the vestigial `vhost` and `virtio-bindings` dependencies that the |
|
0 commit comments