5.2.4 Czytanie i pisanie blokow dyskowych
Do
spisu tresci tematu 5
5.2.4 Czytanie i pisanie blokow dyskowych
Spis tresci
Wprowadzenie
Funkcje i ich implementacje : bread() , brelse()
, sync_buffer()
Bibliografia
Wprowadzenie
Opisane ponizej funkcje to dalsza czesc funkcji obslugujacych podreczna
pamiec buforowa
Funkcje i ich implementacje
Funkcja
bread ()
-czyta blok dyskowy do bufora
DEFINICJA: struct buffer_head * bread( kdev dev ,int block , int size )
WYNIK : wskaznik na strukture buffer_head bufora do ktorego
czytalismy
NULL w przypadku bledu
W kolejnosci od lewej argumenty oznaczaja :numer dysku , numer bloku
(na ich podstawie znajdowany jest bufor) , rozmiar bufora
Struktura buffer_head jest opisana w rozdziale 5.2.1
Implementacja funkcji :
{
/*probujemy dostac bufor */
if(!(bufor=getblk(dev ,block ,size)))
return (NULL)
if(czy bufor zawiera aktualne dane )
return(bh)
czytaj blok dyskowy na bufor
/* sprawdz czy wszystko sie powiodlo (czekaj na bufor , sprawdz
czy zawiera aktualne dane) */
if (bufor zawiera aktualne dane)
retur (bufor)
wpp zwolnij bufor /* algorytm brelse */ i return (NULL)
}
Funkcja breada
()
-czytaj bloki dyskowe z wyprzedzeniem
DEFINICJA : struct buffer_head * breada (kdev dev
int block
int size
unsigned int pos
unsigned int filesize)
WYNIK : analogicznie do bread()
Pierwsze trzy argumenty sa analogiczne do bread() , na podstawie dwoch
ostatnich wyliczne sa numery blokow buforow ktore bedziemy czytac z wyprzedzeniem
Implementacja funkcji:
{
sprawdz porawnosc argumentow
if(!(bufor=getblk ( dev , block ,size)))
return (NULL)
if (bufor zawiera aktualne dane)
return (bufer )
wpp czutaj blok dyskowy
/* wyliczamy bloki czytane z wyprzedzeniem , maksykmalnie moze byc
ich NBUF zadeklarowane na 16*/
index=BUFSIZE_INDEX (bufor ->b_size)
blocks=( filesize - pos) >> (9 + index)
staramy sie dostac te bufory wywolujac funkcje getblk dla kolejnych
numerow blokow
zmieniajacych sie od block do block + blocks
wkladamy do tablicy pomocniczej bhlist bufory ktore nie posiadaja
aktualnych danych
czytamy te bufory , a nastepnie zwalniamy
/*sprawdz czy czytanie przebieglo prawidlowodlo pierwszego bufora*/
wait_on_buffer(pierwszy bufor)
if (zawiera aktualne dane )
return (bufor)
wpp zwolnij go i return (NULL)
}
Funkcja brelse
()
-Procedura ta zwalnia bufor wskazywany
przez argument
DEFINICJA : void brelse (struct buffer_head * buf)
Implementacja funkcji:
{
/*czekaj na bufor */
wait_on_buffer (buf)
/* ustaw czas kiedy ten bufor powinien byc zapisany */
set_writetime (buf , 0 )
/*uprzadkuj pola naglowka bufora , funkcja opisana ponizej */
refile_buffer (buf )
zmniejsz licznik odwolan do bufora
}
Funkcja pomocnicza refile_buffer()
DEFINICJA: void refile_buffer (struck buffer_head * buf )
Implementacja funkcji :
{
int dis /*zmienna pomocnicza */
if(buffer_dirty(buf))
dis=BUF_DIRTY
wpp if (ilosc uzytkownikow strony na ktorej jest zawrtosc bufora
jest wieksza od 1 || buffer_protected(buff))
dis=BUF_SHARED
wpp if (buffer_locked (buf ))
dis+BUF_LOCKED
wppp if (buf ->b_list == BUF_SHARED )
dis=UNSHARED
wpp dis=CLEAN
if(zmienna dis nie rowna sie polu buf ->b_list) {
if(dis =BUF_DIRTY || dis=BUF_UNSHARED)
/* ustaw czas ostatniego uzytkowania */
buf->b_lru_time=jiffies
if(dis =BUF_LOCKED || roznica miedzy czasem kiedy ten bufor powinien
byc zapisany /*buf->b_flushtime */ , a czasem ostatniego uzytkowania
jest <= od bdt_prm.b_un.age_super)
dis=BUF_LOCKED1
/* usuwamy z kolejek dany bufor */
remove_from_queues (buf )
buf->b_list=dis
/*wstawiamy do odpowiednich kolejek */
insert_into_queues (buf )
}
}
Pola b_list w naglowku bufora opisane jest w rozdziale 5.2.1
Funkcja sync_buffer
()
-Zapisuje bufory na dysk
DEFINICJA : static int sync_buffer (kdev dev , int wait )
WYNIK: przekazuje kod bledu
Przegladamy liste lru w poszukiwaniu DIRTY buforow o danym
numerze urzadzenia dyskowego
Jezeli argument wait != 0 to w poszukiwaniu tym nie czekamy na bufory
zablokowane
Jezeli cos zostalo zapisane to powtarzamy przejscie po kolejce lru
tym razem czekajac tylko na dokonczenie zapisu buforow
Powrot z funkcji nastepuje gdy wszystkie DIRTY bufory zostana zapisane
Bibliografia
Zrodla Linuxa :
fs/buffer.c
Wyszukiwarka
Podobne podstrony:
fun buf (10)znak fun tryg canvaskatFUN Grudziadzdos lid fun der goldener pawe c moll pfte vni vla vc vox3 funfun wykladnicza panelsuwakifun kwadrat panelsuwakiTC bl funfun logarytm canvasmoj6Instrukcja obsługi Nokia Fun Camera PLfun wykladnicza paneltytul3rd fall funfun wykladnicza paneltytulwięcej podobnych podstron