fs: add minimal fd offset, pipe, truncate, sync and overlay semantics
补齐文件 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。