Show page source of internal24-80-ページ書き込み要求 #25250

[[PageNavi(internal24-navi)]]

{{{ comment
h2w-title:ページ書き込み要求
}}}
 

== ページ書き込み要求 == #SECTION03333000000000000000

次に、ページ書き込み要求処理のアルゴリズムに関して説明する。ページ書き込み処理は二段階で行われる。

{{{
    block_prepare_write(iノード、I/O領域、読み込むページ, getblock関数)
        ページにまだバッファヘッドが割り付けられていなければ、
    バッファヘッドを確保しページとリンク(create_empty_buffer関数)
        for (バッファのある間) {
            I/O完了コールバック関数としては、end_buffer_io_syncを登録。
            if(バッファがブロックと対応付けられていない) {
                getblock関数を利用し、inodeとファイルオフセットから
                  ブロック番号を求める。
                if (新規確保したバッファなら) {
                     もしバッファキャッシュにキャッシュが残っていれば
                       そいつの解放を行う(unmap_underlying_metadata関数)
                     0クリアする。
                }
                if (バッファがまだ有効でないなら)
                     I/O要求の発行(ll_rw_block関数)
            }
        }
        I/O完了を待ち合わせる(wait_on_buffer関数)
}}}

上記関数で用意ができた後、書き込み要求のあったデータをページに書き込み下記関数を発行する。

{{{
    generic_commit_write(iノード、I/O領域、読み込むページ)
        for (ページに対応づけられたバッファ群に対し) {
            バッファを有効状態(BH_Uptodate)にし、
              かつバッファをDirtyな状態にする(__makr_dirty関数)
        }
        Dirtyなバッファが多いようならkflushデーモンを起動する(balance_dirty関数)
        ページを有効にする(SetPageUptodate関数)
}}}

----

''(NIS)HirokazuTakahashi [[BR]]2000年12月09日 (土) 23時55分06秒 JST''1

[[PageNavi(internal24-navi)]]