Poprzedni -
Index -
Następny
2. Alokowanie nowego i-węzła
Źródło:
/usr/src/linux/fs/ext2/ialloc.c
Składnia:
struct inode * ext2_new_inode (const struct inode * dir, int mode)
Parametry:
dir - i-węzeł katalogu, w którym tworzymy plik lub katalog
mode - atrybuty tworzonego pliku (w szczególności: czy to jest katalog)
W przypadku wystąpienia błędu następuje zwolnienie i-węzła w pamięci,
odblokowanie super-bloku i zakończenie procedury zwracjąc kod błędu.
Algorytm:
- Zablokowanie super-bloku (aby inne procesy nie mogły go modyfikować).
- Zaalokowanie i-węzła a pamięci.
- Wybór grupy dla katalogu:
- Algorytm przeszukuje wszystkie grupy zawierające ilość
wolnych i-węzłów powyżej średniej ilości i-węzłów na całym dysku.
- Wśród tych grup wybierany jest blok z największą ilością wolnych
bloków.
- Wybór grupy dla pliku:
- Jeżeli są wolne i-węzły w grupie w którym znajduje się katalog
(pliku lub katalogu dla którego jest alokowany i-węzeł) to jest
on wybierny. Dzięki temu pliki występujące w tym samym katalogu
będą się znajdować blisko siebie (tj. w tej samej grupie).
- W przeciwnym wypadku: wybierany za pomocą funkcji haszującej
pierwszą grupę, w której znajdują się nie zaalokowane bloki.
Sprawdzamy kolejne grupy oddalone o: 1, 2, 4, ..., 2^n <
ilość grup (modulo ilość grup).
- W przeciwnym wypadku: sprawdzamy po kolei wszystkie kolejne
grupy począwszy od grupy, w której znajdował się katalog.
Wybieramy pierwszą wolną, w której jest miejsce na i-węzeł.
- Wybieramy pierwszy wolny i-węzeł (w wybranej grupie) korzystając z
bitmapy wolnych i-węzłów.
- (w przypadku kiedy w bitmapie nie znaleźliśmy wolnych i-węzłów
idziemy do punktu nr 3)
- Modyfikujemy struktury dysku:
- Licznik plików w katalogu
- Licznik użytych katalogów (w przypadku katalogu)
- Licznik wolnych i-węzłów
- Bitmapa zajętych i-węzłów
- Odblokowanie super-bloku.
- Jeżeli zmiany naruszyły parametry dopuszczalne quoty to następuje
odwrócenie wszystkich zmian.