slim64fs xfstests Legitimacy Report
V11 — Race to XFSTests
| Field | Value |
|---|---|
| Date | 2026-05-21 |
| Kernel | 6.17.0-29-generic |
| Git commit | b36bbfd (+ V11.3 patch: touch_dir_times in rename) |
| Format version | V9 on-disk format (0x00090002); V10 was semantic debt
only, no format bump |
| Runner | tools/run_xfstests_v11.sh |
| xfstests install | /var/lib/xfstests (Ubuntu package) |
| Test image | 1 GiB FUSE-mounted image per test |
MUST_PASS Results
These tests exercise slim64fs's implemented surface area. FAIL = bug.
| Test | Description | V11.1 Result | V11.3 Result |
|---|---|---|---|
| generic/001 | creat/write/unlink data-integrity chain | PASS | — |
| generic/005 | symlinks + ELOOP detection | PASS | — |
| generic/011 | dirstress: mkdir/rmdir/readdir under load | PASS | — |
| generic/013 | fsstress multi-op stress | PASS | — |
| generic/023 | renameat2 RENAME_NOREPLACE | PASS | — |
| generic/024 | renameat2 no-overwrite semantics | PASS | — |
| generic/075 | fsx non-AIO read/write/truncate correctness | PASS | — |
| generic/087 | file access + modification time updates | PASS | — |
| generic/091 | fsx direct I/O (O_DIRECT silently ignored) | PASS | — |
| generic/100 | tar/untar round-trip (create/mkdir/write/readdir/stat) | PASS | — |
| generic/192 | atime semantics (noatime policy, V10.6) | PASS | — |
| generic/221 | ctime update via futimens without UTIME_OMIT | PASS | — |
| generic/245 | rename onto non-empty target → ENOTEMPTY | PASS | — |
| generic/309 | directory mtime+ctime updated on rename | FAIL | FIXED → PASS |
| generic/313 | ctime + mtime updated on truncate/ftruncate | PASS | — |
| generic/360 | symlink to very long path (readlink round-trip) | PASS | — |
| generic/763 | zero-byte write semantics | PASS | — |
MUST_PASS summary: 16/17 passed in V11.1; 17/17 after V11.3 fix.
Full Run Summary (V11.1)
| Outcome | Count | Tests |
|---|---|---|
| PASS | 53 | 001 005 006 007 011 013 023 024 028 035 036 075 087 088 091 100 126 131 133⚠ 192 207 209 210 212 221 245 249 257 258 263 308 310 313 360 362 364 394 426 443 467 471 477 521⚠ 522⚠ 532 591 637 639 650 676 756 763 777 |
| FAIL | 6 | 208 241 309 363 632 736 |
| NOTRUN | 12 | 010 014 123 125 184 193 314 355 450 680 694 701 |
| Total | 71 |
FAIL Analysis (Post V11.3 Investigation)
| Test | V11.1 Exit | Category | Root Cause | V11.3 Status |
|---|---|---|---|---|
| 208 | 124 | INFRA_TIMEOUT | aio-dio binary not in package install; AIO stress runs >120s | INFRA_SKIP |
| 241 | 1 | ENVIRONMENT | FUSE session corrupted by prior test 208 SIGKILL residue; clean retest PASS | PASS |
| 309 | 2 | SLIM64FS_BUG | s64_vfs_rename_disk never updated parent dir
mtime/ctime |
FIXED |
| 363 | 1 | ENVIRONMENT | Same as 241 (environment artifact); clean retest PASS | PASS |
| 632 | 1 | INFRA | Needs CAP_SYS_ADMIN (CLONE_NEWNS); tests kernel mount counting bug | INFRA_SKIP |
| 736 | 124 | INFRA_TIMEOUT | readdir-while-renames takes ~260s; 120s limit
insufficient |
INFRA_SKIP |
Post-V11.3 effective result: 55 PASS (reported), 0 slim64fs bugs, 2 INFRA_SKIP (208, 632), 1 INFRA_TIMEOUT requiring longer run (736).
Post-V13 audit (inplace write fix, 2026-05-27):
Three V11.1 PASSes were false positives — FUSE crashes produced exit 0
from the test scripts, which V11 runner counts as PASS (exit-code-only,
no diff against .out):
| Test | V11.1 PASS mechanism | Post-fix status |
|---|---|---|
| 133 | FUSE crash after phase 1; output matched .out (which
includes abort msgs) |
Genuinely PASS: all 4 phases in ~102 s |
| 521 | FUSE crash during fsx mmap write
(domapwrite: msync: connection abort); fsx exits 0 |
INFRA_TIMEOUT: soak test, 1M ops > 300 s |
| 522 | Same as 521 (buffered fsx soak) | INFRA_TIMEOUT: soak test, 1M ops > 300 s |
Genuine effective result: 51 PASS, 0 slim64fs bugs, 2
INFRA_SKIP, 3 INFRA_TIMEOUT. See
docs/xfstests_results.md §Post-V11 Addendum and
logs/v11/v11.1-133-fix.ok.
The Fix: generic/309
Root cause: s64_vfs_rename_disk() in
src/s64_vfs.c modified directory entries (via
mark_dir_dirty / maybe_flush_dir) but never
wrote updated mtime_sec/ctime_sec to the
parent directory disk inode.
Fix: Added touch_dir_times(fs, dir)
helper that reads the directory's disk inode, sets
mtime_sec = ctime_sec = now, and writes it back. Called in
all three rename success paths: same-parent, cross-parent+overwrite,
cross-parent no-overwrite.
POSIX requirement satisfied: rename(2) MUST update mtime+ctime of the containing directory for the old entry (from_parent) and the new entry (to_parent).
NOTRUN Rationale Summary
Full rationale in docs/xfstests_notrun.md. Brief:
| Test | Reason |
|---|---|
| 010 | dbtest binary not in package install |
| 014 | Sparse files: Fill-or-Kill invariant (ENSHRINED) |
| 123, 125, 193, 314, 355, 680 | fsgqa user not defined in test environment |
| 184 | FUSE kernel doesn't expose mknod/mkfifo |
| 450 | Sector size constraint not applicable |
| 694 | Needs ≥4GB free (1G image insufficient) |
| 701 | Needs ≥5GB free (1G image insufficient) |
ENSHRINED_SKIP Summary
slim64fs deliberately omits these features. All are documented in
docs/known-limitations.html and
spec/v10.html §3.
| Feature | Tests | Rationale |
|---|---|---|
| Sparse files | 1 | Fill-or-Kill invariant: every block has CRC32C or doesn't exist |
| xattr / ACL | 15 | Not in scope for removable flash media workload |
| fallocate | 27 | Stub → ENOSYS; FTL handles block mapping |
| Hard links | 7 | Violates single-inode-per-path invariant; EOPNOTSUPP |
| flock / fcntl locks | 2 | Not in scope |
| mmap MAP_SHARED writes | 18 | Write-once-per-operation model |
| ioctl (FIBMAP/FIEMAP) | 4 | No ioctl handler |
| copy_file_range / SEEK_HOLE | 15 | Not implemented |
| reflink / CoW / encryption | 47 | Out of scope |
baby_xfstests Coverage
After V11.3:
| baby_xfstests | Result |
|---|---|
| Last test number | 105 |
| Outcomes (PASS+FAIL+SKIP) | 80 |
| PASS | 75 |
| FAIL | 2 (block leak 090/091 — pre-existing, tracked) |
| SKIP | 3 |
| Regression → Mirror |
|---|
| generic/309 (mtime/ctime on rename) → test 105 ✓ |
Cooldude Audit Checklist
✅ All criteria met.