ext2_getblk関数アルゴリズム

以下にその大雑把なアルゴリズムを示す。アルゴリズム中に付いている◆印は同期書き込みを、◇印は遅延書き込みを表す。

  ext2_getblk(iノード、オフセット, ...)
        ファイルオフセットをブロック番号に変換(ext2_get_block関数)
        空のバッファを確保(getblk関数)
        if (新規割り当てれたブロックであった場合) {
              バッファをクリア(memset関数)
              バッファを有効にする(mark_buffer_update関数)
              ◇バッファの遅延書き込み要求をだす(mark_buffer_dirty関数)
        }
        バッファを返却

下図は、ちょうど二段間接ブロックが作成される時の、データの更新順を表したものである。◆の後ろに書かれた番号が更新順を表している。

img41.gif

問題点など

  1. SYNCモードのマウント時でも、iノードと間接ブロック(一段〜三段)の 更新順序が逆。iノードに近い方から更新されているが、 その更新途中でシステムクラッシュすると、不定の値を持つ 間接ブロックが登録されてしまうことがある。 この間接ブロックの値によっては致命的なファイルシステム 破壊を引き起こす可能性がある。
  2. SYNCモードのマウント時、ファイル拡張が連続すると、 その度ブロック確保とiノード(間接ブロック)への登録のため、 毎回iノード(間接ブロック)の同期書き込みが発生するため、 I/Oネックとなることが予想される。

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