Skip to content

fix(starry-fs): report mount identity through statx - #1901

Draft
silicalet wants to merge 2 commits into
rcore-os:devfrom
silicalet:fix/starry-statx-mount-identity-from-004
Draft

fix(starry-fs): report mount identity through statx#1901
silicalet wants to merge 2 commits into
rcore-os:devfrom
silicalet:fix/starry-statx-mount-identity-from-004

Conversation

@silicalet

@silicalet silicalet commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

来源

004-add-starry-nixos 分支原提交 42d0c3a98 独立 cherry-pick。cherry-pick 后提交为 0d62c254f,两者 stable patch-id 均为 8de8f702ddc191653121c71db48a9ff69ac10e17

问题

StarryOS 的 statx(2) 仅返回基础 inode 信息,没有报告 STATX_MNT_IDSTATX_ATTR_MOUNT_ROOT。同时,name_to_handle_at(2) 的 mount ID 输出使用设备号,与 Linux 的挂载身份语义及 statx(2) 不一致。依赖挂载边界识别的用户态程序因此无法区分根挂载、/proc 等独立挂载及其子路径。

参考:

修改

  • statx 结果中声明 STATX_ATTR_MOUNT_ROOT 支持。
  • 对解析到 VFS Location 的对象返回 mountpoint 的 mount ID。
  • 当路径正好是挂载根时设置 STATX_ATTR_MOUNT_ROOT
  • name_to_handle_at(2) 返回同一 mount ID,并在无法转换到 c_int 时返回 EOVERFLOW
  • 增加 bugfix-statx-mount-root 回归,覆盖根挂载、/proc、挂载内子路径以及两个 syscall 的 ID 一致性。

语义映射

Linux 语义 StarryOS 修改后行为
STATX_MNT_ID 标识路径所在挂载 返回 Location::mountpoint().mount_id()
STATX_ATTR_MOUNT_ROOT 标识挂载根 Location::is_root_of_mount() 设置
同一挂载内路径共享 mount ID /proc/proc/1 返回同一 ID
不同挂载具有不同 mount ID //proc 返回不同 ID
name_to_handle_at() 返回挂载 ID statx().stx_mnt_id 保持一致

验证

红测通过临时恢复实现文件到 cherry-pick 父提交执行,最终分支随后恢复为干净的 cherry-pick 状态:

cargo xtask starry test qemu --arch x86_64 -c qemu/system/bugfix-statx-mount-root
STARRY_STATX_MOUNT_ROOT_FAILED: 12 checks
STARRY_GROUPED_TESTS_FAILED

恢复 cherry-pick 后版本执行同一用例:

18 checks passed
STARRY_STATX_MOUNT_ROOT_PASSED
STARRY_GROUPED_TESTS_PASSED

其他检查:

cargo fmt --all -- --check
git diff --check

clippy 由 PR CI 执行。

上游同步

已在 2026-08-06 将最新 upstream/dev 合入 PR 分支,merge commit 为 13e054b9a。冲突集中在上游新合入的 mount/fstatfs 相关改动;最终结果保留本 PR 的 STATX_MNT_IDSTATX_ATTR_MOUNT_ROOTname_to_handle_at() mount ID 语义,并采用上游最新的 fstatfs/mount-table 实现。

本地执行 cargo xtask clippy --package starry-kernel:基础配置及 22 个 feature 配置通过(23/25)。aarch64 交叉配置在 lwprintf-rs bindgen 阶段因 Nix 环境误取宿主 glibc、缺少 gnu/stubs-32.h 失败,第 25 项因此未运行;该失败未进入本 PR 修改的 Rust 代码。新 head 的 CI 已触发。

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本次变更修复 StarryOS 文件系统 ABI:statx(2) 对真实 VFS Location 返回 mount ID,并以 STATX_ATTR_MOUNT_ROOT 标记挂载根;同时使 name_to_handle_at(2) 返回相同的 VFS mount ID。新增 qemu/system/bugfix-statx-mount-root 直接经 syscall(SYS_statx) / syscall(SYS_name_to_handle_at) 覆盖 //proc/proc/1/run,既检查不同挂载区分、同一挂载一致性,也检查 grouped runner 的失败标记传播。

