# repo22 G4 full manual regression report

## Scope and result

- Exact scope: TC005, TC067-TC083, TC117, TC134-TC140, TC142.
- Count check: 27 requested, 27 executed, 0 duplicate, 0 omitted.
- Result: **PASS 27, FAIL 0, SHELVE 0, NOT RUN 0**.
- Kernel source baseline: `9ae22009f23a65320730072a780998e80aa9b728`.
- No repo22 kernel source was changed during this regression.
- No kernel failure was found, so no new `issues/` entry was required.

## Isolated environment

- Worktree: `/work/build/repo22-manual-g4-20260809T072432Z`.
- Branch: `manual-g4-20260809T072432Z`.
- Dedicated qcow2 overlay backed by the FreeBSD 15 development base.
- Dedicated SSH forward: `127.0.0.1:9224`; port 9222 was not used.
- Guest: FreeBSD `15.0-RELEASE-p8`, amd64, GENERIC,
  `releng/15.0-n281036-53054229dcb3`.
- Final guest cleanup: zero matching mounts, zero md units, EROFS malloc
  active count 0, KLD unloaded, guest responsive, QEMU stopped.

## Exact KLD build

The module used only `repo-community/repo22/src` from the baseline worktree.
It was built for `x86_64-unknown-freebsd15` with all 14 Makefile source files,
FreeBSD `15.0 RELEASE-p9` headers, clang/LLD 19.1.7, and `WITH_ZSTDIO=0`.
The guest is p8; both header and guest are the same FreeBSD 15 release KBI.

```text
erofs.ko SHA256 = ee0b2e7c4ebf3602de8be8d47ddcfd021bc90a5265e7e9bf449bb9de2fbf4f04
guest kldstat   = erofs.ko, module erofs, id 507
```

## Fixture provenance

Installed `mkfs.erofs`, `dump.erofs`, and `fsck.erofs` reported erofs-utils
1.8.6. `tests/g4_fixtures.py` created both source trees without consuming old
images, ran four deterministic mkfs commands, transformed structured fields,
and reopened every result. A second fresh output directory produced identical
source and image checksum files.

```text
source inventory SHA256 = c48f72777b0a04514fcfc7ea9c4ed77089ab0ed4537eac9cb7430e1acafe3d0a
metabox payload SHA256  = 50c5740b5fe5630ee919022d7ee1ce59d3e7d089c9d66e2baf82bf9de8233d40
```

| Image | SHA256 |
|---|---|
| `basic.erofs` | `b375a3ca60de64b2c635b3ec45c9285c840e0a05bec105d5d8f68308300e7670` |
| `prefix-primary.erofs` | `49fc472a26412d154df729d8b0079801b35e97af2eb7fc3fa226dc65ee1963f9` |
| `metabox-plain.erofs` | `dd7b04097d1bfe283b65c95d759acd2176beb7cb0f1fe9d5ddbc0694b5acba9d` |
| `metabox-compressed.erofs` | `682b9dc1e0b492d935c03deba2ab644c1f0bcbf8e1ec623c15fb4990d25fe584` |
| `metabox-fragment.erofs` | `c93f4c281ed621519ced42a45cdb21b543047b7058dab31ad0def851cc19f4f1` |
| `bad-inline-entry.erofs` | `f18693c880bac0a273f2497cb0f81c0c52e19edc3ad45354eb38a39624adafd2` |
| `bad-shared-entry.erofs` | `875c27df56de2336fded3ef1db1c9fdc035db618096aa9269bfe70ea6f59c664` |
| `bad-shared-declared-bounds.erofs` | `19fc69cbe21051de2cf1cc19454cf64cc4a0ece444c6607956e066c2d4d332b3` |
| `bad-prefix-declared-bounds.erofs` | `d24b7a171aa28c3a46e3893749a4d08ab5d467c103f47aefcc0ca0f4e153d365` |
| `bad-metabox-truncated-extension.erofs` | `0bad23b1ad77eb8f2ffee83f89b7ef91b1c49ba2a20661adca21cd9efce0911e` |
| `bad-ishare-prefix-id.erofs` | `10357f28a11c2a8bbc329e01a414248415719ef088734a6ad75b934c0f65fc43` |
| `bad-fragment-self-loop.erofs` | `3b61228041591716c650a6613de30b2d9abe8b01148a9ae513b7de4d9b958d78` |
| `bad-fragment-range.erofs` | `432618f98a6e32351448120d8c694a4f31b45cb3078e08dad39b85fa01b47039` |
| `bad-metabox-recursive-nid.erofs` | `ab28a5478f569eb8a59e59e94448a85918885fcd328dadc2557ba6222dcd5aaf` |
| `bad-packed-recursive-nid.erofs` | `ad9a0ed1598c8a8e16911190c9042d58315fbcdc23af824ea106af55ffe6f2f4` |

