Skip to content

feat(vfs): 新增creat系统调用支持#1482

Merged
fslongjin merged 2 commits intoDragonOS-Community:masterfrom
fslongjin:feat-add-creat-syscall
Dec 16, 2025
Merged

feat(vfs): 新增creat系统调用支持#1482
fslongjin merged 2 commits intoDragonOS-Community:masterfrom
fslongjin:feat-add-creat-syscall

Conversation

@fslongjin
Copy link
Member

  • 实现creat系统调用处理器,遵循Linux语义:创建新文件或截断现有文件并打开为只写模式
  • 在x86_64架构下注册creat系统调用到系统调用表
  • 在gvisor测试白名单中添加creat测试项

@github-actions github-actions bot added the enhancement New feature or request label Dec 16, 2025
@fslongjin
Copy link
Member Author

@claude review this pr in Chinese

@dragonos-community-ai-pr-reviewer
Copy link

dragonos-community-ai-pr-reviewer bot commented Dec 16, 2025

Claude finished @fslongjin's task in 3m 14s —— View job


Claude已完成PR #1482的代码审查

待办事项清单

  • 分析PR上下文和更改文件
  • 读取新增的sys_creat.rs文件
  • 读取修改的vfs syscall模块文件
  • 读取修改的gvisor测试白名单
  • 检查代码实现是否符合Linux creat语义
  • 检查系统调用注册是否正确
  • 检查测试配置是否合理
  • 提供代码审查反馈

代码审查反馈

总体评价

PR #1482实现了creat系统调用的支持,整体实现简洁、正确,符合Linux语义。代码质量良好,具有清晰的注释和文档。

详细审查

1. sys_creat.rs 实现 (kernel/src/filesystem/vfs/syscall/sys_creat.rs:1-72)

  • 正确性: 实现完全符合Linux creat语义:creat(path, mode) ≡ open(path, O_WRONLY | O_CREAT | O_TRUNC, mode)
  • 代码复用: 巧妙地复用了现有的open_utils::do_open()函数,避免了代码重复
  • 参数处理: 正确提取路径指针和模式参数,遵循系统调用参数传递约定
  • 错误处理: 通过do_open()继承适当的错误处理逻辑
  • 调试支持: 实现了entry_format()方法用于调试输出

2. 系统调用注册 (kernel/src/filesystem/vfs/syscall/mod.rs:84)

  • 架构限制: 正确使用#[cfg(target_arch = "x86_64")]限定x86_64架构
  • 模块声明: 在模块文件中正确添加了mod sys_creat;声明
  • 系统调用号: 确认SYS_CREAT = 85kernel/src/arch/x86_64/syscall/nr.rs:94中正确定义
  • 宏调用: syscall_table_macros::declare_syscall!(SYS_CREAT, SysCreatHandle);正确注册

3. 测试配置 (user/apps/tests/syscall/gvisor/whitelist.txt:15)

  • 白名单添加: 正确添加creat_test到gvisor测试白名单
  • 位置适当: 添加到文件系统相关测试区域,逻辑清晰

代码质量评估

优点:

  1. 符合标准:严格遵循POSIX和Linux creat系统调用规范
  2. 注释完善:代码文档清晰,解释了creat与open的等价关系
  3. 设计简洁:没有过度设计,利用现有基础设施
  4. 类型安全:使用Rust的强类型系统,避免类型转换错误
  5. 错误传播:正确使用Result类型进行错误处理

潜在改进点:

  1. 路径长度限制检查do_open()函数内部已经通过check_and_clone_cstr(path, Some(MAX_PATHLEN))检查路径长度,但可以更明确地在注释中提及ENAMETOOLONG错误条件
  2. 模式参数验证:模式参数直接传递给do_open(),由底层验证,这是合理的

测试建议:

  1. 功能测试:建议添加单元测试验证不同场景:
    • 创建新文件
    • 截断已存在文件
    • 无效路径处理
    • 权限检查
  2. 边界测试:测试长路径、特殊字符路径等边界情况

安全性考虑

  • 路径安全:通过check_and_clone_cstr()进行路径长度检查和复制,防止缓冲区溢出
  • 权限检查:依赖底层文件系统权限检查机制
  • 内存安全:使用Rust所有权系统,避免内存安全问题

兼容性验证

  1. 与现有系统调用兼容:creat作为传统系统调用,不影响现有open/openat等接口
  2. 架构兼容性:正确限定x86_64架构,符合DragonOS架构支持策略
  3. 向后兼容:实现保持与POSIX和Linux应用程序的兼容性

总结

这是一个高质量的PR,实现了creat系统调用的核心功能。代码简洁、正确、符合标准,可以合并到主分支。实现展示了良好的软件工程实践和系统编程知识。

建议: ✅ 批准合并


审查完成时间: 2025-12-16
系统调用数: 1个新增 (SYS_CREAT)
文件变更: 3个文件 (+74行, -1行)
架构影响: x86_64 only
测试覆盖: gvisor测试已配置

- 实现creat系统调用处理器,遵循Linux语义:创建新文件或截断现有文件并打开为只写模式
- 在x86_64架构下注册creat系统调用到系统调用表
- 在gvisor测试白名单中添加creat测试项

Signed-off-by: longjin <longjin@DragonOS.org>
@fslongjin fslongjin force-pushed the feat-add-creat-syscall branch from ac553aa to 98803a3 Compare December 16, 2025 15:57
@fslongjin fslongjin merged commit 0d10f70 into DragonOS-Community:master Dec 16, 2025
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant