Linux Kernel(2.6)の実装に関するメモ書き

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()。

編集中
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 完了時の処理

関連ページ

mpage


最終更新 2007/03/02 10:46:13 - kztomita
(2007/03/02 10:10:08 作成)
添付ファイル
block_read_full_page.png - kztomita
read_op.png - kztomita
page-buffer.png - kztomita
io_completion.png - kztomita


リンク
最近更新したページ
検索