Szabolcs Szakacsits powiadomił o wydaniu nowej wersji NTFS-3G – poprawiono w niej błąd, który mógł powodować utratę danych. Błąd na razie nie wydaje się być bardzo groźny (o ile można tak powiedzieć o błędzie w systemie plików), ale problemy przy jego debugowaniu były bardzo ciekawe.
Do niedawna FUSE miało ograniczony rozmiar zapisywanego bloku do 4KB, również typowej wielkości klaster NTFS ma rozmiar 4KB. To oznacza, że wszystkie operacje zapisu kończą się na alokacji nowego, pojedynczego klastra. Jednak uszkodzenie danych może się zdarzyć w rzadkich przypadkach podczas alokacji wielo-klastrowej.
Alokator klastrów, który decyduje gdzie znajdą się na dysku dane, jest również używany do rozmieszczania metadanych NTFS. Jeden przypadek używa alokacji pojedynczych klastrów, a inny nie. To może prowadzić do zepsucia danych jeśli wszystkie z poniższych warunków są prawdziwe:
- ostatni używany klaster MFT nie był “wyrównany”
- wolne miejsce było tylko na końcu grupy alokacji klastrów (CAG – cluster allocation group)
- było wymagane więcej wolnego miejsca niż było na końcu CAG
- niewłaściwie odczytana pamięć miała “nieszczęśliwe” wartości
Kolejnym czynnikiem zależnym od szczęścia było to, żeby metadane wymagające wielo-klastrowej alokacji używały innej, zarezerwowanej dla siebie strefy alokacji – w przeciwieństwie do wszystkiego innego, więc to nie wpływało na inne operacje alokacji… dopóki partycja nie zapełniła się prawie do końca.
To jeszcze nie wszystko. Był kolejny czynnik zależący od szczęścia, który normalnie zapobiegał tej sytuacji. Chodzi o pewien brak w funkcjonalności, który w niektórych przypadkach zupełnie blokował wielo-klastrowe alokacje metadanych.
Woluminy NTFS używające mniejszych niż 4KB klastry (512, 1024, 2048) są bardziej narażone. Najwyższe ryzyko jest związane z partycjami korzystającymi z 512 bajtowych klastrów.
Na nasze szczęście znaleźliśmy ten błąd w ostatniej chwili. Następna stabilna wersja jądra Linux 2.6.26 może używać bloków większych niż 4KB, czego skutkiem byłyby losowe uszkodzenia NTFS na dużą skalę.
Na szczęście Miklos Szeredi natychmiast zasugerował i zgodził się zaimplementować opcjonalną (domyślnie wyłączoną) obsługę większych bloków w FUSE. To oznacza, że aktualizacja jądra nie może spowodować uszkodzenia danych na NTFS, tylko jeśli NTFS-3G nie został zaktualizowany do wersji 1.2506.
Obsługa dużych bloków zostanie włączona w NTFS-3G, gdy przejdzie wszystkie nasze testy.
Chyba mamy dzisiaj kolejną rzecz, którą warto zaktualizować. 🙂
Dodaj komentarz