パス検索

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

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

引数にわたされるnameidataには、dentry情報、マウント情報、各種フラグが設定されている。

   path_walk(パス名、検索開始位置のnameidata)
        nameidataで渡されたdentryを探索起点とする。
        for(;;) {
             パス名から'/'で区切られたトークンを取り出す
             if(トークンが".") 何もせつcontinue
             if(トークンが"..") {
                  dentryの親子関係のリストから親ディレクトリのdentryを求める。
                  必要ならmountポイントを遡る(follow_dotdot関数)
             }
             ディレクトリエントリキャッシュから、トークンに対応する
                dentryを求める(cached_lookup関数)
             if(ディレクトリエントリキャッシュになかった) {
                       物理デバイスからトークンに対応するディレクトリエントリを見つけ、
                       dentryを作成、キャッシュに登録する(real_lookup関数)
             }
             マウントポイントなら、マウント先のrootのdentryに変換する(__follow_down関数)
             シンボリックリンクファイルなら、シンボリックリンク先のdentryに変換(do_follow_link関数)
             if(パス名が終了)
                   return 最後に求めたdentryをnameidataに登録
        }

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

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


 

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