Repository navigation
Releases: lamco-admin/lambutter
Release list
lambutter 0.5.0
lambutter 0.5.0 fixes reads on btrfs filesystems that span more than one device and refuses fscrypt-encrypted data and names instead of returning them. It's a minor release because it adds two error tokens; no type changed shape.
Fixed
- Multi-device filesystems were read from the wrong device. A chunk's first stripe was used whatever device it named, so on a filesystem across two devices lambutter read the device it was given at the other device's offsets. Metadata checksums caught that for tree blocks; file data came back wrong with no error. Each chunk is now read from its copy on the device being read (the superblock's
dev_item.devid), and a chunk with no copy there is refused asUnsupportedProfile("prof_other_device"). A RAID1 filesystem reads from either member. - fscrypt markers were ignored. btrfs fscrypt isn't in mainline Linux, but its on-disk markers are defined: An extent with a non-zero
encryptionbyte holds ciphertext and was returned as file data, and a directory entry withBTRFS_FT_ENCRYPTEDhas an encrypted name. Both are refused asUnsupportedFeature("feat_encryption").
Added
- Error tokens
prof_other_deviceandfeat_encryption. - Fixtures for RAID1 across two devices with copies at different offsets, single data across two devices, and fscrypt markers. All three fail on 0.4.0.
Full changelog: CHANGELOG.md
lambutter 0.4.0
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/entrieslisted 72. - Subvolumes. An entry naming a subvolume was read as an inode in the parent, so a
/bootsubvolume 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
UnsupportedChecksuminstead of a checksum mismatch.
Breaking changes
Inodecarries its subvolume and its fields are private. Useobjectid()andsubvolume().DirEntrygainsinodeand is#[non_exhaustive].ErrorgainsNotASubvolume.- The MSRV is Rust 1.87, which ruzstd 0.9 requires.
Added
Btrfs::open_subvol_idandBtrfs::open_subvol_path, matching the kernel'ssubvolid=andsubvol=.Btrfs::subvolume(), replacingdefault_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.
lambutter 0.3.1
lambutter 0.3.1, published to crates.io on 2026-06-04. This GitHub release was added on 2026-10-15.
Changed
- The optional
miniz_oxidedependency (thezlibfeature) moves from 0.8 to the 0.7 line, matching the version in the Debian archive. lambutter only callsinflate::decompress_to_vec_zlib_with_limit, which 0.7 provides.
Superseded by 0.4.0, which fixes reads across B-tree leaf boundaries, LZO extents and subvolume paths.
lambutter 0.3.0
First public release of lambutter, a no_std read-only btrfs reader for UEFI bootloaders and embedded contexts — the btrfs counterpart to ext4-view.
- Read-only; opens files, symlinks, and directory listings on SINGLE / DUP / RAID1 / RAID1C3 / RAID1C4 volumes.
- Decodes zstd, zlib, and LZO extents; unsupported profiles surface as typed errors.
no_std+alloc; dual-licensed MIT OR Apache-2.0.- On crates.io: https://crates.io/crates/lambutter
See CHANGELOG.md for the version history (v0.1.0 → v0.3.0).