[Old layout] Btrfs csum size for tree block is 32 bytes, and currently, only the first 4 bytes(sector 0) is used, storing the crc32 for the whole leaf/node.
Takes 4K as example for leafsize. Sectors: |---0---|---1---|---2---|---3---|---4---|---5---|---6---|---7---| Sector 0: Csum of the leaf/node (32 ~ 4K) Sector 1~7: Not used So, what about restoring more crc32 in other sectors in the following backward-compatible way? [New layout] Take leafsize as 4K for example. Sectors: |---0---|---1---|---2---|---3---|---4---|---5---|---6---|---7---| Sector 0: Csum of the leaf/node (32~4K)(not changed) Sector 1: Csum of the first eighths of the leaf/node (32~512) Sector 2: Csum of the second eighths of the leaf/node (512~1024) .... Sector 7: Csum of the last eighths of the leaf/node (3584 ~ 4096) And due to the fact crc(sector 0 ~ sector 7) = crc(crc(sector 0), crc(sector 1), ...) We won't waste too much CPU time, and since we keep the behavior of sector 0, so it is completely backward compatible. [Advantage] The advantage usage of the new layout is more accuracy in scrub and btrfsck. For scrub, even all duplication is broken, there is still chance for scrub to rebuild the block if corruptions occurs in different sector. And for btrfsck --repair, if node is corrupted, we don't need to drop all the nodes/leaves belong to the nodes, but only drops nodes/leaves belong to the sector. -- To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html