Przydzial nowego bloku dyskowego w systemie plikow EXT2, ktorym sie zajmujemy, jest realizowany za pomoca funkcji ext2_new_block (implementacja funkcji znajduje sie w pliku: /fs/ext2/balloc.c).
DEFINICJA: int ext2_new_block ( const struct inode * inode, unsigned
long goal,
u32 * prealloc_count, u32 * prealloc_block,
int
* err)
WYNIK: numer przydzielonego bloku lub
0, gdy
blad, err = ENOSPC (brak wolnego miejsca na dysku)
EDQUOT
(przekroczona quota)
Opis parametrow wejsciowych:
Opis funkcji: po sprawdzeniu sensownosci argumentow funkcja szuka
wolnych blokow w aktualnej grupie, jezeli tam nie znajdzie, to szuka we
wszystkich grupach, ktorych obrazy sa zaladowane do pamieci komputera.
W przypadku nie znalezienia tam wolnych blokow przeszukiwane sa wszystkie
grupy (odczyt z dysku), az do znalezienia wolnego bloku. Jezeli nie znajdziemy
na calym dysku ani jednego wolnego bloku to wychodzimy z funkcji z kodem
bledu.
Prealokacja dziala tak, ze jak znajdziemy wolny blok to alokujemy kilkanascie
nastepnych wolnych blokow (w obrebie tej samej grupy) na potrzeby naszego
pliku. Gdy plik ich nie wykorzysta, to oczywiscie zostana zwolnione.
Jest tez tak, ze administrator systemu (ang. root) ma specjalna
zarezerwowana pole wolnych blokow z ktorych tylko on moze korzystac.
Implementacja:
{
sprawdzenie poprawnosci argumentow;
blokowanie bloku identyfikacyjnego (ang. super block);
if (nie ma wolnych blokow w systemie)
if (czy jestesmy administratorem)
if (nie ma wolych blokow zarezerwowanych)
{odblokowanie bloku
identyfikacyjnego; return ENOSPC;}
else {odblokowanie bloku identyfikacyjnego; return ENOSPC;}
else {odblokowanie bloku identyfikacyjnego; return ENOSPC;}
g=numer grupy dla bloku goal;
if (w grupie g sa wolne bloki)
idziemy do "dalej";
for (g=dla kazdej grupy, ktorych obrazy sa trzymane w pamieci)
if (w grupie g sa wolne bloki)
idziemy do "dalej";
for (g=dla kazdej grupy w systemie plikow)
if (w grupie g sa wolne bloki)
idziemy do "dalej";
dalej:
if (czy przekroczona quota uzytkownika)
{odblokowanie bloku identyfikacyjnego; return
EDQUOT;}
opcjonalnie: (o ile zdefiniujemy EXT2_PREALLOCATE)
zrob prealokacje na wolne bloki maksymalnie do
konca grupy i maksymalnie 8;
if (czy cos sie nie zgaza w policzonych rzeczach)
{ext2_error() z odpowiednimi parametrami (funkcja
do panikowania systemu w szczegolnych
przypadkach);
odblokowanie bloku identyfikacyjnego; return
0;}
system rezerwuje blok w systemie plikow;
odblokowanie bloku identyfikacyjnego;
*err=0;
return numer przydzielonego bloku;
}
Jak na razie to nie ma pytan.