Pro jádro Linux 6.2 byla navržena vylepšení Btrfs, která se týkají opravy problému "write hole" v implementaci RAID 5/6. Podstatou problému je, že pokud dojde k havárii během zápisu, není snadné zjistit, který blok na kterém zařízení RAID byl správně zapsán a který nebyl zápis dokončen. Při pokusu o obnovení RAID v takové situaci může dojít k poškození bloků odpovídajících nedokončeným zápisům, protože stav bloků RAID je nesynchronizovaný. Tento problém se vyskytuje ve všech polích RAID1/5/6, kde neexistují zvláštní opatření k boji proti takovému efektu.
V implementaci RAID, jako je RAID1 v btrfs, je tento problém řešen používáním kontrolních součtů v obou kopiích; při nesrovnalosti se data jednoduše obnovují z druhé kopie. Tento přístup také funguje, pokud nějaké zařízení začíná poskytovat nesprávná data místo úplného selhání.
Nicméně v případě RAID5/6 souborový systém neukládá kontrolní součty pro bloky paritní: v normální situaci se správnost bloků ověřuje tím, že všechny jsou opatřeny kontrolním součtem, a blok parity lze obnovit z dat. Avšak v případě částečného zápisu tento přístup může v určitých situacích selhat. V takovém případě, při obnově pole, nelze vyloučit, že bloky, které byly zahrnuty do nedokončeného zápisu, budou obnoveny nesprávně.
U btrfs je tento problém nejaktuálnější, pokud je zapisovaná velikost menší než stripe. V tomto případě musí souborový systém provést operaci čtení-modifikace-zápis (read-modify-write, RMW). Pokud se setkají bloky s nedokončeným zápisem, může operace RMW způsobit poškození, které nebude detekováno, navzdory kontrolním součtům. Vývojáři provedli změny, díky nimž operace RMW kontroluje kontrolní součet bloků, než provede tuto operaci, a v případě nutnosti obnovy dat provede kontrolu kontrolních součtů i po zápisu. Bohužel v případě zápisu neúplného stripe (RMW) to vede k dodatečným nákladům na výpočet kontrolních součtů, ale výrazně zvyšuje spolehlivost. Pro RAID6 zatím taková logika není připravena, nicméně pro takové selhání v RAID6 je zapotřebí, aby zápis selhal na dvou zařízení současně, což je méně pravděpodobné.
Dále lze zmínit doporučení vývojářů ohledně používání RAID5/6, které spočívají v tom, že v Btrfs může být profil ukládání metadat a dat odlišný. Lze použít profil RAID1 (zrcadlení) nebo dokonce RAID1C3 (3 kopie) pro metadata, a pro data RAID5 nebo RAID6. Tím se zajistí spolehlivá ochrana metadat a absence "write hole" na jedné straně a efektivnější využití místa, typického pro RAID5/6, na druhé. To umožňuje vyhnout se poškození metadat, přičemž poškození dat může být opraveno.
Dále lze zmínit, že pro SSD v Btrfs v jádře 6.2 bude ve výchozím nastavení aktivována asynchronní realizace operace "discard" (označení uvolněných bloků, které již nemohou být fyzicky uchovány). Výhodou tohoto režimu je vysoký výkon díky efektivnímu seskupování operací "discard" do fronty a následného zpracování fronty na pozadí, což způsobuje, že normální operace FS nejsou zpomalovány, jako v případě synchronního "discard" při uvolňování bloků, a SSD může přijímat výhodnější rozhodnutí. Na druhou stranu již nebude potřeba používat nástroje jako fstrim, protože všechny dostupné bloky budou očištěny v FS bez potřeby dalšího skenování a bez zpomalení operací.
Zdroj: opennet.ru
