6. Funkcje struktury def_blk_fops - 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
|
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.