mpage
Rev.6を表示中。最新版はこちら。
fs/mpage.cのメモ。
概要
mpage.cにはディスクからPageCacheへデータを読みこんだり、PageCache上のデータをディスクに書き込むための汎用ルーチンがある。
これらのルーチンはファイルシステム(ext2,ext2,jfs等)のPageCache制御用ハンドラ(struct address_space_operations)から呼び出されて、PageCacheとディスクの間でデータをやり取りする。
mpageは図1に示すように、PageCacheのページに対応するディスク上のブロックが連続している場合のみ処理を行う。図2に示すように非連続だった場合は、 mpage_readpages()とほぼ同等のblock_read_full_page()に処理をさせる。
図1 ページに対応するディスクブロックが連続しているケース
図2 ページに対応するディスクブロックが非連続なケース
Read/Write関数
mpage_readpage(*page, get_block)
PageCacheのpageにデータを読みこむRead I/Oを発行する。
get_blockには「ファイル上のブロック番号」→「ディスクブロック番号」に変換するルーチンが渡される。これはファイルシステム毎に異なる。例えばExt2ならext2_get_block()。
get_blockには「ファイル上のブロック番号」→「ディスクブロック番号」に変換するルーチンが渡される。これはファイルシステム毎に異なる。例えばExt2ならext2_get_block()。
mpage_readpages(*mapping, *pages, nr_pages, get_block)
pagesリストにチェーンされた複数ページにデータを読みこむ Read I/Oを発行する。
mpage_readpage()と異なりページはここでPageCacheへ登録される。(mpage_readpage()では呼び出し元でPageCacheに登録している)
mpage_readpage()と異なりページはここでPageCacheへ登録される。(mpage_readpage()では呼び出し元でPageCacheに登録している)
mpage_writepage(*page, get_block, *wbc)
pageのデータをディスクに書き込むWrite I/Oを発行する。
mpage_writepages(*mapping, *wbc, get_block)
mpage_end_io_read(*bio, bytes_done, err)
mpage_readpage(),mpage_readpages()で開始したRead I/Oが完了した時に呼び出されるハンドラ。データを読みこんだページをUptodate状態にしページのロックを解除する。
mpage_end_io_write(*bio, bytes_done, err)
mpage_writepage(),mpage_writepages()で開始したWrite I/Oが完了した時に呼び出されるハンドラ。
その他の関数
do_mpage_readpage(*bio, *page, nr_pages, *last_block_in_bio, get_block)
pageにデータを読み込むためのbioを作成して返す。bioを渡すとbioにマージしようとする(アクセスがディスク上で連続ブロックになっていない場合は不可)。
呼び出し元は本関数が返したbioをsubmit_bio()に渡してI/Oを開始する。関数内でI/Oを開始して、残っているI/OがなければNULLが返る。
以下のケースでは、関数内でI/Oを開始される。
前回の呼び出し(bio,last_block_in_bio)からディスクブロックが非連続となった
bioにI/Oをマージしようとしたがサイズが上限を越えた
Partial Page(End Of Fileに到達した)
最後のBufferがBoundaryBuffer
呼び出し元は本関数が返したbioをsubmit_bio()に渡してI/Oを開始する。関数内でI/Oを開始して、残っているI/OがなければNULLが返る。
以下のケースでは、関数内でI/Oを開始される。
前回の呼び出し(bio,last_block_in_bio)からディスクブロックが非連続となった
bioにI/Oをマージしようとしたがサイズが上限を越えた
Partial Page(End Of Fileに到達した)
最後のBufferがBoundaryBuffer