2. H-drzewa w ext3

W systemach plików ext bardzo długo do utrzymywania zawartości katalogu wykorzystywano tylko prostych list łączonych. Listy takie bardzo dobrze spisywały się wobec tego, że VFS (Wirtualny system plików) za pomocą struktur dcache (wpisy dentry) bardzo dobrze optymalizuje dostępy do zawartości katalogu. Tym niemniej w przypadku pewnych aplikacji, takich jak cache przeglądarek czy systemy pocztowe korzystające z formatu Maildir, liniowa organizacja listowa powodowała istotne pogorszenie szybkości działania.

Z takich powodów rozważano dołączenie do ext2 struktur danych pokroju B-drzew do reprezentacji zawartości katalogu. Nie zdecydowano się jednak na to, gdyż byłoby to sprzeczne z ideą prostoty kodu przyświecającą temu systemowi plików (implementacja B-drzew w systemie plików XFS jest dłuższa niż cały kod źródłowy ext2 czy ext3!). Poza tym użytkownicy innych systemów plików informowali, że użycie B-drzew powoduje zwiększone szanse na utraty dużych ilości danych, kiedy jeden z wysoko położonych w B-drzewie węzłów ulegnie zniszczeniu.

Dlatego też do systemów plików ext (ext2 w wersjach rozwojowych, a oficjalnie włączone do ext3) wykorzystano inną strukturę danych o nazwie H-drzewa (Hash Trees), która jest specyficznie zoptymalizowana właśnie w kierunku przechowywania katalogów (jest to podejście inne niż w ReiserFS, JFS, XFS czy HFS, gdzie B-drzewa są używane na większą skalę). H-drzewa używają 32-bitowych haszy jako kluczy, a każdy klucz odpowiada przedziałowi nazw przechowywanych w bloku-liściu. Każdy wewnętrzny węzeł takiego drzewa zajmuje tylko 8 bajtów, co powoduje bardzo małe utraty przestrzeni dyskowej (ponad 500 bloków może zostać opisanych przy użyciu czterokilobajtowego bloku indeksowego). H-drzewa mają stałą głębokość (równą jeden lub dwa), w związku z tym nie wymagają używania operacji równoważących i ich implementacja jest o wiele prostsza.

Zadbano także o bardzo dobrą wsteczną kompatybilność struktury danych. Dlatego też bloki-liście są identyczne pod względem struktury z blokami starego typu, a bloki indeksowe są poprzedzone 8-bajtową strukturą, dzięki której stare wersje jądra Linuksa rozpoznają je jako usunięte wpisy katalogowe. Dzięki takiej organizacji łatwo jest także odzyskiwać dane o zawartości katalogu nawet przy zniszczeniu zawartości któregoś węzła wewnętrznego drzewa.

H-drzewa bardzo dobrze spisują się w praktyce, wiele operacji dyskowych na dużych katalogach jest dzięki nim wykonywanych nawet 50-100 razy szybciej.