パス検索

各種ファイルを操作するには、まずパス名をiノードに変換しなければならない。以下にパス名をiノードに変換する関数の説明を行う。

vfs lookup_dentry関数はパス名をトークンに分割し、順番にディレクトリを辿って行く。パス検索はまずディレクトリエントリキャッシュ上にから見つからないか検索し、そこに見つからない場合は、物理的なデバイス上に探しに行く。物理的なデバイス上から読みだしたディレクトリエントリ情報は即座にディレクトリエントリキャッシュに登録する。その操作を繰り返し、パス名の最後までたどり着いたところで、その時参照しているdentryの参照数を1増やして返却する。大雑把なアルゴリズムは以下の通り

   lookup_dentry(パス名、検索開始位置のdentry)
        /* 探索起点となるdentryを求める */
        if (パス名が'/'から始まっている) {
                rootのdentryをベースとする
        } else if(引き数で検索開始位置がわたされた) {
                引き数で渡された検索開始位置をベースとする
        } else {
               カレントディレクトリのdentryをベースとする
        }
        for(;;) {
             パス名から'/'で区切られたトークンを取り出す
             if(トークンが"."または"..") {
                  dentryの親子関係のリストから親ディレクトリの
                  dentryを求める。(reserved_lookup関数)
             } else {
                  ディレクトリエントリキャッシュから、トークンに対応する
                  dentryを求める(cached_lookup関数)
                  if(ディレクトリエントリキャッシュになかった) {
                       物理デバイスからトークンに対応するディレクトリエントリを見つけ、
                       dentryを作成、キャッシュに登録する(real_lookup関数)
                  }
             }
             マウントポイントなら、マウント先のrootのdentryに変換する(follow_mount関数)
             シンボリックリンクファイルなら、シンボリックリンク先のdentryに変換(do_follow_link関数)
             if(パス名が終了)
                   return 最後に求めたdentry
        }

ディレクトリエントリキャッシュにヒットしない場合は、

   real_lookup(トークン)
        dir = parent->d_inode;
        iノードをロック
        再度d_lookup関数でdentryが登録されていないかチェック
        if(きわどいタイミングで登録されていたら) return;
        dentryの領域確保(d_alloc関数)
        ディレクトリファイルからトークン(ファイル名)に対応するiノードを求め、dentryとリンクする。
           (各ファイルシステム固有の処理 iノードのlookupオペレーション)
        iノードのロック解除
        return dentry


 

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