fun buf (3)


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 canvaskat
FUN Grudziadz
dos lid fun der goldener pawe c moll pfte vni vla vc vox
3 fun
fun wykladnicza panelsuwaki
fun kwadrat panelsuwaki
TC bl fun
fun logarytm canvasmoj6
Instrukcja obsługi Nokia Fun Camera PL
fun wykladnicza paneltytul
3rd fall fun
fun wykladnicza paneltytul

więcej podobnych podstron