Releases: reinauer/ODFileSystem
Release list
ODFileSystem v0.6.0
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
ODFileSystem v0.5.0
Highlights
-
Native AmigaOS 4 support: adds a PPC/OS4 handler path with
FileSystemVectorPort, freestanding startup, Kickstart module support, and
OS4-specific DOS/vector semantics. -
Workbench and filesystem behavior fixes: improves OS4 lock handling,
file handle state, directory examine behavior, media-change handling,
shutdown, and caller-task I/O so native OS4 callers behave correctly. -
Much faster directory and parent lookups: adds cached ExNext resume
offsets, cached parent ancestors, incremental volume lock lists, and a faster
ACTION_PARENTpath using..entries where available. -
Faster file reads and cache lookups: batches contiguous backend reads and
replaces linear block-cache scans with hashed lookups. -
Release-ready packaging: adds separate OS3 and OS4 build, CI, release,
LHA, and Aminet upload paths, including separate Aminet readmes for each
target.
What's Changed
AmigaOS 4 support
- Added native AmigaOS 4 handler support with a per-target compatibility
layer, OS4 startup code,FileSystemVectorPortfrontend, and OS4-specific
build paths. - Implemented OS4 vector callbacks for locks, file handles, reads, seeks,
metadata, directory examine, inhibit/serialize operations, and read-only
mutation handling. - Added freestanding OS4 handler startup so the filesystem can receive
ACTION_STARTUPdirectly, avoiding C runtime startup consuming the initial
DOS packet. - Added Kickstart module registration support for the OS4
CDFileSystem
path. - Fixed OS4 Workbench behavior by completing native vector semantics,
preserving file handle arguments, returning nativeSameLock/SameFile
results, and bindingExamineDatato DOS-owned contexts. - Fixed OS4 caller-task reads by using caller-owned and cached I/O requests
instead of reusing the handler task request from vector callbacks. - Added OS4 media-change, shutdown, DOS list allocation, lock allocation,
and vector callback serialization fixes.
Performance
- Batched contiguous file reads across ISO9660, Joliet, UDF, HFS, and HFS+
through a shared cache helper. - Reworked block-cache lookups from linear scans to hash-table lookups.
- Added pooled allocation for duplicate-name fixing during directory scans.
- Cached OS3
ExNextresume offsets to avoid rescanning large directories. - Cached parent ancestors on shared objects to speed repeated parent lookups.
- Updated volume lock lists incrementally instead of rebuilding from all locks.
- Sped up
ACTION_PARENTby using..directory entries where available,
improving AmigaOS 3.2 CD boot behavior.
Build, CI, and Release
- Documented separate AmigaOS 3 and AmigaOS 4 build flows.
- Added PPC AmigaOS 4 CI builds using the
amigappc-gcccontainer. - Split release builds into OS3 and OS4 artifact builders.
- Added OS4 release artifacts alongside the existing OS3 outputs.
- Added OS3 and OS4 LHA package targets and separate Aminet readmes.
- Added a release-published Aminet workflow that uploads both OS3 and OS4
packages fromv*releases. - Raised the ROM profile size limit to match current generated handler size.
Fixes and Cleanup
- Split Amiga OS compatibility code out of the shared packet handler.
- Removed scattered OS target conditionals from shared handler code.
- Tightened Amiga build compiler selection so
make amigachooses the intended
cross-compiler while still honoring explicit overrides. - Routed OS4 serial debug logging through
DebugPrintF(). - Accepted OS4
ACTION_SHUTDOWNin the packet loop. - Fixed the OS4 media-change interrupt callback calling convention.
- Allocated OS4 DOS list nodes and locks through DOS-supported APIs.
- Kept OS4 legacy packets on the classic dispatcher while serializing access to
shared filesystem state. - Kept media state per handler process so multi-unit diskboot paths do not
overwrite each other. - Probed OS4 CD units before mounting to avoid publishing dead phantom units.
- Shared node metadata formatting across packet and vector frontends.
- Removed unused OS4 vector packet API surface and trivial compat wrappers.
New Contributors
Full Changelog: v0.4...v0.5.0
ODFileSystem v0.4
This release is a focused AmigaDOS compatibility update for the
Amiga handler, aimed at fixing real boot and utility breakage seen
with the AmigaOS 3.2 CD image. With ODFileSystem v0.4 the
A4091 can successfully boot from the AmigaOS 3.2 CD.
Highlights
- Publish a proper DOS device node as well as the volume node, and
keep valid startup metadata attached to it. - Fix
DupLockFromFH()handling so regular file handles can be
duplicated correctly, not just directory handles. - Align the handler's lock layout with stock DOS filesystem
expectations by reserving the two private words after
struct FileLock.
Fixed
CD0:is now exposed through a properDLT_DEVICEentry with a
validFileSysStartupMsg, which improves compatibility with DOS
code that expects both a device node and a volume node.ACTION_COPY_DIR_FHnow duplicates file locks for ordinary files
withSHARED_LOCK, which fixes callers that use
DupLockFromFH()on real files such asC:Version.ACTION_EXAMINE_OBJECTnow updates the DOS-owned lock state used
by examine and enumeration code, instead of overlapping it with
handler-private metadata.- The lock wrapper now reserves the DOS-private space immediately
afterstruct FileLock, matching stock filesystem layout and
avoiding corruption of examine bookkeeping. - The path resolver documentation was corrected to match the stock
DOS model where assign and device prefix resolution happens
before the packet reaches the handler.
Tests
- Added
tests/integration/check_fh_packets.pyto verify
EXAMINE_FH,PARENT_FH, andCOPY_DIR_FHagainst real files,
including/C/VersionfromAmigaOS3.2CD.iso. - Extended the assign-prefix regression check so it reports success
only after all matching cases have been exercised. - Wired the new file-handle packet regression into
tests/integration/test_amifuse.sh.
Full Changelog: v0.3...v0.4
ODFileSystem v0.3
v0.3 is a focused bugfix release that improves AmigaDOS
compatibility when opening files through assigns.
Compared to v0.2, this release fixes a handler-side path
resolution bug where colon-prefixed names such as
LIBS:workbench.library could incorrectly reset lookup to the
volume root instead of staying relative to the resolved start lock.
In practice, this fixes failures seen while booting the
AmigaOS 3.2 CD, where the Version command could not locate
workbench.library.
What's Changed
- Fix assign-prefixed lookups in the Amiga handler so paths like
LIBS:workbench.libraryresolve relative to the supplied lock. - Restore compatibility with AmigaDOS code paths that use
GetDeviceProc()or assign resolution before calling into the
filesystem. - Add a new AmiFUSE integration regression test for opening both a
plain leaf name and an assign-prefixed name from the same
directory lock. - Run the new regression check as part of the integration test flow.
Full Changelog
platform/amiga: keep assign lookups on the start lock
Full Changelog:
v0.2...v0.3
ODFileSystem v0.2
Release notes
Highlights
Audio CDs now mount with distinct volume names derived from CDDB disc IDs, ancestry/identity handling in the core has been consolidated, and a Coverity-flagged buffer overrun in the Amiga CDDA mount path is fixed. A stack corruption issue was fixed that would make ODFileSystem crash with CDs with more than about four levels of directories.
Features
- cdda/amiga: keep CDDA disc IDs in pure-audio volume names (1639317). Pure-audio discs now expose the CDDB disc id through the volume label so multiple audio CDs no longer all mount as "Audio CD". Mixed-mode discs continue to surface as the synthetic
CDDAbackend name. The pure-audio label is cached incdda_context_t, carried through the backend, copied into the handler mount state, and used verbatim to build the DOS volume node name.
Improvements
- odfs: centralize node identity comparison and simplify ancestry lookup (14db72f). Introduces
odfs_node_matches_identity()inodfs/node.h, replacing repetitive field-by-field comparisons across mount and ancestry logic. Thegrandparent_outparameter ofodfs_resolve_parent_node()is now optional, lowering stack usage for parent resolution in the Amiga handler.
Bug fixes
- amiga: bound CDDA volume name copy (74804fb). The pure-audio handler previously copied the CDDA volume name using destination buffer sizes, but the source
cdda_context_tfield is only 32 bytes. The copy is now bounded tosizeof(ctx->volume_name), fixing the Coverity overrun warning incopy_pure_audio_volume_name().
Tests
- Host-side CDDA naming coverage added (
tests/unit/test_cdda.c). - Amiga handler test extended to verify
NameFromLock(),Info(), andExamine()volume names (tests/amiga/test_handler.c). - New unit coverage for parent resolution with a
NULLgrandparent output (tests/unit/test_ancestry.c).
Full Changelog: v0.1...v0.2
ODFileSystem v0.1
Initial Release
This is the initial release of ODFileSystem, a brand new Amiga optical disk (CDs/DVDs/BlueRay) filesystem for the Amiga.
Files
- ODFileSystem is the full featured production filesystem handler
- ODFileSystem-rom is a stripped down filesystem handler to be integrated in ROMs (e.g. on A4091)
- ODFileSystem-test is a version of ODFileSystem with serial debugging enabled. Try this if you have problems with ODFileSystem and report with the log.
- ODFileSystem-rom-test is a version of ODFileSystem-rom with serial debugging enabled.
If you do not have a serial null modem cable at hand, you can also use Sashimi to grab the serial log from within AmigaOS