Skip to content

lambutter 0.4.0

Choose a tag to compare

@glamberson glamberson released this 15 Oct 02:47
· 2 commits to main since this release

lambutter 0.4.0 fixes three ways 0.3.1 could read the wrong data, adds opening a btrfs filesystem at a chosen subvolume, and moves to ruzstd 0.9.1.

Fixed

  • Reads that stopped at a B-tree leaf boundary. A file whose extent items continue in the next leaf read as zeros from that point, and a directory whose index had a gap at a leaf boundary lost entries. On images written by Linux, a 12 MB kernel read zeros from 3.5 MB on, a 190 MB zstd file read wrong, and a 200-entry loader/entries listed 72.
  • Subvolumes. An entry naming a subvolume was read as an inode in the parent, so a /boot subvolume resolved to the parent's root directory. Paths and listings now cross into subvolumes the way a Linux mount shows them, and a snapshot's copy of a nested subvolume's entry reads as an empty directory, as in Linux.
  • LZO. Padding was detected at the wrong offsets, so many real LZO extents failed with BadCompression, and sectors above 4 KiB weren't handled.
  • Feature checks. Unknown incompat bits are refused instead of ignored, remap-tree is refused until it's supported, and xxhash, sha256 and blake2 filesystems report UnsupportedChecksum instead of a checksum mismatch.

Breaking changes

  • Inode carries its subvolume and its fields are private. Use objectid() and subvolume().
  • DirEntry gains inode and is #[non_exhaustive].
  • Error gains NotASubvolume.
  • The MSRV is Rust 1.87, which ruzstd 0.9 requires.

Added

  • Btrfs::open_subvol_id and Btrfs::open_subvol_path, matching the kernel's subvolid= and subvol=.
  • Btrfs::subvolume(), replacing default_subvol_objectid(), which remains as a deprecated alias.
  • ruzstd 0.9.1, which fixes RUSTSEC-2026-0344, and miniz_oxide 0.9.1.

The full list is in CHANGELOG.md.

lambutter is the btrfs reader in LamBoot, from Lamco Development LLC.