正常
收尾:范围与边界
范围与边界(诚实说)
这一章的 race 治理有几条没收尾的口子,摊开讲清,别让读者读完以为「ext2 已 SMP-safe」。
- host PAL + TSAN 确定性回归已到位(原来没搭 host TSAN,现在补上了)。主线八讲完:host PAL(
test/unit/ext2_host_pal.cpp)mock 掉kprintf/kmalloc让 ext2 在 host 上跑真逻辑;test_ext2_host.cpp走完整 VFS 往返(readdir + read + create/write/read-back + unlink);test_ext2_concurrent.cpp4 线程压同一个Ext2,-DCINUX_HOST_TSAN=ON秒级抓block_buf_race。block_buf_治理现在是「逻辑根治 + 回归确定性验证」双重闭环,不再只是run-kernel-test全绿的概率证据。 unlink的跨并发快照缓冲还没治。主线五末尾已经诚实标注:unlink_ptr_buf_/unlink_child_buf_治的是「单次 unlink 内部 free 过程的 clobber」,不治「两个 CPU 并发 unlink 同一 ext2 实例」那层共享快照 race——那层需要一把 per-instanceunlink_lock_,留 follow-up。这章不假装它已 SMP-safe。- truncate 是 shrink-only,孤儿块不回收。主线七已说,
O_TRUNC截断掉的孤儿数据块不释放,是已知 leak(hobby-os 式)。read 不超过i_size所以非正确性问题,只浪费磁盘;完整的孤儿块回收留 follow-up。 - 只讲「搬独立库 + 治
block_buf_成 SMP-safe」这一根绳。host PAL 的搭法主线八给了概貌(kprintf/kmalloc走 libc + 守 slab 清零契约),但 PAL 设计的完整动机、ASAN/TSAN 开关的取舍不展开;ext2_dirops.cpp这种「搬家顺带的结构整理」也只一句话带过,不教拆分方法论。 - ext4 extent 读路径只到 depth-0 leaf。主线九已讲:
resolve_disk_block_入口先判EXT4_EXTENTS_FL,extent-mapped 的 inode 走extent_lookup_block那条 depth-0 leaf 解析(纯算术、不读盘、不碰 buffer,所以不在block_buf_race 的范围内)。但eh_depth > 0的 index 节点(很大或很碎的文件才会用)Unsupported,本驱动 bail 不读——那一层会引入 index 块的 I/O、又得KmBuf,留后续章。 - **目录读写路径(
lookup_in_dir/ symlink readlink 等)的 per-callKmBuf**已随这次搬家一起到位,本章按合并态讲,不展开每条目录路径的迁移细节。
这一章的 race 修复,
run-kernel-test跑全绿是验证证据(不是战绩)。它站得住的真正理由,是每条 SMP 路径都换了 per-callKmBuf、grep确认block_buf_不再出现在并发路径上、配套的block_alloc_lock_串行了 bitmap RMW、unlink 的 indirect 快照隔离了 free 过程的 clobber——这一套逻辑是闭环的。再加上 host PAL 让 ext2 在 host 上跑真逻辑、test_ext2_concurrent在 TSAN 下并发压 lookup(主线八),block_buf_race 有了确定性回归,不再只靠 QEMU 全绿。剩下没收的口子(unlink 跨并发快照、truncate 孤儿块、extent depth>0)都摊在上面,各自留了明确的 follow-up。