The fragment positive self-check found carrier NID 46, compressed-full layout,
size 32768, fragment header `0x8000000000000064` at image offset 9696,
fragment offset 100, packed NID 48, and packed size 32868. Thus
`100 + 32768 == 32868`. Shared entries were at metabox offsets 4096, 4128,
and 4156; prefix records were at 8192 and 8224 with base indexes 1 and 4.

## FreeBSD namespace semantics

Linux `user.*` was queried through FreeBSD namespace `user` with the leading
`user.` removed. Linux `trusted.*`, `security.*`, and ACL indexes were queried
through namespace `system`. Trusted/security list names retained their full
prefixes; ACL names were `posix_acl_access`/`posix_acl_default`. This is the
FreeBSD extattr ABI and intentionally does not copy Linux `getfattr` commands.

`getextattr` does not reliably communicate every kernel failure through its
process status, so errno evidence came from guest `truss`: `ENOATTR=87`,
`EINTEGRITY=97`, and `EROFS=30`. Every corruption in this scope returned
`EINTEGRITY`; no case required normalization to `EIO=5`.

## Per-TC results

| TC | Guest evidence | Result |
|---|---|---|
| TC005 | inline user list; exact NUL-containing value; miss `ENOATTR 87` | PASS |
| TC067 | shared `shared_key` exact on two files; inline `local` exact | PASS |
| TC068 | missing name and wrong namespace both `ENOATTR 87` | PASS |
| TC069 | three shared names once; text, NUL, and binary values exact | PASS |
| TC070 | shared `trusted.config` exact; unprivileged system access denied | PASS |
| TC071 | shared `security.selinux` exact; miss `ENOATTR 87` | PASS |
| TC072 | system lists trusted, security, ACL names; user subset empty | PASS |
| TC073 | plain metabox mounted; bit-63 inodes, file hashes, xattrs exact | PASS |
| TC074 | three inline user values exact, including `00..1f` | PASS |
| TC075 | inline `trusted.admin` exact; user lookup `ENOATTR 87` | PASS |
| TC076 | capability and SELinux binary bytes exact | PASS |
| TC077 | packed user long-prefix names and values exact | PASS |
| TC078 | packed trusted long-prefix names and values exact | PASS |
| TC079 | packed NID 1201; two qualified records; both namespaces exact | PASS |
| TC080 | four repeated prefix lookups exact; miss `ENOATTR 87` | PASS |
| TC081 | metabox shared, inline, and long-prefix shared values exact | PASS |
| TC082 | raw ACL bytes and `getfacl -n` agree; user lookup `ENOATTR 87` | PASS |
| TC083 | four user attributes exact; system list empty | PASS |
| TC117 | malformed inline/shared gets both `EINTEGRITY 97`; mount stable | PASS |
| TC134 | nonzero xattr base shared value exact on two bit-63 inodes | PASS |
| TC135 | metabox, packed, and primary prefix backings all exact | PASS |
| TC136 | truncated extension and bad ishare ID mounts `EINTEGRITY 97` | PASS |
| TC137 | shared get and prefix mount bounded at declared image, errno 97 | PASS |
| TC138 | UID order 3002/2002 accepted; empty fallback; 3 negatives errno 97 | PASS |
| TC139 | FIFO stat/ACL/xattr reads; set/delete operations `EROFS 30` | PASS |
| TC140 | compressed and fragment metabox positive; 4 negatives errno 97 | PASS |
| TC142 | independent fragment rerun positive; 4 negatives errno 97 | PASS |

## Stability and cleanup

Positive values were compared as `getextattr -qq -x` bytes, not display text.
Negative mount and VOP calls were traced at the kernel syscall boundary. Each
case recorded zero matching mounts and zero matching md providers after its
cleanup. TC140 and TC142 additionally showed:

```text
erofs active allocations = 0
guest responsiveness     = ok
panic/trap/hang           = none
```

The final KLD unload succeeded. The dedicated guest powered off, QEMU exited,
and TCP port 9224 no longer had a listener. Generated images, KLDs, overlays,
and raw logs remained outside Git and were not included in the commit.
