Struktury ext2
Autor: Ewa Socha
Album: 181041
1) Ext2 jest podstawowym systemem plików w Linuxie.
Zostal wprowadzony 1994r.
Poprzednicy: MINIX i EXT FS
2) Cechy systemu Ext2 istotne dla algorytmów ext2_new_block i
ext2_free_blocks:
- dzieli
bloki na grupy
- alokuje
bloki dyskowe dla plików zanim zostana one zapisane
3) Struktura
partycji Ext2 i struktura grupy:
- mapa
bitowa bloków - sluzy do przechowywania informacji o
wolnych i zajetych blokach w grupie
- ilosc
grup - zalezy od : wielkoci partycji i rozmiaru
bloku
calkowita
ilosc grup = rozmiar partycji / 8 x rozmiar bloku
(poniewaz mapa bitowa bloków danych musi
zmiescic sie w jednym bloku)
Algorytm
przydzielania bloku dyskowego: ext2_new_block
1) Kody Zródlowe:
fs/ext2/balloc
2) Naglówek:
int ext2_new_block (const struct inode *inode, unsigned long
goal, u32 *prealloc_count, u32 *prealloc_block, int *err)
3) Parametry:
- inode
- struktura i-wezla pliku dla którego chcemy przydzielic
blok
- goal
- numer bloku, który jest preferowany do przydzielenia
- prealloc_count
- zmienna na która funkcja zapisze ilosc prealokowanych
bloków
- prealloc_block
- zmienna na która funkcja zapisze numer pierwszego
prealokowanego bloku
- err
- zmienna za której funkcja zapisze numer bledu
4) Wynik:
- numer
przydzielonego bloku, zmienne prealloc_count i prealloc_block;
- 0
gdy wykryto blad, na zmiennej err zwrócony jest jego
numer
5) Schemat
blokowy:
6) Opis dzialania:
- operacje
poszukiwania bloków odbywaja sie na mapie bitowej zajetosci
bloków w grupie
- blokada
na super blok - zabezpiecza nas przed zaalokowaniem tego
samego bloku przez róznych uzytkowników
- sprawdzenie
czy na dysku sa wolne bloki tzn. czy liczba wolnych bloków
nie jest mniejsza od liczby bloków zarezerwowanych dla
super-uzytkownika
- szukanie bloku we wskazanej grupie (w której znajduje sie
goal):
- szukanie
w pozostalych grupach (jezeli nie udalo sie we wskazanym
miejscu):
- algorytm
znajdowania 8 wolnych bloków po znalezieniu
wolnego bajtu, cofa sie do poczatku grupy wolnych bitów
- sprawdzanie
czy po przydzieleniu bloku nie przekroczymy quoty
- prealokacja
- wykonywana jezeli jest ustawiona odpowiednia opcja:
- zapisywanie
zmian na dysku
- wystapienie
bledu - na zmiennej err zostaje zapisany jeden z ponizszych
bledów:
ENOSPC - brak
miejsca na dysku,
EDQUOT - przydzielenie nowego bloku spowodowaloby przekroczenie
quoty,
EIO - nastapia blad przy odczycie lub zapisie na dysku
7) Zapobieganie fragmentacji dysku:
- poprzez
parametr goal, który jest podawany przez funkcje ext2_getblkwedlug
nastapujacego algorytmu:
a)
jezeli plikowy numer bloku ma numer nastepny po bloku poprzednio
alokowanym to goal := goal (poprzedni)+1;
b)
wpp jezeli dla pliku zostal juz wczesniej zaalokowany jakis blok
to
goal := goal(wczesniej zaalokowany dla pliku)
c)
wpp goal := pierwszy blok w grupie, która zawiera i-wlzel
- poprzez
wyznaczanie pierwszego wolnego bloku w ciagu;
- poprzez
prealokacje;
Algorytm zwalniania
bloku dyskowego: ext2_free_blocks
1) Kody Zródlowe:
fs/ext2/balloc
2) Naglówek:
void ext2_free_block(struct inode * inode, unsigned long
block, unsigned long count)
3) Uzycie:
- ext2_truncate()
- znajduje bloki danych , dzieli na ciagi sasiadujacych
ze soba
- odrzuca
wczeniej prealokowane bloki plików
4) Parametry:
- inode
- struktura i-wezla pliku dla którego chcemy zwolnic
blok
- block
- numer bloku od którego chcemy zwalniac bloki
- count
- ilosc bloków które chcemy zwolnic
5) Wynik:
- to
jest procedura wiec nic nie zwraca
6) Opis algorytmu:
- blokada
na super blok
- sprawdzenie
poprawnoci argumentów
- zerowanie
bitów wskazanych bloków na odpowiedniej mapie bitowej
- aktualizacja
informacji o iloci wolnych bloków i quocie
- zapisanie
zmian
- zwalnianie
super bloku