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 云々は次のエントリにて。
つーか、コードが読める状態になってなかったりするな。生活サイクル的に若干微妙なのかどうなのか。