百科.dev
全部条目AI 编程趋势榜开源项目技术资讯提交条目
登录
返回工具页/返回 Issues 列表
#816·btrfs

scrub: RAID10 修复写入错误的设备偏移量(数据损坏); devices[j+j] 错误; RAID56 MDL 重复释放; 过时的重写标志

作者: xfcyhuang创建于 2026年9月4日更新于 2026年9月4日
  1. RAID10 修复写入错误设备偏移(数据损坏) — ~1187-1189(以及 1351-1353):
c
Status = write_data_phys(c->devices[j + k]->devobj, c->devices[j + k]->fileobj,
                         c->chunk_item->stripe[j + k].offset + offset - c->offset,
                         context->stripes[j + goodstripe].buf, context->stripes[j + goodstripe].length);

数据是使用 get_raid0_offset(.start,scrub.c ~1422-1440 / ~1542)中的设备相对偏移进行读取的,但修复是使用 stripe.offset + (chunk 相对逻辑偏移) 进行写入。在 4 个磁盘的 RAID10 中,它们不同(逻辑 0x30000 -> .start 0x10000),因此修复将偏移 0x20000,从而损坏了一个与之无关的条带,而使坏的条带损坏。DUP 路径明确地将 .start = offset - c->offset (~1467-1468);RAID10 分支看起来像是将该公式复制过来了。写入偏移应为 stripe[j + k].offset + context->stripes[j + goodstripe].start。

内容来源: maharmstone/btrfs

查看 GitHub 原文在 GitHub 查看讨论