Skip to content

chore: release v0.4.22 - #37

Merged
MagicalTux merged 1 commit into
masterfrom
release-plz-2026-08-17T13-57-40Z
Aug 17, 2026
Merged

chore: release v0.4.22#37
MagicalTux merged 1 commit into
masterfrom
release-plz-2026-08-17T13-57-40Z

Conversation

@MagicalTux

@MagicalTux MagicalTux commented Aug 17, 2026

Copy link
Copy Markdown
Member

🤖 New release

  • fstool: 0.4.21 -> 0.4.22
Changelog

0.4.22 - 2026-08-17

Added

  • (littlefs) read, write and in-place edits for lfs2 images
  • (web) create, edit and download images in the browser
  • (memedit) in-memory authoring — blank filesystems, partitioned disks

Fixed

  • (littlefs) accept both path separators, fixing Windows
  • (littlefs) split metadata pairs on entry size alone
  • (ext) honour journal revoke records across transactions
  • (ext) decode HTree directory roots and honour journal revoke blocks (#32)

Other

  • cover littlefs in the prose, and refresh the crate front page

Added

  • (littlefs) new backend for the embedded-flash filesystem (lfs2, disk
    versions 2.0 and 2.1): read, write, and in-place edits. Metadata pairs are
    replayed from their CRC-committed logs (tags, splices, tails, global-state
    deltas, lfs2.1 forward-CRCs) and written back as compactions; files live
    inline in metadata or in CTZ skip-lists, which are rebuilt only from the
    first changed block onwards so a partial write leaves earlier blocks
    untouched. Block allocation reconstructs the in-use map by traversing the
    volume, as littlefs itself does. Wired into create -t littlefs, the TOML
    spec (type = "littlefs", with block_size / block_count / prog_size /
    version / name_max / inline_max options), repack --fs-type littlefs,
    info, add/rm, the in-memory authoring surface, and the browser build.
    littlefs user attributes surface as user.littlefs.<type> extended
    attributes; the format has no symlinks, device nodes or POSIX metadata, so
    those are refused rather than faked. Cross-validated in both directions
    against the reference C implementation via littlefs-python, including
    handing an image back and forth mid-edit.

  • (memedit) new in-memory authoring surface: Workspace formats a blank
    filesystem or lays out a partitioned disk (MBR/GPT), takes files and
    directories, and hands back the image bytes at any point.
    creatable_filesystems() advertises 15 types with their real minimum sizes.

  • (wasm) Workspace and creatable_filesystems() bindings, so the browser
    build can author images as well as read them.

  • (web) "Create a new image" mode: pick a filesystem and size, or build a
    partitioned disk with a filesystem per partition, then add files, delete
    them, browse directories, and download the image — repeatedly, while
    continuing to edit. An uploaded image can also be switched into edit mode.

Fixed

  • (ext) journal recovery now honours revoke records across transactions.
    Replay was single-pass and scoped each revoke to the transaction that
    carried it, so a block revoked in transaction N+1 was still replayed from
    transaction N — it had already been written by the time the revoke record
    was read. That is exactly the case revoke records exist to prevent (a
    metadata block freed and reused as file data), so stale metadata could land
    on live data. Recovery now runs the two passes JBD2 requires: a scan that
    collects committed transactions and builds a revoke table keyed by the
    highest revoking transaction id, then a replay that skips any block whose
    revoke id is at or after the transaction replaying it (the kernel's
    jbd2_journal_test_revoke rule, wrap-safe). An uncommitted tail
    transaction's revoke records are discarded along with its writes.
  • (ext) parse_descriptor_tags walked the tag array in 8-byte steps
    regardless of the journal's real tag size, so a trailing slot too short for
    a 16-byte checksum-v3 tag failed the whole replay instead of ending the
    array; it also read into the 4-byte checksum tail that checksum-v2/v3
    descriptor blocks carry.


This PR was generated with release-plz.

@MagicalTux
MagicalTux force-pushed the release-plz-2026-08-17T13-57-40Z branch from 62077be to 2a24bbd Compare August 17, 2026 14:20
@MagicalTux
MagicalTux force-pushed the release-plz-2026-08-17T13-57-40Z branch from 2a24bbd to e89b13c Compare August 17, 2026 14:34
@MagicalTux
MagicalTux merged commit 4dfe6f5 into master Aug 17, 2026
4 checks passed
@MagicalTux
MagicalTux deleted the release-plz-2026-08-17T13-57-40Z branch August 17, 2026 14:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant