Do spisu tresci tematu 5


Opisane ponizej funkcje to dalsza czesc funkcji obslugujacych podreczna pamiec buforowa


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


Zrodla Linuxa :