アルゴリズム詳細

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

    ext2_new_block(iノード, ヒント値, ....)
      (上記アルゴリズムを用いて、空きブロックを検索)
      候補のブロックグループのブロックビットマップを読み込む(load_block_bitmap関数)
      ブロックビットマップ内のビットを予約する。
      プリアロケートの処理(後述のプリアロケート機能に関する説明参照)
      ◇ブロックビットマップの遅延書き込み要求
      if(SYNCマウント?) {
          ◆ブロックビットマップをディスクに書き込む(ll_rw_block関数、wait_on_buffer関数)
      }
      上記ブロックに対応するバッファの確保(getblk関数)
      確保したバッファのクリア
      確保したバッファを有効にする(mark_buffer_uptodate関数)
      ◇このバッファの遅延書き込み要求(mark_buffer_dirty関数)
      確保したバッファの解放(brelse関数)
      ブロックグループディスクリプタが管理するフリーブロック数を1減らす
      ◇ブロックグループディスクリプタの属するバッファを遅延書き込み要求(mark_buffer_dirty)
      スーパブロックが管理するフリーブロック数を1減らす
      ◇スーパブロックを遅延書き込み要求(mark_buffer_dirty)

データブロックの解放は連続したブロックをまとめて行う。

  ext2_free_blocks(iノード, ブロック番号, ブロック数)
      ブロックが属するブロックビットマップを読み込む
      ブロックビットマップ内のビットを解放する

      ブロックグループディスクリプタが管理するフリーブロック数を1増やす
      ◇ブロックグループディスクリプタの属するバッファを遅延書き込み要求(mark_buffer_dirty)
      スーパブロックが管理するフリーブロック数を1増やす
      ◇スーパブロックを遅延書き込み要求(mark_buffer_dirty)
      if(SYNCマウント?) {
          ◆ブロックビットマップをディスクに書き込む(ll_rw_block関数、wait_on_buffer関数)
      }


(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST
1