Btrfs 中的错误查找 - tavianator.com

主要观点:作者在为bfs实现多线程stat()调用时发现文件系统错误,经排查发现是 Btrfs 中的extent_buffer相关问题,通过git bisect等工具定位并修复了一个数据竞争的 bug。
关键信息

  • 运行bfs时出现“structure needs cleaning”错误及dmesg中的corrupted node信息,虽btrfs checkbtrfs scrub未发现错误,但问题仍存在。
  • extent_buffer用于元数据 I/O,分配和关联页面较复杂,最近代码路径有变动,怀疑存在竞争或引用计数错误。
  • git bisect在查找间歇性问题的 commit 时具有挑战性,作者在实际桌面和虚拟机上进行 bisect 均遇到困难,最终因磁盘文件系统损坏而停止。
  • 调试过程中发现read_extent_buffer_pages()函数的锁定协议存在 bug,导致不必要的读取和数据竞争,通过添加双检查锁定的补丁修复了该问题。
  • 全磁盘加密导致读取磁盘块时出现问题,有时会看到有效元数据,有时会看到加密的随机字节。
    重要细节
  • 作者最初以为 bug 始于 Linux 6.7,但在 6.6 和 6.5 版本也能重现。
  • 在虚拟机中配置更接近实际系统的环境后,能更稳定地重现问题,且在应用调试补丁后仍可重现。
  • 修复后的代码在运行重现器时不再触发错误。
阅读 13
0 条评论