Files
erofs-freebsd-out-tree/tests/results/manual/2026-08-09T1244Z-g6/manual-test-report.md
T
2026-08-13 10:44:59 +02:00

7.4 KiB

repo22 G6 Chunk and Multi-Device Manual Regression

Date: 2026-08-09 Executor: G6 manual agent Source baseline: 6b33b4afb490be7d6fec70e499469c306a58435d Scope: TC006, TC093-TC101, TC118 (11 exact IDs)

Result

PASS. All 11 requested test cases passed. There are no KFAIL, SHELVED, or ENV results, no duplicate IDs, and no omitted IDs.

Status Count
PASS 11
KFAIL 0
SHELVED 0
ENV 0
Duplicate 0
Omitted 0

No kernel source was changed. git diff -- src was empty after testing.

Environment and build identity

  • Worktree: dedicated sparse worktree and branch manual-g6-20260809T114414Z, based directly on xdm/main at the source commit above.
  • VM: dedicated qcow2 overlay, QEMU TCG, 6144 MB, 4 vCPUs, SSH forward 127.0.0.1:9226 only.
  • Guest: FreeBSD 15.0-RELEASE-p8 amd64, releng/15.0-n281036-53054229dcb3, OSREL 1500068.
  • Guest kernel SHA256: b9abf7b58f9dd4d87f14d2fbc306cf255e6eadc47b8ae885a230f65e28be4562.
  • Tracked build sys source: REVISION=15.0, BRANCH=RELEASE-p9, archived from the same repository commit; archive SHA256 66c457159b758ab1a5d298292b81bd29ab439ca4ab396091602e030da4721cb9.
  • Build configuration: native guest build, WITH_ZSTDIO=1 FREEBSD_SRC=/root/freebsd-src.
  • KLD SHA256: d5ff5ceef1ad76eb5b608d362b04f3bc40379e58a73d91ed3ae747c035d7b8af.
  • repo22 source archive SHA256: 7562e230d165f0c0caa050684a9c1e2bd1bbb178e54a1d5273428435ae512455.

The latest tracked sys source is p9 while the clean guest kernel/userland is p8. Both use OSREL 1500068; the module built and loaded successfully. This source/guest patch-level distinction is recorded rather than hidden.

Fresh fixture qualification

tests/g6_multidev_fixtures.py generated every source, primary image, blob, flatdev, and negative image from zero with erofs-utils 1.8.6. No old test image or report was an input.

  • Generator SHA256: 18638aee056e05099b39477fa6ad4d678ab0a74a027cfb45146ae225ff35d950.
  • Final manifest SHA256: b636a52c7b3ec7f2343f07e2d389783c8383ec07d9d9468f7552e817891c3a81.
  • Final SHA256SUMS SHA256: ed81d63469b40f1aba691e54a08d39737c71e66d2ff4fef963a0101fa2ad9854.
  • Final fixture archive SHA256: 28be1a5cdcebb163710433c9e7c30162c1170312c34d0b286f4143480881d62f.
  • Generated set: 62 artifacts, 17 parsed fixtures, 7 table/index negative images, and 10 explicit mutation assertions.
  • Reproducibility: two clean output directories had byte-identical manifest.json and SHA256SUMS.
  • Host fsck extraction qualified the mkfs split image, single-index image, explicit two/three-slot images, table-at-zero, uniaddr=0, packed fragment, and the original two-block LZ4 pcluster.
  • Guest final sha256 -c SHA256SUMS returned 0.

During qualification, an initial maximum-48-bit negative used all ones. Field review identified that value as the legal chunk hole sentinel. The generator was corrected to the largest non-NULL address 0xfffffffffffe, regenerated twice, and reverified. Only the intended primary artifact changed; its final SHA256 is d6f113cb5d2cb7da7f892632930eedf1c84fb494f5e1e4f0d2a852496ee92951. The corrected kernel read returned EINTEGRITY.

Exact results

