fix(starry-fs): report mount identity through statx - #1901
Conversation
There was a problem hiding this comment.
本次变更修复 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_at 的 c_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-review、git diff --check、新增 C 用例 cc -std=gnu11 -Wall -Wextra -Werror -fsyntax-only 均通过;未重复执行长时 QEMU,因为当前 head 的组织 CI 已通过 Run clippy / run_host、Test starry x86_64 qemu / run_container 和 Test 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 评论:均为空。以 statx、name_to_handle_at、mount_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
…nt-identity-from-004
There was a problem hiding this comment.
本 PR 修复 StarryOS 文件系统 ABI:statx(2) 对解析为 VFS Location 的对象填充 STATX_MNT_ID,并在挂载根设置 STATX_ATTR_MOUNT_ROOT;name_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-review、git diff --check、cargo 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 的批准,未作为当前结论依据。以 statx、name_to_handle_at、mount_id 检索开放 PR,仅命中本 PR;base 未有等效实现,未发现重复或依赖顺序风险。无新增或变更 app,因此 app 运行项不适用。Review todo 已逐项完成,未发现未解决风险、测试发现缺口或需要额外领域复核的事项。
Powered by gpt-5.6-terra
|
ci 稳定失败,请更新最新 dev 代码,看是否通过,若不能,可能是代码修改引发 |
|
已在当前 PR head cargo xtask starry test qemu --arch riscv64命令退出码为 0: 失败的 CI 运行在 |
并非稳定失败,感觉是你ci一堆bug @ZR233
|
|
而且有一说一我x64/arm能过riscv64大概率没问题的 |
|
补充:前一条只验证了 PR 当前 head,未满足“更新最新 dev 后再测”的要求。 现已在隔离工作树将当前 cargo xtask starry test qemu --arch riscv64退出码为 0: 因此,当前 |

来源
从
004-add-starry-nixos分支原提交42d0c3a98独立 cherry-pick。cherry-pick 后提交为0d62c254f,两者 stable patch-id 均为8de8f702ddc191653121c71db48a9ff69ac10e17。问题
StarryOS 的
statx(2)仅返回基础 inode 信息,没有报告STATX_MNT_ID和STATX_ATTR_MOUNT_ROOT。同时,name_to_handle_at(2)的 mount ID 输出使用设备号,与 Linux 的挂载身份语义及statx(2)不一致。依赖挂载边界识别的用户态程序因此无法区分根挂载、/proc等独立挂载及其子路径。参考:
statx(2):https://man7.org/linux/man-pages/man2/statx.2.htmlname_to_handle_at(2):https://man7.org/linux/man-pages/man2/name_to_handle_at.2.htmlvfs_statx():https://github.com/torvalds/linux/blob/master/fs/stat.c修改
statx结果中声明STATX_ATTR_MOUNT_ROOT支持。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 一致性。语义映射
STATX_MNT_ID标识路径所在挂载Location::mountpoint().mount_id()STATX_ATTR_MOUNT_ROOT标识挂载根Location::is_root_of_mount()设置/proc与/proc/1返回同一 ID/与/proc返回不同 IDname_to_handle_at()返回挂载 IDstatx().stx_mnt_id保持一致验证
红测通过临时恢复实现文件到 cherry-pick 父提交执行,最终分支随后恢复为干净的 cherry-pick 状态:
恢复 cherry-pick 后版本执行同一用例:
其他检查:
clippy 由 PR CI 执行。
上游同步
已在 2026-08-06 将最新
upstream/dev合入 PR 分支,merge commit 为13e054b9a。冲突集中在上游新合入的 mount/fstatfs 相关改动;最终结果保留本 PR 的STATX_MNT_ID、STATX_ATTR_MOUNT_ROOT和name_to_handle_at()mount ID 语义,并采用上游最新的fstatfs/mount-table 实现。本地执行
cargo xtask clippy --package starry-kernel:基础配置及 22 个 feature 配置通过(23/25)。aarch64 交叉配置在lwprintf-rsbindgen 阶段因 Nix 环境误取宿主 glibc、缺少gnu/stubs-32.h失败,第 25 项因此未运行;该失败未进入本 PR 修改的 Rust 代码。新 head 的 CI 已触发。