该 PR 是局部 bugfix,不新增公共抽象、crate 或平台能力,因此 book/guideline/feature-development.md 不适用;book/guideline/code-quality.md 与 Starry syscall 准则已按 ABI/错误处理/回归可发现性审查。实现以 Location::mountpoint().mount_id() 为唯一来源,未混淆原先的 filesystem device number;Location::is_root_of_mount() 直接对应 VFS 挂载根不变量。STATX_MNT_ID 仅在解析到真实文件位置时填充,非文件型 FileLike 保持原有行为;name_to_handle_atc_int 转换溢出返回 EOVERFLOW

逐 syscall 对照:

Syscall 结论 对应标准 依据
statx 未发现问题 statx(2) stx_mask 声明已填充的 STATX_MNT_ID;挂载根属性在 stx_attributes_mask 声明支持、仅在根位置置位。该字段语义自 Linux 5.8 起可用。
name_to_handle_at 未发现问题 name_to_handle_at(2) 成功时返回解析路径所属挂载的 ID,并与 statx 使用同一 VFS mount ID;无法表示为 ABI 的 int 时返回 EOVERFLOW

验证与 CI:本地复核 prepare-reviewgit diff --check、新增 C 用例 cc -std=gnu11 -Wall -Wextra -Werror -fsyntax-only 均通过;未重复执行长时 QEMU,因为当前 head 的组织 CI 已通过 Run clippy / run_hostTest starry x86_64 qemu / run_containerTest starry aarch64 qemu / run_container。PR 描述还给出了该新 case 的 red/green QEMU 证据(修复前失败、修复后 18 checks passed)。本次 check-run 汇总为 success=31、skipped=35、cancelled=4、failure=1;唯一失败为不接触本 PR 文件的 Test axloader HTTP smoke / run_host,其失败步骤无可解码日志,且与 Starry kernel/test-suit 路径无重叠,未作为本 PR 阻断项。

已检查现有 review/issue 评论:均为空。以 statxname_to_handle_atmount_id 检索开放 PR,未发现语义重复或依赖顺序问题;base 也未已有同等实现。新增用例位于 qemu/system/<subcase>/CMakeLists.txt + src/,可由根 CMake 的子目录发现,安装至 /usr/bin/starry-test-suit,与 grouped runner 契约一致。无新增或变更 app,故 app 运行项不适用;无未解决风险、测试发现缺口或需后续领域复核的事项。

Powered by gpt-5.6-terra

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本 PR 修复 StarryOS 文件系统 ABI:statx(2) 对解析为 VFS Location 的对象填充 STATX_MNT_ID,并在挂载根设置 STATX_ATTR_MOUNT_ROOTname_to_handle_at(2) 也改为返回同一 VFS mount ID,超出 ABI c_int 范围时返回 EOVERFLOW。新增 qemu/system/bugfix-statx-mount-root 直接通过 syscall(SYS_statx)syscall(SYS_name_to_handle_at) 覆盖 //proc/proc/1/run 的挂载边界和 ID 一致性。

这是局部 syscall ABI bugfix,不增加 crate、公共抽象或平台能力,book/guideline/feature-development.md 不适用;已按 book/guideline/code-quality.md 和 Starry syscall 准则审查。实现以 Location::mountpoint().mount_id() 为唯一挂载身份来源,Location::is_root_of_mount() 与 VFS 中挂载根条目比较一致;非文件型 FileLike 保持原有 statx 路径。测试位于当前 grouped C case 的标准 system/<subcase>/CMakeLists.txt + src/ 结构,根 CMake 可发现,并确认安装到 /usr/bin/starry-test-suit;grouped runner 会在子测试非零退出时打印失败标记并退出失败。

