Mon May 04 13:41:27 -03 2026:
- Added skip_homedir and skip_rootfs filters to manage standard linux directory exclusions.
- Implemented force_file and force_files to bypass exclusion rules for specific paths.
- Added automated directory filters for /boot and /lost+found in commit operations.
- Introduced atomic commit logic to safely handle forced file overrides via backup and restore.
- Optimized directory traversal to respect forced file flags before applying skip filters.
- Exposed internal fields of CommitFilter to allow direct struct literal initialization.
Sun May 03 22:17:01 -03 2026:
- Fixed: CommitFilter now validates exact paths (e.g., etc/mtab), preventing conflicts with duplicate
filenames in different directories.
Sat May 02 22:13:13 -03 2026:
- Update recursive_copy to obliterate existing destination files.
- Support XDG_CACHE_HOME for standard compliant cache paths.
- Add set_mount method for manual mount point configuration.
- Rename commit_filter module to filter for brevity.
- Rename fuse_ops module to fuse for naming consistency.
- Implement glob and regex patterns in commit filtering.
Fri Apr 17 20:40:11 -03 2026:
- Implement serde::Serialize and serde::Deserialize for IndeMode and OverlayAction.
- Resolve libc::time_t 32-bit compatibility warning for musl targets.
Wed Apr 15 10:10:13 -03 2026:
- Replaced internal copy_tree with recursive_copy for improved reliability during the atomic commit process.
- The upper layer is no longer removed if a commit fails, preserving user data for subsequent attempts.
- Adopted obliterate within the commit_atomic process for safer and more thorough removal of temporary directories.
Tue Apr 14 15:24:56 -03 2026:
- Introduced CommitFilter to selectively exclude files and directories from being committed to the lower layer.
- Features a rootfs preset to automatically skip virtual, kernel-managed, and volatile paths.
- Supports custom exclusion rules for specific filenames, directory subtrees, and zero-byte files
within designated paths.
- Replaced remove_dir_all with obliterate for post-overlay cleanup to ensure more reliable directory removal.
1.2.1 — 2026-04-01:
- Robust removal via obliterate: OverlayAction::Discard now uses the obliterate crate to remove the upper layer,
ensuring cleanup succeeds even when files or directories have restrictive permissions (e.g., 000).
1.2.0 — 2026-03-18:
- memmap2 integration: read() now memory-maps files ≥ 128 KiB via memmap2::MmapOptions, returning a slice
directly to the FUSE kernel without allocating an intermediate Vec<u8>.
- zerocopy integration: IntoBytes is used on all reply.data() call sites as a compile-time guarantee that
the byte slice passed to the kernel contains no padding or uninitialized bytes.
- Tiered read strategy: files below 128 KiB continue to use a plain buffered read to avoid mmap setup overhead;
files at or above the threshold use mmap with an automatic fallback to the buffered path for special files
(pipes, device nodes) that do not support mmap.
- EOF fast-path: read() now returns an empty slice immediately when the file is empty or offset >= file_len,
without opening or mapping the file.
- OverlayAction and InodeMode now derive Debug, Clone, Copy, PartialEq, and Eq.
1.1.0 — 2026-03-13:
- State Safety: Added is_mounted() checks to set_upper(), set_inode_mode(), and mountpoint_as_home() to prevent
configuration changes while the filesystem is active.
- Fluent API: Updated configuration methods to return &mut Self, allowing for method chaining (Builder Pattern).
- Automated Cleanup: Enhanced umount() and drop logic to ensure the temporary mount point directory is removed
from the host system after a successful unmounting.
- Collision-Resistant Naming: Implemented a new naming strategy for mount_point using a session ID prefix and a
nanosecond timestamp (e.g., mount_name_session_timestamp). This prevents Permission Denied errors during
parallel test execution.
- XDG/Home Integration: Added mountpoint_as_home() to optionally relocate the mount point to ~/.cache. This
provides a fallback to the system's temporary directory if $HOME is not available.
- Naming Hygiene: Replaced dot-prefixed hidden directories (.upper, .mountpoint) with underscore-separated
visible names (_upper, mount_...) for better visibility and system compatibility.
- FUSE Mounting Races: Resolved fusermount3 access errors in tests by ensuring unique mount point paths
for every instance, even when sharing the same PID.
1.0.0 — Initial Release:
- OverlayFS struct as the primary controller for the FUSE-based overlay lifecycle.
- mount() / umount() methods with graceful session teardown and libc fallback (MNT_DETACH).
- overlay_action() supporting four finalization strategies via OverlayAction:
- Preserve — retains the upper layer as-is after unmount.
- Discard — removes the upper layer and mount point entirely.
- Commit — merges upper layer changes back into the lower layer, then cleans up.
- CommitAtomic — performs a backup-and-swap merge to guarantee data integrity on a crash.
- set_upper() and set_inode_mode() for custom configuration before mounting.
- OverlayHandle struct providing read-only access to lower, upper, and mount_point paths.
- copy_xattrs() to preserve extended attributes during Copy-on-Write promotions and commits.
- copy_if_different() with BLAKE3-based content comparison and per-file fsync for durability on loop devices.
- LayerManager coordinating read resolution and write promotion between lower and upper layers.
- resolve() — finds the physical path for a relative overlay path, checking upper before lower,
respecting whiteouts, and handling dangling symlinks correctly via symlink_metadata.
- is_hidden() — checks for whiteout markers (.wh.<name>) in the upper layer.
- create_whiteout() / clear_whiteout() — manages whiteout files to mask deletions.
- copy_on_write() — promotes files, symlinks, and directories from lower to upper, preserving permissions,
ownership (UID/GID), timestamps, and xattrs.
- resolve_symlink_safe() — recursive symlink resolution with a depth cap (MAX_SYMLINK_DEPTH = 40) to prevent ELOOP.
- InodeStore — thread-safe bidirectional map between INodeNo and relative paths.
- Two inode generation strategies via InodeMode:
- Virtual — sequential counter, ephemeral across mounts.
- Persistent — FNV-1a hash-based, deterministic across mounts for the same path.
- Single-Mutex design on InodeTable eliminates TOCTOU races that existed with independent RwLocks.
- get_ino() — retrieves or allocates an inode, incrementing the kernel lookup reference count.
- forget_ino() — decrements reference counts and evicts the entry when it reaches zero.
- remove_ino() / remove_subtree() — explicit cleanup after unlink and rmdir to prevent table growth.
- child_path() — constructs child paths from a parent inode and a single-component name, enforcing the FUSE contract.
- OverlayFiles struct tracking lower, upper, and mount_point paths.
- Automatic derivation of upper and mount_point paths from the lower directory name (<name>.upper, <name>.mountpoint).
- Re-exports InodeMode, OverlayAction, and OverlayFS as the stable public surface.