修复iozone的panic
触发链条:
进程 A 进入 ext4_block_writebytes,开始读-改-写操作,使用共享的 ph_bbuf[4096] 暂存数据 virtio_rw 内部忙等 I/O 完成——此时中断仍开启 定时器中断 → yield() → 调度进程 B 进程 B 也进入 ext4_block_writebytes,把自己的数据写入 ph_bbuf,覆盖了进程 A 的数据 进程 A 恢复后,把错误的 ph_bbuf 内容写回磁盘 → 文件系统元数据损坏 损坏的元数据导致 ext4 分配/释放错误的块 → 内存损坏 → buddy 分配器链表破坏 → list.c:250 panic 修复(blockdev.c):
用 sleeplock 替代注释掉的 spinlock——sleeplock 在保护临界区的同时允许中断(磁盘 I/O 依赖中断完成) 在 vfs_ext4_blockdev_init 中初始化锁 保证同一时刻只有一个进程在操作块设备的 ph_bbuf 暂存区