Podsystem Wejścia/Wyjścia w systemie Linux 2.4.7
Urządzenia znakowe i blokowe. Funkcja block_read(), block_write().
6. Funkcje struktury def_blk_fops - funkcja blkdev_close()
< Poprzednia strona Spis treści Następna strona >

6. Funkcje struktury def_blk_fops - funkcja blkdev_close()


6.1 Funkcja blkdev_close()

Podobnie jak poprzednio funkcja zamykająca wywołuje funkcję systemową sys_close(). Funkcja ta pobiera, a następnie zeruje strukturę file odpowiadającą danemu deskryptorowi. Następnie deskryptor jest ustawiany jako nieużywany i następuje wywołanie funkcji filp_close() dla struktury file podanej jako parametr. Ta z kolei funkcja usuwa wszystkie blokady typu FL_POSIX nałożone przez wywołującego na tym pliku (urządzeniu), po czym wywoływana jest funkcja fput(). Na początku testowana jest ilość odwołań do danej struktury file. Jeśli właśnie zamykane odwołanie jest ostatnie należy rzeczywiście zamknąć plik. W tym celu najpierw zdejmujemy blokady typu FL_FLOCK i FL_LEASE. Następnie wywoływana jest

Obrazek poglądowy
Przepływ sterowania od wywołania funkcji close() do funkcji blkdev_close()

funkcja blkdev_close(), która jest prostym wywołaniem funkcji blkdev_put() z numerem urządzenia, którego dotyczy, jako parametrem. Funkcja ta ma za zadanie zwolnienie buforów dla tego urządzenia. Jeśli dla urządzenia określona jest funkcja zamykająca zostaje ona wywołana. Do wykonania tych operacji potrzeby jest wyłączny dostęp do urządzenia, który jest zapewniany za pomocą semafora zamykanego urządzenia. Po powrocie do funkcji fput aktualizowany jest licznik odwołań do używanego modułu, po czym w razie potrzeby zezwalane jest otwieranie urządzenia do pisania. Aktualizowane są struktury katalogu, w którym jest urządzenie oraz struktura zamontowanego systemu plików, na którym jest urządzenie. Następnie struktura file jest ostatecznie usuwana z listy urządzeń otwartych i umieszczana na liście do ponownego wykorzystania.


Autor: Filip Łukasik