Summary
JNode's ISO9660 reader cannot see deeply nested directories on a Rock Ridge / Joliet ISO mastered with mkisofs -R -J. The directory and its files provably exist on the image (verified host-side with isoinfo), but on-guest the path reports "does not exist". Shallow directories on the same disc list fine.
Environment
- JNode
0.2.9-dev (x86 32-bit, cd-x86-lite), VirtualBox 7.2.6
- ISO mastered with
mkisofs -o jnode-x86-lite.iso -R -J -b boot/grub/eltorito.s2 -no-emul-boot -boot-load-size 4 -boot-info-table <stage>
- Observed 2026-09-17
Reproduction
- Stage a nested tree on the CD, e.g.
ox/mauve/gnu/testlet/java/io/DataInputStream/ containing ReadReference.class, ReadStream.class (depth 7 incl. device root: sg0/ox/mauve/gnu/testlet/java/io/DataInputStream).
- Re-master, cold boot (important: a snapshot-resume after an ISO change serves stale FS caches — always poweroff+start, see note below).
- On guest:
ls /devices/sg0/ox/mauve/gnu/testlet/java/io/DataInputStream
# -> this file or directory does not exist
ls /devices/sg0/ox/mauve
# -> works, shows the [gnu] subdir and all loose files
- Host-side verification that the files are on the image:
isoinfo -R -f -i jnode-x86-lite.iso | grep DataInputStream
# -> /ox/mauve/gnu/testlet/java/io/DataInputStream/ReadStream.class etc.
ls staging/ox/mauve/gnu/testlet/java/io/DataInputStream/ # files present
Small subdirectories (2 files) at the same depth also fail, so this is not a multi-extent (large directory) problem — it looks like a maximum-depth limit or unhandled Rock Ridge relocation (RE) entries in fs/src/fs/org/jnode/fs/iso9660/.
A related symptom observed once (possibly confounded by a stale snapshot FS cache, so reported here only as a note): ls on an affected directory threw java.lang.StringIndexOutOfBoundsException: String index out of range from org.jnode.fs.iso9660.Descriptor.getDChars(Descriptor.java:172) via EntryRecord.getFileIdentifier(EntryRecord.java:140) / EntryRecord.<init>(EntryRecord.java:64). If directory parsing can fail, it should degrade to an error for that entry, not abort the whole listing.
Expected behavior
- Nested directories up to the ISO9660 limit (8 levels) list and read correctly, or
- a clear limitation is documented (
help mount / filesystem docs).
Impact / workaround
Test corpora with package-shaped trees (e.g. mauve gnu/testlet/...) cannot be served from the CD; we fell back to staging loose files flat in one directory plus one explicitly-listed sibling (ReadStream.class). That caps corpus growth and forces per-file staging maintenance.
Triage Addendum (auto, 2026-09-25)
- Area / Kind: area/fs (Sub: ISO9660) / kind/bug
- Blast radius: L2 package (
org.jnode.fs.iso9660; suspected EntryRecord/directory parsing, no public API or plugin-boundary change expected)
- Expected scope: pending trace; bound any fix to
fs/src/fs/org/jnode/fs/iso9660/ and focused filesystem tests, with no ASM, public API, or boot-path changes
- Test path:
sh build.sh -f fs/build-tests.xml all-junit, then cold-boot a cd-x86-lite image and repeat the nested lookup
- Merge signal: human-review (insufficient signal: incomplete bug repro and filesystem behavior change)
- Gaps: blocking: reporter must provide the JNode commit SHA, complete VirtualBox/QEMU cold-boot command, and 20-60 line console excerpt around the failed lookup or exception
- Full report:
## Triage comment below.
❌ Ticket Runner Status
| Field |
Value |
| Phase |
FAILED |
| Turn |
0/3 |
| Retries |
3/3 |
| PR |
- |
| Started |
2026-09-25T00:53:32.241Z |
Summary
JNode's ISO9660 reader cannot see deeply nested directories on a Rock Ridge / Joliet ISO mastered with
mkisofs -R -J. The directory and its files provably exist on the image (verified host-side withisoinfo), but on-guest the path reports "does not exist". Shallow directories on the same disc list fine.Environment
0.2.9-dev(x86 32-bit,cd-x86-lite), VirtualBox 7.2.6mkisofs -o jnode-x86-lite.iso -R -J -b boot/grub/eltorito.s2 -no-emul-boot -boot-load-size 4 -boot-info-table <stage>Reproduction
ox/mauve/gnu/testlet/java/io/DataInputStream/containingReadReference.class,ReadStream.class(depth 7 incl. device root:sg0/ox/mauve/gnu/testlet/java/io/DataInputStream).Small subdirectories (2 files) at the same depth also fail, so this is not a multi-extent (large directory) problem — it looks like a maximum-depth limit or unhandled Rock Ridge relocation (
RE) entries infs/src/fs/org/jnode/fs/iso9660/.A related symptom observed once (possibly confounded by a stale snapshot FS cache, so reported here only as a note):
lson an affected directory threwjava.lang.StringIndexOutOfBoundsException: String index out of rangefromorg.jnode.fs.iso9660.Descriptor.getDChars(Descriptor.java:172)viaEntryRecord.getFileIdentifier(EntryRecord.java:140)/EntryRecord.<init>(EntryRecord.java:64). If directory parsing can fail, it should degrade to an error for that entry, not abort the whole listing.Expected behavior
help mount/ filesystem docs).Impact / workaround
Test corpora with package-shaped trees (e.g. mauve
gnu/testlet/...) cannot be served from the CD; we fell back to staging loose files flat in one directory plus one explicitly-listed sibling (ReadStream.class). That caps corpus growth and forces per-file staging maintenance.Triage Addendum (auto, 2026-09-25)
org.jnode.fs.iso9660; suspectedEntryRecord/directory parsing, no public API or plugin-boundary change expected)fs/src/fs/org/jnode/fs/iso9660/and focused filesystem tests, with no ASM, public API, or boot-path changessh build.sh -f fs/build-tests.xml all-junit, then cold-boot acd-x86-liteimage and repeat the nested lookup## Triagecomment below.❌ Ticket Runner Status