Proces szeregowania żądań do urządzeń blokowych | |||
Funkcja blk_init_queue ustala wartość domyślną dla pola make_request_fn na __make_request. Funkcja __make_request: Parametry wejściowe: kolejka żądań, czytanie czy pisanie, bufor początek funkcji jeśli kolejka żądań jest pusta to ją zakorkuj jeśłi nie to użyj windy zdefiniowanej w tej kolejce (pole elevator w request_struct) jesli możesz dołączyć to żądanie do już istniejącego to zrób to i zakończ koniec jeśli koniec jeśli sprubuj pobrać wolny obiekt request jeśli nie ma to odkorkuj kolejkę i czekaj aż będą wolne struktury request koniec jeśli wstaw nowe żądanie do kolejki, jeśli używałeś windy to w miejscu podanym przez windę koniec funkcjiJeśli kolejka żądań jest zakorkowana, wówczas przyjmuje ona nowe żądania ale ich nie wykonuje. Właściwe obsłużenie żądania wejścia-wyjścia dokonuje się podczas odkorkowania kolejki - funkcją generic_unplug_device. W funkcji tej wywoływana jest funkcja request_fn odpowiedzialna za obsługę żądań w tej kolejce. Koleja jest odkorkowywana w dwóch miejscach omawianego tu procesu. W funkcji ll_rw_block jeśli brakuje buforów, oraz w funkcji __make_request jeśli brakuje obiektów request. W strukturze request_queue jest zdefiniowana kolejka zadań plug_tq. Jej domyślną funkcją realizacji (ustawianą w funkcji blk_init_queue) jest funkcja generic_unplug_device. Oznacza to że jeśli wywołamy funkcje run_task_queue na kolejce zadań plug_tq to uruchomimy funkcję generic_unplug_device a tym samym funkcję request_fn realizującą żądania. | |||
|