Do spisu tresci tematu 5

5.3.9 Przydzial blokow dyskowych

Spis tresci


Opis algorytmu

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).

Funkcja ext2_new_block:

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;
}


Bibliografia

  1. Zrodla Linuxa:


Pytania i odpowiedzi

Jak na razie to nie ma pytan.


Autor: Juliusz Stepinski