scrub: RAID10 修复写入错误的设备偏移量(数据损坏); devices[j+j] 错误; RAID56 MDL 重复释放; 过时的重写标志
作者: xfcyhuang创建于 2026年9月4日更新于 2026年9月4日
- RAID10 修复写入错误设备偏移(数据损坏) — ~1187-1189(以及 1351-1353):
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