2015-01-07 48 views
1

在讀取io操作的情況下,爲ext3文件系統調用do_generic_file_read函數。如果inode的頁面緩存不包含需要讀取數據的頁面,則調用文件系統特定的讀頁面地址空間函數指針。在ext3文件系統的情況下,ext3_readpage()函數被調用,然後調用通用的do_mpage_readpage()函數。 do_mpage_readpage()函數創建一個bio,通過submit_bio()函數從設備獲取數據,然後控件返回到do_generic_file_read()函數。然而,在do_generic_file_read()中,執行的下一條指令是檢查bio提交的頁面是否是最新的。在這個流程中,內核在哪裏等待生物操作完成並更新頁面?在inode的緩存中找不到頁面時,do_generic_file_read()函數在哪裏睡眠?

回答

0

do_mpage_readpage函數創建生物結構以從磁盤塊獲取數據並將其提交給io。

do_mpage_readpage 
.. 
mpage_bio_submit(READ, bio) 
.. 

當生物被提交後,控制返回到do_generic_file_read()函數,然後lock_page_killable()函數被調用它等待頁面的UPTODATE位。

do_generic_file_read() 
... 
     if (!PageUptodate(page)) { 
      error = lock_page_killable(page); <<<<<<<< it sleeps here 
... 

一旦IO從裝置完成,mpage_end_io()被調用作爲返回處理程序。(正如我們所填充生物> bi_end_io = mpage_end_io同時提交IO)。在讀取的情況下,這將標記生物作爲Uptodate發送到的頁面,並調用unlock_page()函數。這個函數喚醒正在等待頁面啓動的控件。

mpage_end_io 
... 
      unlock_page(page); <<< this wakes up the waiting do_generic_file_read 
...