Zaprezentowana zostanie wersja ialloc z systemu plików Ext2.
Algorytm ten realizuje funkcja ext2_new_inode().
Funkcja ext2_new_inode() tworzy dyskowy i-węzeł Ext2, zwracając adres
odpowiedniej struktury i-węzła (albo NULL, jeżeli wystąpi błąd). Funkcja ta
korzysta z dwóch parametrów: adresu dir struktury i-węzła, dotyczącej
katalogu, do którego ma być wstawiony nowy i-węzeł, oraz parametru mode,
określającego rodzaj tworzonego i-węzła.
Funkcja wykonuje następujące działania:
1. Wywołuje get_empty_inode() w celu zaalokowania nowej struktury i-węzła i
zainicjowania jego pola i_sb na adres superbloku (przechowywany w polu
dir->i_sb).
2. Wywołuje lock_super() w celu otrzymania wyłącznego dostępu do struktury
superbloku. Funkcja ta testuje i ustawia wartość pola s_lock i, jeśli to
konieczne, usypia aktualny proces do czasu, aż flaga przyjmie wartość 0.
3. Jeżeli nowym i-węzłem jest katalog, próbuje umieścić go tak, aby katalogi
były równomiernie rozłożone pomiędzy częściowo wypełnione grupy bloków.
Nowy katalog jest alokowany w grupie bloków, mającej zarówno dużo wolnego
miejsca, jak i mały współczynnik katalogów w stosunku do i-węzłów.
Jeśli nie ma takiej grupy, jest alokowany w grupie mającej największą
liczbę wolnych bloków wśród wszystkich grup, mających większą od średniej
liczbę wolnych i-węzłów. (Średnia to całkowita liczba wolnych i-węzłów,
podzielona przez liczbę grup bloków).
4. Jeżeli nowy i-węzeł nie jest katalogiem, funkcja alokuje go w grupie
bloków z wolnym i-węzłem. Grupa jest wybierana tak, że funkcja szuka jej
zaczynając od katalogu nadrzędnego i odchodzi od niego coraz dalej
(haszowanie kwadratowe).
5. Wywołuje load_inode_bitmap() w celu pobrania mapy bitowej i-węzłów
wybranej grupy bloków i wyszukuje w niej pierwszy pusty bit, uzyskując numer
pierwszego wolnego i-węzła dyskowego.
6. Alokuje i-węzeł dyskowy: ustawia odpowiedni bit w mapie bitowej i-węzłów
i zaznacza bufor zawierający mapę bitową jako "brudną". Oprócz tego, jeżeli
system plików został zamontowany z flagą MS_SYNCHRONOUS, wywołuje
ll_rw_block() i czeka na zakończenie operacji zapisu.
7. Zmniejsza pole bg_free_inodes_count deskryptora grupy bloku. Jeżeli nowy
i-węzeł jest katalogiem, zwiększa bg_used_dir_count. Oznacza jako brudny
bufor zawierający deskryptor grupy.
8. Zmniejsza pole s_free_inodes_count superbloku dysku i zaznacza
zawierający go bufor jako brudny. Ustawia pole s_dirt struktury superbloku
VFS na 1.
9. Inicjuje pola struktury i-węzła. W szczególności ustawia numer i-węzła i_no
i kopiuje wartość xtime.tv_sec do i_atime, i_mtime i i_c_time. Ładuje także
do pola i_block_group w strukturze ext2_inode_info indeks grupy bloków.
10. Wstawia nową strukturę i-węzła do inode_hashtable.
11. Wywołuje funkcję mark_inode_dirty() w celu przesunięcia struktury i-węzła
do listy brudnych i-węzłów superbloku.
12. Wywołuje funkcję unlock_super() w celu odblokowania struktury superbloku.
13. Zwraca adres nowego struktury i-węzła.