Syscall 评审结论 对应标准 简要依据
statx 未发现问题 statx(2) 成功解析的 VFS 位置声明并填充 mount ID;属性掩码声明支持,且仅对挂载根置位 STATX_ATTR_MOUNT_ROOT
name_to_handle_at 未发现问题 name_to_handle_at(2) 成功路径的 mount ID 与 statx 共用同一 VFS 来源;不可表示为 int 时显式映射到 EOVERFLOW

验证:prepare-reviewgit diff --checkcargo fmt --all -- --check、新增 C 用例的 cc -std=gnu11 -Wall -Wextra -Werror -fsyntax-only、selected CMake configure/build/install 均通过。未重复执行耗时 QEMU/Clippy:当前 head 的组织 CI 已成功执行相关 Starry x86_64/aarch64 QEMU 和 clippy。CI 汇总中唯一失败为与本 PR 路径无重叠的 axloader HTTP smoke,未见该失败归因于 Starry kernel 或 test-suit 改动;其余相关检查成功,skipped/cancelled 项为矩阵或路径选择结果。

已检查既有 issue/review 评论:无可操作评论;仅有一条针对旧 head 的批准,未作为当前结论依据。以 statxname_to_handle_atmount_id 检索开放 PR,仅命中本 PR;base 未有等效实现,未发现重复或依赖顺序风险。无新增或变更 app,因此 app 运行项不适用。Review todo 已逐项完成,未发现未解决风险、测试发现缺口或需要额外领域复核的事项。

Powered by gpt-5.6-terra

@ZR233

ZR233 commented Aug 7, 2026

Copy link
Copy Markdown
Member

ci 稳定失败,请更新最新 dev 代码,看是否通过,若不能,可能是代码修改引发

@silicalet

Copy link
Copy Markdown
Contributor Author

已在当前 PR head 13e054b9a3c4cc97c94d6420bffb2341aad2a21e 使用 CI 同一容器镜像 ghcr.io/rcore-os/tgoskits-container:latest 复现:

cargo xtask starry test qemu --arch riscv64

命令退出码为 0:

STARRY_SYSTEM_TEST_SUMMARY: total=419 passed=419 failed=0 elapsed_s=595
STARRY_GROUPED_TESTS_PASSED
PASS system (642.15s)
PASS tty-console-input-burst (7.45s)
result: 2/2 case(s) passed
all starry qemu tests passed

失败的 CI 运行在 test-proc-status-tracerpid 后超时 1800 秒;本地同一容器与同一全量命令未复现。请进一步核对该 runner 的资源、QEMU 进程状态和超时期间的串口输出;目前没有证据表明该稳定超时由本 PR 的 statx/mount ID 修改引入。

@silicalet

silicalet commented Aug 7, 2026

Copy link
Copy Markdown
Contributor Author
image 并非稳定失败,感觉是你ci一堆bug @ZR233

@silicalet

Copy link
Copy Markdown
Contributor Author

而且有一说一我x64/arm能过riscv64大概率没问题的

@silicalet

Copy link
Copy Markdown
Contributor Author

补充:前一条只验证了 PR 当前 head,未满足“更新最新 dev 后再测”的要求。

现已在隔离工作树将当前 upstream/dev (1ae24511830b438dea23c35bf8e690b92c0923e7) 合入 PR head 13e054b9a3c4cc97c94d6420bffb2341aad2a21e;合并无冲突,未推送。随后使用 CI 同一容器镜像执行:

cargo xtask starry test qemu --arch riscv64

退出码为 0:

STARRY_SYSTEM_TEST_SUMMARY: total=419 passed=419 failed=0 elapsed_s=722
STARRY_GROUPED_TESTS_PASSED
PASS system (764.55s)
PASS tty-console-input-burst (6.91s)
result: 2/2 case(s) passed
all starry qemu tests passed

因此,当前 upstream/dev 与本 PR 合并后的 RISC-V 全量 QEMU 未复现该超时。

@silicalet
silicalet marked this pull request as draft August 7, 2026 12:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants