主要观点:作者在为bfs
实现多线程stat()
调用时发现文件系统错误,经排查发现是 Btrfs 中的extent_buffer
相关问题,通过git bisect
等工具定位并修复了一个数据竞争的 bug。
关键信息:
- 运行
bfs
时出现“structure needs cleaning”错误及dmesg
中的corrupted node
信息,虽btrfs check
和btrfs scrub
未发现错误,但问题仍存在。 extent_buffer
用于元数据 I/O,分配和关联页面较复杂,最近代码路径有变动,怀疑存在竞争或引用计数错误。git bisect
在查找间歇性问题的 commit 时具有挑战性,作者在实际桌面和虚拟机上进行 bisect 均遇到困难,最终因磁盘文件系统损坏而停止。- 调试过程中发现
read_extent_buffer_pages()
函数的锁定协议存在 bug,导致不必要的读取和数据竞争,通过添加双检查锁定的补丁修复了该问题。 - 全磁盘加密导致读取磁盘块时出现问题,有时会看到有效元数据,有时会看到加密的随机字节。
重要细节: - 作者最初以为 bug 始于 Linux 6.7,但在 6.6 和 6.5 版本也能重现。
- 在虚拟机中配置更接近实际系统的环境后,能更稳定地重现问题,且在应用调试补丁后仍可重现。
- 修复后的代码在运行重现器时不再触发错误。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。