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:

  1. Zablokowanie super-bloku (aby inne procesy nie mogły go modyfikować).
  2. Zaalokowanie i-węzła a pamięci.
  3. Wybór grupy dla katalogu:
    1. 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.
    2. Wśród tych grup wybierany jest blok z największą ilością wolnych bloków.
  4. Wybór grupy dla pliku:
    1. 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).
    2. 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).
    3. 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ł.
  5. Wybieramy pierwszy wolny i-węzeł (w wybranej grupie) korzystając z bitmapy wolnych i-węzłów.
  6. (w przypadku kiedy w bitmapie nie znaleźliśmy wolnych i-węzłów idziemy do punktu nr 3)
  7. Modyfikujemy struktury dysku:
  8. Odblokowanie super-bloku.
  9. Jeżeli zmiany naruszyły parametry dopuszczalne quoty to następuje odwrócenie wszystkich zmian.