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 :