Skip to content

NoMount v2.1.1

Choose a tag to compare

@maxsteeel maxsteeel released this 13 Oct 08:36
· 165 commits to master since this release
Immutable release. Only release title and notes can be modified.

NoMount v2.1.1 is here!🎉

This release is all about performance and stability. The hot paths got heavily optimized (rule lookup, directory iteration, path redirection), memory management was cleaned up (fewer allocations and misc), and the LKM now loads on more kernels than ever.

The commit count hit 555 on this release. Thanks to everyone who's been testing, reporting and contributing along the way 💙

Small Changelog:

There are too many changes made in this release, so I will only highlight the most relevant and important ones here:

  • kernel/:

    • Massive hot-path optimization pass, rule lookups, directory iteration and dentry revalidation are noticeably faster, especially on devices with hundreds of active rules.
    • Rule storage was reworked so each directory now uses a single packed allocation for its rules and their path strings, instead of one allocation per rule. Big win on fragmentation and cache locality.
    • Virtual inodes are now fully decoupled from rules. A rule can be replaced or removed without touching the inodes that already reference its target, which removes a whole class of lifetime bugs.
    • Deferred freeing switched from a shared synchronize_rcu() queue to per-object call_rcu(). Clearing rules no longer blocks concurrent writers for milliseconds, and hot load / hot unload is now near-instant.
    • NM_CMD_ADD_RULE takes the write mutex once per batch instead of once per rule. Boot-time rule injection and hot loading are significantly faster.
    • New RCU scope guard (rcu_guard()) used across the module. Read-side sections are now guaranteed to be released on every exit path.
    • Child bloom filters now scale with directory size (up to 16Kb for pathological cases) and are skipped entirely for directories with one or two children. UID exclusion got its own 256-bit prefilter, so nomount_is_uid_blocked short-circuits most of the time.
    • VFS hooks are now installed before publishing children, and unpublished topology rules are freed on error. Fixes a class of partial-state bugs during rule creation.
    • Removed a redundant pass of directory cache pruning per rule, and skipped the dentry lock in the no-op path of dentry ops hijacking.
    • The LKM now builds and loads on OSS kernels (LineageOS and similar) that ship without CONFIG_PAGE_PINNER.
  • userspace/:

    • nm list --json now escapes paths correctly, so rule listings are valid JSON even when a path contains special characters.
    • nm list now propagates kernel-side query failures to the CLI exit code instead of silently returning an empty list.
  • webui/:

    • Added a Skip / Unskip button on each module card. Skip creates skip_mount in the module directory so NoMount will skip it in the next boot; Unskip deletes that file.
    • The Material You palette is now computed in JavaScript from a single seed color. Theme changes (including system light/dark and AMOLED) apply instantly inside the WebUI without needing a reload, and Custom Colors now produce a proper M3 palette instead of an HSL approximation (Theme bugs from previous release has been fixed!).
    • theme.json is now authoritative and localStorage is just a warm cache. Editing the theme on disk and reloading the WebUI now correctly adopts the new values.
    • Navigation history was reworked into a single state machine. The Android back gesture now closes modals and dialogs consistently.
    • Crowdin was added for translations, added German translation and small adjustments to others languages.
  • module/:

    • Split the boot into two phases: post-fs-data.sh now loads the LKM (if needed) and metamount.sh handles rule injection. This lets other modules call nm rule add from their own post-fs-data.sh without racing against NoMount's own injection.
    • Rule path generation was extracted into a shared rule-paths.sh script, used by both the boot pipeline and the WebUI's hot load/unload routines.

and a lot of other misc changes :)

New Contributors

Full Changelog: v2.1.0...v2.1.1