Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
ファイルのパス名検索lookup_dentry関数において、ディレクトリエントリキャッシュにヒットしなかった場合、各ファイルシステムのパス検索関数を呼び出す。ディレクトリiノードのlookupオペレーションが呼び出すことにより実現している。
ext2ファイルシステムの場合は、 ext2_lookup関数が呼び出される。ディレクトリから目的のファイルを見つけだし、そのファイルのiノードをメモリ上に確保する。
ext2_lookup(親ディレクトリのiノード, 検索するファイルのdentry) ファイル名に対応するディレクトリエントリを探す(ext2_find_entry関数) ディレクトリエントリからiノード番号を取り出す ディレクトリ読み込みに利用したバッファの解放(brelse関数) iノード番号に対応するメモリiノードを確保(iget関数) ディレクトリエントリキャッシュに登録(d_add関数)
また、ファイルのパス名検索の途中でシンボリックリンクファイルにヒットした場合、do_follow_link関数を用いて、シンボリックリンク先のファイルのdentryに変換する。ネスト数が5以上になるとエラー(ELOOP)
do_follow_link関数はシンボリックリンクファイルのiノードのfollow_linkオペレーションを呼び出すことにより機能を実現している。ext2ファイルシステムの場合は、 ext2_follow_link関数が呼び出される。また、パス検索中に発生したfollow_linkオペレーション呼び出し回数を数えており、回数が5以上になるとエラー(ELOOP)としている。
ext2_follow_link(シンボリックリンクファイルのdentry, リンクをたどるときにベースとするdentry) if(データブロックを持っている(i_blocksメンバ)) { データブロックの読み込み(ext2_bread関数) データブロック中に格納されているパス名に対応するdentryを求める(lookup_dentry関数) データブロックの読み込んだバッファの解放(brelse関数) } else { iノード中に格納されているパス名に対応するdentryを求める(lookup_dentry関数) }
(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:45:40, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members