ディレクトリの生成

ディレクトリの生成も、基本的にファイルの生成と同様である。vfs sys_mkdir(do_mkdir)関数は、 パス検索(lookup_dentry関数)により親ディレクトリのiノードを求めた後、親ディレクトリのiノードのmkdirオペレーションを呼び出すことにより実現されている。

ext2ファイルシステムの場合は、 ext2_mkdir関数が呼び出される。

   ext2_mkdir(親ディレクトリのiノード, 登録するdentry)
      フリーiノードを一つ確保(ext2_new_inode関数)
      iノードの初期化
        - ファイルサイズ(i_sizeメンバ)を0クリア
        - 登録ブロック数(i_blocksメンバ)を0クリア
        - ディレクトリ操作テーブルを登録(ext2_dir_inode_operations, ext2_dir_operations)
      ディレクトリブロックの確保(ext2_bread関数を呼び出すことで実現)
      確保したディレクトリブロックに”.”と”..”のエントリを書き込む.
      iノードのリンクカウントを2に初期化
      ◇ディレクトリブロックの遅延書き込み要求(mark_buffer_dirty関数)
      ディレクトリブロックが入っているバッファの解放(brelse関数)
      ◇iノードの遅延書き込み要求(mark_inode_dirty関数)
      このiノードを親ディレクトリに登録(ext2_add_entry関数)
      親ディレクトリのiノードのリンクカウントを1増やす
      ◇親ディレクトリのiノードの遅延書き込み要求(mark_inode_dirty関数)
      新規作成したディレクトリのdentryとiノードをリンク(d_instantiate関数)
img50.gif

問題点, 注意点

  1. SYNCモードでマウントの場合でも、 mkdir処理において ".", ".."の更新が 遅延書き込みになっている。 システムがクラッシュすると,ゴミのディレクトリ情報を参照する ことがある. 新しく確保したディレクトリブロックが, 以前どこかの ディレクトリに組み込まれていたものであった場合は, DUPブロックが 発生し,致命的なファイルシステム構造破壊に継る.
  2. SYNCモードでマウントされているとき, ext2_bread関数の延長で iノードのディスクへの書き込みが行われるため, ファイル生成とは 異なり未初期化のiノードがディレクトリに登録されることはない.
  3. 親ディレクトリiノードのリンク数が遅延書き込みとなっている。 このタイミングでシステムクラッシュすると、実際より一つ少ない リンク数であるように見えてしまう。しかし、これはfsckにより 簡単に修復できる。

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