Na aktiváciu jadra Linux 6.2 sú navrhnuté vylepšenia Btrfs, ktoré sa týkajú opravy problému „write hole“ v implementácii RAID 5/6. Podstata problému spočíva v tom, že ak sa odohrá zlyhanie počas zápisu, nie je možné určiť, ktorý blok bol správne zapísaný na ktorom z RAID zariadení a ktorý zápis nebol dokončený. Pri pokuse o obnovenie RAID v takejto situácii môže dôjsť k poškodeniu blokov, ktoré zodpovedajú nezapísaným blokom, pretože stav blokov RAID je nesynchronizovaný. Tento problém vzniká vo všetkých poliach RAID1/5/6, kde neexistujú špeciálne opatrenia na boj proti takémuto efektu.
V implementácii RAID, ako je RAID1 v btrfs, sa tento problém vyrieši použitím kontrolných súm na oboch kópiách; pri nesúhlase sa dáta jednoducho obnovia z druhej kópie. Tento prístup tiež funguje ak nejaké zariadenie začína poskytovať nekorektné dáta namiesto úplného zlyhania.
Avšak v prípade RAID5/6 súborový systém neuchováva kontrolné súmy pre bloky paritných dát: v normálnej situácii sa správnosť blokov overuje tým faktom, že sú všetky vybavené kontrolnou súmou a blok paritných dát sa dá obnoviť z dát. Avšak v prípade čiastočného zápisu tento prístup v určitých situáciách nemusí fungovať. V takom prípade, pri obnove poľa nie je vylúčené, že bloky, ktoré boli súčasťou nedokončeného zápisu, budú obnovené nesprávne.
V prípade btrfs je tento problém najaktuálnejší, ak je vykonávaný zápis menší ako stripe. V tomto prípade musí súborový systém vykonať operáciu čítania-modifikácie-zápisu (read-modify-write, RMW). Ak sa pritom stretnú bloky s nedokončeným zápisom, operácia RMW môže spôsobiť poškodenia, ktoré nebudú zistené, aj napriek kontrolným súčtom. Vývojári vykonali zmeny, ktoré umožňujú operácii RMW skontrolovať kontrolný súčet blokov pred vykonaním tejto operácie a, ak je to nevyhnutné, vykonať aj kontrolu kontrolných súčtov po zápise. Bohužiaľ, v situácii s nedokončeným zápisom stripe (RMW) to vedie k dodatočným nákladom na výpočet kontrolných súčtov, no zásadne zvyšuje spoľahlivosť. Pre RAID6 taká logika zatiaľ nie je pripravená, avšak v prípade zlyhania v RAID6 je potrebné, aby zápis zlyhal súčasne na dvoch zariadeniach, čo je menej pravdepodobné.
Dodatkovo možno spomenúť odporúčania vývojárov na používanie RAID5/6, ktorých základ spočíva v tom, že v Btrfs môže byť profil ukladania metadát a dát odlišný. Pri tom môžeme použiť profil RAID1 (zrkadlo) alebo dokonca RAID1C3 (3 kópie) pre metadata, zatiaľ čo pre dáta RAID5 alebo RAID6. Týmto sa zabezpečuje spoľahlivá ochrana metadát a absencia „write hole“ na jednej strane, a na druhej strane efektívnejšie využívanie miesta, ktoré je charakteristické pre RAID5/6. To umožňuje vyhnúť sa poškodeniam v metadátach, zatiaľ čo poškodenia dát môžu byť opravené.
Tiež možno spomenúť, že pre SSD v Btrfs bude v jadre 6.2 predvolene aktivované asynchrónne vykonávanie operácie „discard“ (označenie uvoľnených blokov, ktoré už nie je potrebné fyzicky uchovávať). Výhodou tohto režimu je vysoký výkon vďaka efektívnemu skupinovaniu operácií „discard“ do fronty a následnému spracovaniu fronty pozadím, čo znamená, že normálne operácie FS nie sú spomalené, ako je to v prípade synchronného „discard“ pri uvoľňovaní blokov, a SSD môže robiť efektívnejšie rozhodnutia. Na druhej strane, už nebude potrebné používať nástroje typu fstrim, pretože všetky dostupné bloky budú čistené v FS bez potreby dodatočného skenovania a bez spomalenia operácií.
Zdroj: opennet.ru
