The performance release. Since v0.5.0, ODFileSystem's data path and metadata path were rebuilt around zero-copy reads and a parsed-directory cache. On the cdbench fixture (68020 -O2 release build) sequential read throughput climbs from 46,262 KiB/s to 197,673 KiB/s — a 4.3× increase (+327%) — and now runs 27% faster than the original AmigaOS 3.2.x CDFileSystem it replaces. This release also adds High Sierra, ISO 9660 Level 3, and native symlink support.
Measured with
cdbenchon the reference ISO fixture, before/after figures
taken from the commits that made each change. The 68000-compatible build
tracks the 68020 build closely (sequential reads reach ~100% of the ROM
CDFileSystem); the headline numbers below are from the 68020 variant.
Also check out the overview of CD filesystem performance on the Amiga
⚡ Performance
Sequential reads — +327% since v0.5.0
| Build step | Sequential throughput | Δ |
|---|---|---|
| v0.5.0 baseline | 46,262 KiB/s | — |
| 64 KiB DMA bounce buffer | 55,649 KiB/s | +20% |
| Zero-copy reads into caller buffers | ~147,500 KiB/s | +165% |
-O2 + 68020 release build |
155,536 KiB/s | — |
| Sector addressing by shift, not 64-bit division | 197,673 KiB/s | +27% |
| v0.5.0 → v0.6.0 total | +327% (4.3×) |
Large file reads now go straight into the caller's buffer when the request covers a whole aligned window, fits MaxTransfer, and satisfies the transfer Mask — no more copying every byte through the DMA bounce buffer. The block cache dropped two software 64-bit divisions from its hottest path (every supported medium uses power-of-two sectors, so byte addressing is now a shift
and a mask), which alone took sequential reads 27% past the AmigaOS 3.2.x CDFileSystem and cut a cached 2 KiB re-read from 115 µs to 68 µs.
Directory & metadata operations
A new LRU metadata cache (core: cache parsed directories) enumerates each directory once, packs the result into a single allocation, and serves every subsequent lookup, ExNext step, and listing continuation from memory instead
of re-parsing on-disc records and Rock Ridge data every time. This makes ExNext linear instead of quadratic and pushes warm metadata past the original AmigaOS 3.2.x filesystem. Measured on the cdbench fixture against AmigaOS 3.2.x CDFileSystem
47.26:
| Operation | Before cache | After cache | vs. AmigaOS CDFileSystem |
|---|---|---|---|
ExAll traversal |
3,547 e/s | 9,878 e/s | faster (orig ~7,695) |
| Warm traversal | 3,693 e/s | 9,919 e/s | faster (orig ~7,698) |
ExNext step |
225 e/s | 2,811 e/s ¹ | — |
| Deep lock | 1,628 µs | 427 µs | — |
| Open from lock | 1,058 µs | 437 µs | — |
| Negative lookup | 372 µs | 188 µs | — |
| Small open + read | 5,834 µs | 999 µs | faster (orig 1,127 µs) |
¹ ExNext throughput rises further to ~7,700 e/s after the closed-form DateStamp conversion and the -O2 release default.
Compared to the v0.5.0 baseline the difference is even larger — directory listing (ExNext) went from 128 e/s to ~7,700 e/s — because v0.5.0 had no metadata cache at all. Cache size is tunable at mount time via Control = "METACACHE=nnn" (KiB; default 96, disabled in the ROM profile).
The cache is bit-for-bit safe: a recursive listing of the fixture is byte-identical with the cache compiled out, and cached namefix makes duplicate-name ~N suffixes stable across enumerations by construction.
Other data/metadata-path work
- Clustered read-ahead: a cache miss now fills several contiguous sectors in one device request, speeding cold directory scans and adjacent reads.
- Constant-time lock/handle validation and LRU victim selection (was a list walk per operation).
- Per-packet handler objects (locks, file handles, entries) come from fixed-size free-list pools instead of
AllocMem/FreeMemper packet. - Path resolution rotates node pointers instead of copying ~660-byte node structs per component; the on-disc name buffer is sized per platform.
- Faster parent lookup for UDF and HFS, and UDF no longer issues skipped child ICB / metadata reads during parent resolution.
namefixduplicate-name detection is now hashed instead of O(n²).- OS4: directory resume state carries across
FSExamineDir.
✨ New filesystem support
- High Sierra (HSF) volumes — pre-ISO 9660 discs (e.g. the IBM OS/2 Warp 4 install CD) now mount. Implemented as an HSF mode inside the ISO 9660 backend with the shifted descriptor offsets and 6-byte directory dates; compiled out of the ROM profile. (
tests/unit/test_high_sierra.c) - ISO 9660 Level 3 / multi-extent files — continuation records are merged into a single node with a 64-bit size instead of silently truncating a file to its first extent. Verified against a real
mkisofs -iso-level 3image with a >4 GiB file, byte-exact across the extent split. (tests/unit/test_multi_extent.c) - Symlinks as native AmigaDOS soft links — Rock Ridge
SLand UDF symlink ICBs are now exposed asST_SOFTLINKwithACTION_READ_LINK, so dos.library resolves them transparently. Targets are converted to AmigaDOS path syntax. Validated against mkisofs-R, mkisofs-udf, and hdiutil UDF images. (tests/unit/test_symlink.c)
📦 Build & packaging
-O2release default —-O2beat-Osby 64% on cold directory discovery and 5–8% across lock latencies for about a quarter more binary size; the ROM profile stays on-Os. Release size guard raised to 96 KiB.- New 68020 variant —
ODFileSystem020ships in the AmigaOS 3 archive and on the test ADF. It's both smaller and faster than the 68000 build (cold discovery +24%,ExNext+18%) With the shift-not-divide cache change on top, its sequential reads land 27% past the ROM CDFileSystem (197,673 KiB/s). The 68000 build remains the compatible default. - OS4 handler size allowance raised to 144 KiB.
- CI now builds with the gcc 13.4 toolchain image, and Aminet uploads are tag driven (with the OS4 readme filename corrected).
- Cache feature flags are overridable at build time.
🛡️ Robustness & fixes
- Don't let a stale
TD_CHANGENUMcounter veto media mounts. The change handler now decides from the actual media-present state versus our own mount state, and uses the counter only to tell a disc swap apart from a redundant re-interrupt. Fixes the first disc after boot failing to mount on drivers that fire the change interrupt before bumping the counter — e.g. Poseidon'susbscsi.device(reported by Nils on an A1200 with a USB DVD drive) — while still keeping outstanding locks and file handles alive across spurious interrupts. - Require dos.library V37 on classic systems (the real Kickstart floor is 2.04, matching the documented minimum).
- Reject duplicate DOS device names safely instead of corrupting the device list.
- Allow devices that don't implement
TD_GETGEOMETRY(many CD/SCSI drivers) instead of declining the mount. - Rock Ridge
SL: correctly separate..and.components with a slash. - CDDA audio positions are computed in 32 bits (drops a 64-bit division).
- Docs and mountlist examples use
FileSystem = L:ODFileSystem.
Changelog
39 commits, 46 files changed (+4,999 / −508) since v0.5.0
(2026-06-17 → 2026-07-05).
Full Changelog: v0.5.0...v0.6.0