block_read_full_page()
Rev.7を表示中。最新版はこちら。
概要
block_read_full_page()はPageCacheへのデータの読み込みを行う汎用ルーチン。
この関数は指定したページに対応するディスクブロックからファイルデータを読み込みページにデータを格納する(図1)。
図1 データの読み込み
この関数は、ファイルリードの過程でディスクからPageCacheへファイルデータを読み込むのに使用する。address_space_operationsのreadpage,readpagesに登録されているPageCacheへのデータ読み込みハンドラ(もしくはその延長の処理)から呼び出される(図2)。
図2 block_read_full_page()の位置づけ
mpageとの関係
同じようなPageCacheへのデータ読み込み関数としてmpageモジュールのmpage_readpage()などがある。
mpage_readpage()ではページに対応するディスクブロックが全て連続している場合に特化された処理となっている。ディスクブロックが非連続となっていてmapgeで処理できない場合は、より汎用的なblock_read_full_page()を呼び出すようになっている。
実装
block_read_full_page(struct page *page, get_block_t *get_block)
pageで指定されるPageCacheにディスクからデータを読み込むRead I/Oを開始する。
get_blockには「ファイル上のブロック番号」→「ディスクブロック番号」に変換するルーチンが渡される。これはファイルシステム毎に異なる。例えばExt2ならext2_get_block()。
get_blockには「ファイル上のブロック番号」→「ディスクブロック番号」に変換するルーチンが渡される。これはファイルシステム毎に異なる。例えばExt2ならext2_get_block()。
編集中
block_read_full_page()の処理概要
:
/* Bufferがなければ作成する */
if (!page_has_buffers(page))
create_empty_buffers(page, blocksize, 0);
do {
:
} while (i, iblock, (bh = bh->b_this_page) != head);
if (fully_mapped)
SetPageMappedToDisk(page);
if (!nr) {
if (!PageError(page))
SetPageUptodate(page);
unlock_page(page);
return 0;
}
for (i = 0; i < nr; i) {
bh = arr[i];
lock_buffer(bh);
mark_buffer_async_read(bh);
}
for (i = 0; i < nr; i) {
bh = arr[i];
if (buffer_uptodate(bh))
end_buffer_async_read(bh, 1);
else
submit_bh(READ, bh);
}
return 0;
end_buffer_async_read()
Read I/O 完了時の処理