Lemur zaprasza
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 |