Rezervace místa na FAT32 je v chystaném jádře Linuxu 7.4 až 265krát rychlejší
Trojice patchů v chystaném jádře Linuxu 7.4 mění, jak ovladač FAT vyhrazuje místo na disku. Místo stovek jednotlivých clusterů si je vezme jedním voláním. Autor změny naměřil na synchronně připojeném svazku 92,489 sekundy proti 0,348, tedy 265krát rychleji; běžného zápisu se to ale netýká.

Ovladač souborového systému FAT dostal do chystaného jádra Linuxu 7.4 trojici patchů, po které se rezervace místa na disku vyřídí jedním přidělením clusterů místo stovek malých. Autor změny Matheus Alves de Almeida k ní přiložil vlastní měření a v jednom z nastavení se čas zkrátil z 92,489 na 0,348 sekundy. Správce ovladače OGAWA Hirofumi patche odsouhlasil a do hlavního stromu je 27. října 2026 vzal Linus Torvalds ve slučovací žádosti, kterou posílá Andrew Morton. Jádro 7.3 vyšlo 18. října, takže verze 7.4 je zatím ve slučovacím okně a ještě nevyšla.
Co na FAT umí fallocate
Voláním fallocate() řekne program jádru, ať pro soubor vyhradí místo dopředu. Pozdější zápis do toho rozsahu pak neselže kvůli nedostatku místa na disku. Ovladač FAT z celé rodiny příznaků zvládá jediný, FALLOC_FL_KEEP_SIZE; u ostatních včetně vyřezávání děr vrátí EOPNOTSUPP a na adresář ho použít nejde vůbec. Ten jeden příznak znamená, že se místo vyhradí, ale velikost souboru, kterou hlásí stat(), se nezmění.
Místo stovky volání jedno
Ve verzi 7.3 vypadalo jádro té funkce takhle: spočítal se potřebný počet clusterů a pak se v cyklu přidával jeden po druhém.
while (nr_cluster-- > 0) {
err = fat_add_cluster(inode);
if (err)
goto error;
}
V 7.4 na témže místě stojí jediný řádek.
err = fat_add_clusters(inode, nr_cluster);
Rozdíl ve třetím patchi série je čtyři přidané a šest odebraných řádků v souboru fs/fat/file.c. Skutečnou práci odvedl patch před ním: přejmenoval fat_add_cluster() na fat_add_clusters() a dal mu počet, kolik jich má přidat naráz. K tomu přibyla pomocná funkce fat_alloc_chain(), která vyrobí celý řetězec clusterů a vrátí z něj jen ten první.
Zmizel i strop čtyř clusterů
Bez prvního patche by se to udělat nedalo. Funkce fat_alloc_clusters() měla hned na začátku pojistku BUG_ON(nr_cluster > (MAX_BUF_PER_PAGE / 2)) a MAX_BUF_PER_PAGE je v jádře definované jako PAGE_SIZE / 512. Na stroji se stránkou 4 KiB z toho vyjde osm, takže v jednom volání se směly přidat nejvýš čtyři clustery. Pojistka tam byla kvůli pevnému poli bufferů, ve kterém si funkce schovává zápisy do tabulky FAT; nově je dávkuje stejně, jako to při uvolňování dělá fat_free_clusters(), a strop odpadl.
Kde je ten rozdíl vidět
Měření v popisu patche vzniklo pod QEMU/KVM na zařízení virtio-blk s cache=none, ne na skutečné kartě. Testovací program volá fallocate() nad šestnácti soubory za sebou a měří, jak dlouho to celé trvá. Tahle část tabulky platí pro FAT32 s clustery po 4 096 bajtech a každý řádek je průměr deseti opakování.
| Velikost na soubor | Svazek připojen synchronně | Před | Po | Zrychlení |
|---|---|---|---|---|
| 256 MiB | ne | 295,392 ms | 24,733 ms | 11,9× |
| 16 MiB | ne | 20,509 ms | 1,404 ms | 14,6× |
| 16 MiB | ano | 92,489 s | 0,348 s | 265,4× |
| 1 MiB | ano | 5,837 s | 0,048 s | 121,3× |
Rozdíl mezi prvními dvěma a druhými dvěma řádky nedělá velikost souboru, ale způsob připojení svazku. Na synchronně připojeném svazku se každé přidělení clusteru muselo zapsat na médium hned; teď se zápisy do tabulky FAT sdruží a pošlou najednou. Na běžně připojeném svazku je zrychlení řádově menší, protože zápisy stejně čekaly v paměti.
U clusterů po 512 bajtech vyšel nejpomalejší případ ještě výrazněji, 747,993 sekundy proti 3,445, tedy 217,1×. Ten řádek má ale v tabulce jen tři opakování, kdežto zbytek měření deset.
Běžného zápisu se to netýká
Série míří jen na cestu přes fallocate(). Obyčejný zápis, který soubor nafukuje postupně, si clustery dál bere po jednom a v souboru fs/fat/inode.c nad tím voláním pořád stojí poznámka, že by bylo žádoucí přidělovat víc clusterů najednou. Průvodní dopis série říká i proč to zůstalo: udělat totéž na téhle cestě by si vyžádalo buď spekulativní vyhrazování místa dopředu, nebo převod ovladače na rozhraní iomap. Vyhrazené clustery ovladač navíc nevynuluje, jak stojí v komentáři přímo nad tím voláním.
Prakticky z toho tedy něco mají programy, které si na FAT32 místo rezervují předem a běží nad svazkem připojeným synchronně. Kdo na kartu jen kopíruje soubory, rozdíl neuvidí.
Zdroje
- Commit fat: allocate multiple clusters in fallocate ve stromu jádra Linuxu, včetně celé tabulky měření
- Commit fat: remove cluster allocation size limit a commit fat: support adding multiple clusters, zbylé dva díly série
- Slučovací commit mm-nonmm-stable-2026-10-25-14-57 z 27. října 2026
- Phoronix: FAT32 File-System Seeing As Much As 265x Improvement With Linux 7.4, Michael Larabel, 29. října 2026
- Přehled vydání na kernel.org k datu vydání jádra 7.3
- Příručková stránka fallocate(2)