シンボリックリンクファイルの生成

シンボリックリンクファイルの作成は、vfs sys_symlink(do_symlink)関数においてlookup_dentry関数を用いて、ファイルを登録する親ディレクトリのiノードを求めた後、そのiノードのsymlinkオペレーションを呼び出すことにより実現されている。ext2ファイルシステムでは、ext_symlink関数が呼び出される。

   ext2_symlink(親ディレクトリのiノード, 登録するdentry, 登録するパス名)
      フリーiノードを一つ確保(ext2_new_inode関数)
      iノードの初期化
      if(登録するパス名が60文字以上?) {
           inode操作テーブルとして、page_symlink_inode_operations, ext2_aopsを登録
           ページI/Oを利用してパス名をブロックに書き込む(block\_symlink関数)
      } else { /* パス名が60文字未満 */
           inode操作テーブルとして、ext2_fast_symlink_inode_operationsを登録
           iノード中に登録パス名をコピー
           iノードのファイルサイズ情報(i_sizeメンバ)に上記パス名長+1を設定
      }
      ◇iノードの遅延書き込み要求(mark_inode_dirty関数)
      このiノードを親ディレクトリに登録(ext2_add_entry関数)
      新規作成したシンボリックリンクファイルのdentryとiノードをリンク(d_instantiate関数)

   block_symlink(iノード, 登録するパス名, パス長)
       ページキャッシュを確保(grab_cache_page関数)
       ページ書き込み準備要求を出す(inodeのprepare_writeメソッド)
       ページにパス名をコピーする。
       ページ書き込み要求を出す(inodeのcommit_writeメソッド)
       ページ読み込み要求を出す(inodeのreadpageメソッド)
       ページキャッシュの解放(page_cache_release関数)
       ◇iノードの遅延書き込み要求(mark_inode_dirty関数)

リンク先のパス名が長い場合は、以下のようになる。

img55.gif

リンク先のパス名が短い場合は、以下のようになる。

img56.gif

問題点, 注意点

  1. 通常ファイルの場合と同様に、SYNCモードでマウントの場合でも、 初期化したiノードの同期書き込みが行われておらず、 ゴミのiノードがディレクトリに登録されるタイミングがある。 システムクラッシュによりDUPブロックが発生する可能性がある。
  2. SYNCモードでマウントの場合でも、 シンボリックリンクファイルの データブロックが同期書き込みされていない。 システムクラッシュが発生すると、シンボリックリンク先が不定に なる可能性がある。ただし、ファイルシステム構造破壊につながる ことはない。

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