塊存儲:寫塊設備緩存的代碼註釋

“塊存儲:AIO的直接寫流程註釋”中說到,在__generic_file_write_iter的處理流程中,

1) 如果是Direct 寫(IOCB_DIRECT),__generic_file_write_iter將首先調用generic_file_direct_write函數,然後generic_file_direct_write調用塊設備的direct_io函數直接寫設備,如果direct_io沒有將需要寫盤的數據全部寫完,就要調用generic_perform_write函數做一次buffer write(例如,當直接落盤失敗,還要將未寫入的部分通過緩存落盤;man手冊O_DIRECT這個標記的說明是Try to minimize cache effects of the I/O to and from this file.而不是不使用page cache),即寫page cache(塊設備也是一種文件,有對應的address_space管理page cache);

2) 如果不是Direct 寫,就直接調用generic_perform_write函數做一次buffer write;

下面對generic_perform_write函數的流程做一下注釋,其主要邏輯分三步:

1,調用塊設備的write_begin函數,獲取塊設備緩存page;

2,調用iov_iter_copy_from_user_atomic將用戶要寫的用戶空間的數據copy到塊設備的緩存page中;

3,調用塊設備的writer_end函數,在第2步驟已將用戶數據copy到塊設備的緩存page中,writer_end函數作用就是標記該page爲最新、page bh爲dirty,等待在合適的時機被刷到設備中。

1,上述generic_perform_write代碼中,塊設備的writer_begin函數是blkdev_write_begin, 該函數爲塊設備的緩存準備page:

下圖“page,bh與from~to的關係”解釋了__block_write_begin_int函數中最後判斷要調用ll_rw_block從設備上讀取 page中某個塊數據的邏輯:

2,generic_perform_write代碼中,函數iov_iter_copy_from_user_atomic作用是將用戶要寫的用戶空間的數據copy到塊設備的緩存,即page中:

3, generic_perform_write代碼中,塊設備的writer_end函數是blkdev_write_end,在第2步驟已將用戶數據copy到塊設備的緩存page中,blkdev_write_end函數作用就是標記該page爲最新、page bh爲dirty,等待在合適的時機被刷到設備中:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章