Test ID Status Manual evidence
TC006 PASS Direct mkfs split primary/blob; full and cross-32K range cmp; external MDIOCDETACH returned ERR#16 EBUSY.
TC093 PASS 8-byte device-ID-0 indexes with no table; full and cross-32K range cmp on the primary provider.
TC094 PASS Reversed slot option order; 1/2/1 full and per-index ranges; uniaddr=0 with nonzero ID; swapped media ERR#6 ENXIO; real external 8192-byte LZ4 pcluster produced the complete 131072-byte source SHA256.
TC095 PASS First/middle/last/cross-index reads; zero-high 48-bit control and nonzero-high unified read; mapped ID 3 returned read ERR#19 ENODEV, unaffected file remained readable.
TC096 PASS Parsed normal, table-at-zero, uniaddr=0, and high 48-bit tables; df -k reported 916 KiB = 229 blocks x 4096; table outside primary returned ERR#97 EINTEGRITY.
TC097 PASS Six structural variants each returned nmount ERR#97 EINTEGRITY; after every failure md/KLD/consumer state was zero; slot-2 ENOENT after slot 1 open released slot 1 immediately.
TC098 PASS Packed NID 42 whole-file fragment; size 100000; full SHA/cmp and 8192-byte offset range passed.
TC099 PASS Direct primary+one-blob layout; df -k 900 KiB = 225 blocks x 4096; full/range compare; omitted blob option returned ERR#6 ENXIO.
TC100 PASS Four providers with option order 3/1/2; full read, 262144-byte range across both transitions, and three concurrent reads passed; missing/duplicate/short returned ERR#6/22/6.
TC101 PASS Explicit unified, nonzero-ID flatdev, device-ID-0 flatdev, and nonzero-high 48-bit reads matched source; gap, explicit/unified cross-slot chunk, explicit/flatdev two-block pcluster, and largest non-NULL 48-bit address all returned read ERR#97 EINTEGRITY.
TC118 PASS No options/one option/short returned ERR#6; duplicate/primary-as-slot returned ERR#22; normal detach ERR#16; forced orphan cold slot-2 read ERR#6; second mount ERR#16; primary and external missing paths preserved ERR#2.

External-data proof

The TC094 compressed primary is 8192 bytes and contains only metadata plus its device table. The original pcluster blocks are absent. Its HEAD pblk is the slot-1 unified address, and the 8192 compressed bytes exist only in the external provider. FreeBSD returned the complete source SHA256 8dd7830946e7154d9feaaa87df6d1d39e47d51da22a690c5469dc4f2955ea0f1; therefore this was an external compressed read, not table-only parsing.

TC101 also mounted generated combined flatdev providers with no device.N options. Both nonzero device-ID mapping and device-ID-0 unified mapping returned the same source SHA256 values as explicit providers. erofs-utils 1.8.6 does not qualify these two forms, so the FreeBSD full/range comparisons are the runtime qualification.

Errno summary

  • EBUSY = 16: live md detach and second concurrent mount.
  • ENXIO = 6: missing/short media and forced-orphan cold I/O.
  • ENODEV = 19: mapped but undeclared chunk device ID 3.
  • EINVAL = 22: duplicate provider and primary reused as an external slot.
  • ENOENT = 2: nonexistent primary or external pathname.
  • EINTEGRITY = 97: malformed tables and complete-extent range failures.

Lifecycle and platform behavior

Every TC ended with zero EROFS mounts, zero md units, no loaded EROFS KLD, and no matching GEOM consumer. TC097 repeated this after each individual malformed table. TC118 forced md92 orphaning, observed cold read ERR#6 ENXIO, then unmounted and released the remaining providers without panic or hang. The final dmesg anomaly scan for panic, fatal trap, assertion, watchdog, or EROFS errors was empty.

Linux device tables allow table offset zero and skip uniaddr=0 during device-ID-0 lookup while retaining explicit nonzero-ID selection. FreeBSD matches those on-disk semantics but receives external providers through explicit device.<slot> mount options and owns read-only GEOM consumers. Consequently FreeBSD-specific EBUSY detach and forced-orphan ENXIO behavior was tested directly rather than inferred from Linux loop devices.

Issues

None. No kernel failure remained after correcting the fixture's reserved hole sentinel, so no issue file and no source change were created.