114 lines
5.5 KiB
Markdown
114 lines
5.5 KiB
Markdown
# repo22 xattr/ACL root-cause manual test report
|
|
|
|
Date: 2026-08-08 18:12 UTC; final integration rerun on 2026-08-08
|
|
Baseline: `29a215dd4519579f6313b3df67d524a6b4bdf3ca` plus the scoped xattr/ACL fixes
|
|
Guest: FreeBSD 15.0-RELEASE-p8 amd64
|
|
Host tools: erofs-utils 1.8.6 plus deterministic transformed fixtures
|
|
|
|
## Build and module
|
|
|
|
- `git diff --check`: PASS.
|
|
- `./build.sh`: PASS; final `build/erofs.ko` SHA-256 is
|
|
`50a19ea96c7414f73d92049671e66a9eacc9ff5abe27950a46d16c8e6c763baf`.
|
|
- `nm -u build/erofs.ko | grep -w bcmp`: no match, PASS.
|
|
- `kldload /tmp/repo22-integration-20260808/erofs.ko`: PASS.
|
|
- Repeated `mdconfig -a -t vnode -f IMAGE`, `mount -t erofs`, `umount`, and
|
|
`mdconfig -d`: PASS for every fixture below.
|
|
- `kldunload erofs`: PASS; final module, EROFS mount, and md-device counts were
|
|
all zero.
|
|
- New dmesg errors, traps, or panics: none.
|
|
|
|
## Existing xattr and ACL regression
|
|
|
|
- Inline user, trusted, and security xattrs: PASS.
|
|
- Shared user xattrs and shared POSIX access ACL: PASS.
|
|
- Packed long-prefix table and xattr-name-filter: PASS.
|
|
- Access/default ACL decode and inherited child ACL: PASS.
|
|
- Owner, owning-group, named-user, and other access matrix: PASS.
|
|
- Read-only ACL/xattr mutation rejection: PASS.
|
|
- TC117 malformed name length and value size: PASS. Xattr operations returned
|
|
`EINTEGRITY`; directory metadata and file contents remained readable.
|
|
- An invalid long-prefix reference without a declared prefix table is now
|
|
skipped like Linux. Other valid xattrs and file data remain readable.
|
|
|
|
## New regression cases
|
|
|
|
- TC134 metabox shared nonzero base: PASS with
|
|
`metabox-shared-nonzero-base.erofs`. The image has
|
|
`SHARED_EA_IN_METABOX`, `xattr_blkaddr=1`, and a plain metabox carrier.
|
|
`getextattr -qq user metaboxshared /mnt/repo22-integration/hello.txt`
|
|
returned exactly `nonzero-base`.
|
|
- TC135 metabox long-prefix backing: PASS with
|
|
`metabox-prefix-shared.erofs`.
|
|
`getextattr -qq user repo22.application.component.setting` on
|
|
`/mnt/repo22-integration/long/file2.txt` returned `long-prefix-value`.
|
|
Primary-image long-prefix fallback also passed with
|
|
`long-prefix-primary-fallback.erofs` and the same expected value.
|
|
- TC136 truncated metabox extension: PASS; mount returned `EINTEGRITY`.
|
|
Out-of-range ishare prefix ID: PASS; mount returned `EINTEGRITY`.
|
|
- TC137 shared xattr outside declared image: PASS; normal data and an in-bounds
|
|
xattr remained readable, while the redirected entry returned `EINTEGRITY`.
|
|
Prefix record outside declared image: PASS; mount failed. The valid primary
|
|
fallback control mounted and returned the expected value.
|
|
- TC138 unordered unique UID qualifiers: PASS and preserved order 3002, 2002.
|
|
Header-only ACL: PASS and fell back to mode. Duplicate UID qualifier: PASS
|
|
negative test and returned `EINTEGRITY`.
|
|
- TC139 FIFO access ACL, list/get system xattr: PASS. `setfacl`, `setextattr`,
|
|
and `rmextattr` all returned read-only filesystem errors.
|
|
- TC140 compressed metabox: PASS with `metabox-large-shared.erofs`. On-disk
|
|
qualification found `METABOX`, metabox inode datalayout 1
|
|
(`EROFS_INODE_COMPRESSED_FULL`), and no fragment pcluster. A cold file read,
|
|
the metabox long-prefix lookup, and a 231-byte xattr value all matched the
|
|
source fixture.
|
|
|
|
## Final metabox and metadata-boundary smoke
|
|
|
|
The final combined module was exercised with these exact guest operations:
|
|
|
|
```sh
|
|
kldload /tmp/repo22-integration-20260808/erofs.ko
|
|
mdconfig -a -t vnode -f /tmp/repo22-integration-20260808/IMAGE.erofs
|
|
mount -t erofs /dev/md0 /mnt/repo22-integration
|
|
getextattr -qq user NAME /mnt/repo22-integration/PATH
|
|
umount /mnt/repo22-integration
|
|
mdconfig -d -u 0
|
|
kldunload erofs
|
|
```
|
|
|
|
- Compressed metabox and metabox long-prefix:
|
|
`metabox-large-shared.erofs` returned `long-prefix-value` for
|
|
`repo22.application.component.setting`; its regular file content also
|
|
matched `long prefix fixture 1`.
|
|
- Primary shared fallback while `METABOX` is enabled:
|
|
`metabox-large-shared.erofs` has `SHARED_EA_IN_METABOX` clear and
|
|
`xattr_blkaddr=1`; `shared_key` returned `repo22-shared-value` from the
|
|
primary shared-xattr area.
|
|
- `SHARED_EA_IN_METABOX` nonzero base:
|
|
`metabox-shared-nonzero-base.erofs` returned `nonzero-base` from the shared
|
|
entry addressed relative to metabox block 1.
|
|
- Cross-metadata shared xattr: `shared-cross-metadata.erofs` returned
|
|
`repo22-shared-value` for `shared_key` on `shared/file3.txt`.
|
|
- Cross-metadata inline xattr: `xattr-cross-metadata.erofs` returned the exact
|
|
expected `alpha`, `gamma`, and `delta` values on `file000`, `file090`, and
|
|
`file179`. The metabox-specific inline boundary fixture also returned
|
|
`valid-inline-boundary` for `crossboundary`.
|
|
|
|
The fragment-backed compressed metabox negative layout was **not generated and
|
|
was not executed**. The passing TC140 fixture is compressed but non-fragment.
|
|
The code still rejects a compressed metabox inode whose fragment flag is set;
|
|
that rejection remains layout-reviewed rather than fixture-verified.
|
|
|
|
## Fixture qualification
|
|
|
|
The old `namespace-shared.erofs` contains an xattr entry with name index `0x80`
|
|
but advertises no `XATTR_PREFIXES` feature and contains no prefix table. It is
|
|
not a valid long-prefix fixture. The driver now follows Linux behavior by
|
|
skipping that unresolved entry while preserving all valid xattrs and file data.
|
|
|
|
## Separate namei write set
|
|
|
|
The previously observed cold nested lookup issue was fixed by the separate
|
|
`src/namei.c` and `src/dir.c` write set and passed TC141 in the same final
|
|
integration build. Those source files are intentionally excluded from the
|
|
xattr/ACL commit.
|