Wszystkie żądania odczytu(zapisu) z urządzenia blokowego, przechodzą przez funkcje: block_read(block_write). Funkcje te sprawdzają czy, bloki które chcemy odczytać(zapisać), znajdują się w pamięci. Jeśłi tak to wykonywana jest odpowiednia operacja na tych blokach. Natomiast, jeśli potrzebnych nam bloków nie ma w pamięci, to musimy pobrać je z urządzenia, czyli zgłosić żadanie wjścia/wyjścia. Wywoływana jest wtedy funkcja ll_rw_block.
Funkcja ll_rw_block:
Parametry wejściowe: czytanie czy pisanie, ile buforów, tablica buforów
początek funkcji
sprawdzanie czy wielkości buforów sa poprawne
dla każdego bufora rób
sprawdz czy ilosc zablokowanych buforów nie jest za duża (queued_sectors > high_queued_sectors)
jesli tak to
odkorkuj kolejke żądań
czekaj aż zmaleje ilosć zablokowanych buforów (queued_sectors < low_queued_sectors)
koniec jesli
wywołaj funkcję submit_bh dla danego bufora
koniec rób
koniec funkcji
Odkorkowanie kolejki żądań oznacza rozpoczęcie realizacji poczczególnych żądań wejścia-wyjścia w kolejce (będzia o tym mowa dalej).
|