Files
erofs-freebsd-out-tree/tests/results/manual/2026-08-08T1812Z/manual-test-report.md
T
2026-08-18 09:20:44 +02:00

5.5 KiB

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:

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.