Skip to content

Releases: reinauer/ODFileSystem

ODFileSystem v0.6.0

Choose a tag to compare

@github-actions github-actions released this 06 Jul 04:19

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 cdbench on 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/FreeMem per 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.
  • namefix duplicate-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 3 image 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 SL and UDF symlink ICBs are now exposed as ST_SOFTLINK with ACTION_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

  • -O2 release default-O2 beat -Os by 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 variantODFileSystem020 ships 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_CHANGENUM counter 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's usbscsi.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

Choose a tag to compare

@github-actions github-actions released this 18 Jun 05:18

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_PARENT path 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, FileSystemVectorPort frontend, 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_STARTUP directly, 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 native SameLock/SameFile
    results, and binding ExamineData to 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 ExNext resume 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_PARENT by 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-gcc container.
  • 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 from v* 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 amiga chooses the intended
    cross-compiler while still honoring explicit overrides.
  • Routed OS4 serial debug logging through DebugPrintF().
  • Accepted OS4 ACTION_SHUTDOWN in 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

  • @LIV2 made their first contribution in #6

Full Changelog: v0.4...v0.5.0

ODFileSystem v0.4

Choose a tag to compare

@github-actions github-actions released this 22 Apr 04:05

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 proper DLT_DEVICE entry with a
    valid FileSysStartupMsg, which improves compatibility with DOS
    code that expects both a device node and a volume node.
  • ACTION_COPY_DIR_FH now duplicates file locks for ordinary files
    with SHARED_LOCK, which fixes callers that use
    DupLockFromFH() on real files such as C:Version.
  • ACTION_EXAMINE_OBJECT now 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
    after struct 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.py to verify
    EXAMINE_FH, PARENT_FH, and COPY_DIR_FH against real files,
    including /C/Version from AmigaOS3.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

Choose a tag to compare

@github-actions github-actions released this 21 Apr 15:30

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.library resolve 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

Choose a tag to compare

@github-actions github-actions released this 18 Apr 04:18

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 CDDA backend name. The pure-audio label is cached in cdda_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() in odfs/node.h, replacing repetitive field-by-field comparisons across mount and ancestry logic. The grandparent_out parameter of odfs_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_t field is only 32 bytes. The copy is now bounded to sizeof(ctx->volume_name), fixing the Coverity overrun warning in copy_pure_audio_volume_name().

Tests

  • Host-side CDDA naming coverage added (tests/unit/test_cdda.c).
  • Amiga handler test extended to verify NameFromLock(), Info(), and Examine() volume names (tests/amiga/test_handler.c).
  • New unit coverage for parent resolution with a NULL grandparent output (tests/unit/test_ancestry.c).

Full Changelog: v0.1...v0.2

ODFileSystem v0.1

Choose a tag to compare

@github-actions github-actions released this 18 Apr 04:01

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

Contributors