Skip to content

fs: add minimal fd offset, pipe, truncate, sync and overlay semantics

不让内核死机 requested to merge feature/ext4 into main

补齐文件 syscall 与 overlay 兼容性语义

本次合并围绕 lmbench、lua、iozone 和 overlay 大文件读写需求,补齐 oskernel 的最小 Linux 兼容文件语义:

  • 修正 regular fd offset 语义:

    • read/write 按当前 fd offset 操作,成功后推进 offset
    • lseek 支持 SEEK_SET / SEEK_CUR / SEEK_END
    • 非法 fd / whence 返回 Linux 风格 -EBADF / -EINVAL
    • 保持 stdin/stdout/stderr 既有行为
  • 新增 pread64 / pwrite64:

    • 按指定 offset 读写
    • 不改变 fd 当前 offset
    • 处理负 offset、非法 fd、非法用户地址等错误路径
  • 新增 pipe / pipe2 最小实现:

    • pipe2(flags=0) 创建读端和写端 fd
    • 不支持 flags 返回 -EINVAL
    • 写端关闭后读空返回 0
    • 读端关闭后写返回 -EPIPE 或合理错误
    • 避免 close 后 panic、死锁
  • 新增 ftruncate / fsync 兼容实现:

    • ftruncate 支持 overlay 普通文件缩小和扩大
    • 扩大后的空洞区域以 0 填充
    • fsync/fdatasync 对合法 fd 返回 0,并同步 overlay 内存内容
    • 当前不承诺完整 EXT4 journal 或持久化写回
  • 修复 overlay 大文件读写:

    • overlay 文件内容使用 Vec 管理
    • 支持超过单 block 的连续写入、覆盖写、追加写
    • read/pread64 可按 offset 读回正确内容
    • 文件 size 随 write/ftruncate 正确更新
  • 更新 EXT4 状态文档:

    • 记录 2026-06-16 fd / pipe / overlay 兼容性增量
    • 记录当前 runner 验收结果和覆盖边界

验证:

  • make -C oskernel kernel-rv 通过
  • TIMEOUT_SEC=60 bash scripts/run_ours.sh 通过
  • logs/ours/exit_code.txt = 0
  • 当前日志未发现 unsupported syscall、panic、SIGSEGV、LoadPageFault、StorePageFault
  • lseek-smoke 已命中
  • overlay 自测通过:[overlay][selftest] ok size=8213 block=4096

注意: 当前 runner 仍会将部分 benchmark 主体标记为 exec-deferred 或 skip,因此 pread64/pwrite64、pipe/pipe2、ftruncate/fsync 虽已实现并构建通过,但完整 iozone/lmbench 主体验收仍需后续打开 runner 白名单或添加专项 smoke test。

Merge request reports