Do spisu tresci

6.3.2 Przydział i-węzła nowemu plikowi


Przydziałem i-węzła tworzonemu plikowi (w file systemie ext2) zajmuje się funkcja ext2_new_inode, znajdująca się w pliku fs/ext2/ialloc.c.

Deklaracja funkcji:	

struct inode * ext2_new_inode (const struct inode * dir, int mode, int * err)

    dir  - wskaźnik do i-węzła katalogu w którym ma być umieszczony plik
    mode - flaga opisująca  typ pliku (katalogu czy inny)
    err - wskaźnik do zmiennej przekazującej rodzaj błędu funkcji

Algorytm przydziału i-węzla zależy od tego czy przydzielamy i-węzeł katalogowi czy plikowi innego typu. Jeśli plik jest katalogiem to przydzielany jest mu i-węzeł z grupy bloków, w której znajduje się najwięcej wolnych i-węzłów. Wymaga to przeszukania wszystkich deskryptorów grup,w których znajdują się liczniki wolnych i-węzłów. Nie jest to kosztowne, bowiem tworzenie nowego pliku nie jest czynnością powtarzaną z dużą częstotliwością w systemie, a ponadto wszystkie deskryptory grup wczytywane są do pamięci w momencie ładowania systemu i pozostają tam stale do końca działania systemu.(jest ich od kilkudziesięciu do kilkuset).

Jeżeli plik nie jest katalogiem, to szukanie wolnego i-węzła zaczynamy od grupy, w której znajduje się katalog tworzonego pliku. Powoduje to, że z większym prawdopodopieństwem pliki leżące w tym samym katalogu będą znajdować się w tej samej grupie bloków. Jeżeli w grupie katalogu nie istnieją wolne i-węzły, to przeszukiwanie grup odbywa się przy pomocy algorytmu nazwanego quadratic hash (patrz skomentowany kod fukncji ext2_new_inode()). Gdy nie da to rezultatu następuje liniowe przeszukiwanie wszystkich grup po kolei w celu znalezienia grupy z wolnymi i-węzłami.

Po wybraniu grupy bloków, pozostaje wyszukać wolny i-węzeł w grupie i przydzielić go utworzonemu plikowi. Informacja, który i-węzeł w grupie bloków jest wolny, a który zajęty przechowywana jest w mapach bitowych. W odróżnieniu od deskryptorów grup mapy bitowe zajętości i-węzłów nie są wszystkie przechowywane w pamięci.W pliku include/linux/ext2_fs_sb.h zadeklarowana jest stała EXT2_MAX_GROUP_LOADED, która określa maksymalną ilość załadowanych bitmap w pamięci i jej wartość wynosi 8. Zatem widać że tylko niewielka część bitmap może się znaleźć jednocześnie w pamięci. Gdy liczba grup przewyższa tę stała (przypadek najczęstszy), wówczas stosowany jest algorytm LRU do wymiany bitmap w pamięci(funkcja load_inode_bitmap()). Po znalezieniu i-węzła bufory zawierające deskryptor grupy i mapę bitową są zaznaczne jako "dirty" w celu ich późniejszego zapisu na dysk, a wskaźnik do wybranego i-węzła jest zwracany jako wartość funkcji.


Bibliografia

  1. Pliki źródłowe Linuxa:
  2. Projekt Linux
  3. Linux Kernel Hackers Guide
  4. Maurice J. Bach "Budowa systemu operacyjnego UNIX"

Przygotował Adam Hlebowicz