Lions' 本読み (101)
ファイルのオープンに突入。いきなり存在していないファイルを open した場合の_生成_から、とのこと。
とりあえず
以下三点について確認。
- 5786 で呼び出されている namei 手続き確認
- u.u_error の状態 UPM の CREAT(II) 確認
- 5790 で呼び出されている maknode 手続きから呼び出されている ialloc 云々
namei 手続き
テキスト 404p に解説がありますね。とりあえず
7531 dp = u.u_cdir; 7532 if((c=(*finc())) == '/') 7533 dp = rootdir;
ここは struct inode なポインタの dp の操作になってて、最初にカレントディレクトリを指しといて (デフォ)、パス名先頭が '/' なら絶対パスなのか。
で、iget を呼び出しています。
7534 iget(dp->i_dev, dp->i_number);
iget 手続きの引数は 414p の解説によれば
デバイスとデバイス上のファイルの i ノード番号
Lions' Commentary on UNIX より引用
とのこと。struct inode な配列の属性を確認してみると
5663 int i_dev; /* iノードが存在するデバイス */ 5664 int i_number; /* i番号、デバイスアドレスと1対1に対応する */
という記述がありますね。ちょっとへろへろで解説がきちんと目に入ってこないので、手続き定義なコメントを列挙してみるに
- デバイスと i 番号によって i ノードを探す
- それが inode 構造体中 (コア中) にあれば、ロック手順に従う
- コア中になければ、指定のデバイスから i ノードを読み出す
とのこと。i ノードがマウントされていれば、とかどんな場合でも、なあたりは現時点ではスルーします。
ちなみに 7534 での iget 手続きの呼び出しについては、i ノードの参照カウントを増分させてこれをロックしてる模様 (現時点で詳細不明)。
つうか 396p の記述としては_namei (7518) はパス名を i ノードポインタに変換する_となってて (あ、これは手続き定義のコメントでも同様ですね!)、名前は引数で渡される手続きが読み込む、のは色々な意味で新鮮なカンジがしてます。
もうちょい
どうもへろへろです。いけません。
エラー状態が云々というのは以下の記述かな。
The error bit (c-bit) may be set if: a needed directory is not searchable; the file does not exist and the directory in which it is to be created is not writable; the file does exist and is unwritable; the file is a directory; there are already too many files open.
UPM の CREAT(II) より引用
控えのみ、ということにて。maknode 云々は次のエントリにて。
つーか、コードが読める状態になってなかったりするな。生活サイクル的に若干微妙なのかどうなのか。