overlayfs_fuse 1.4.2

A minimal, safe, synchronous OverlayFS implementation using FUSE.
Documentation
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.