Lions' 本読み (145)

朝練。creat 手続きのあたりの記述 (396p) 確認。
namei はパス名を inode なポインタに変換、とのこと。

5786    ip = namei(&uchar, 1);

で、戻りが NULL 値であればエラー又はその名前のファイルが存在しない、ということを示す、とあります。

5787    if(ip == NULL) {

で、エラーでなければ inode なオブジェクトを生成して open1 を呼び出してます。

5790            ip = maknode(u.u_arg[1]&0777&(~ISVTX));
5791            if (ip==NULL)
5792                    return;
5793            open1(ip, FWRITE, 2);

で、namei の戻りが NULL でない場合は open1 に 1 を渡して云々

5794    } else
5495            open1(ip, FWRITE, 1);

open1 手続きの trf な引数の値が 1 又は 2 の場合、creat 経由の呼び出しなので基本的にファイルは生成される形、なんですが以下の記述の解説で

5824    if(trf)
5825            itrunc(rip);

ここでは、この検査を (trf == 1) に変更したほうがコードの効率がよくなる。そうなることを確認してほしい。

Lions' Commentary on UNIX より引用
という記載があります。上記では trf が 0 以外の場合に、という形になるのですが 2 の場合には creat で inode なオブジェクトが maknode で生成されたばかり、という事があるので初期化は不要という事で良いのかどうか。
つうか itrunc 手続き (7414) 見てみたら inode なオブジェクトの i_addr な配列 (ディスクブロック) に対して O(n^2) なソレでバッファの読み込みおよび開放な処理をなさってらっしゃいます。
これは確かに 1 の場合のみ、の方が効率は良いですね。

ちなみに

シェルな例で言えば

$ ls
$ echo 1 > hoge

というのが trf が 2 のケイスですね。そして

$ ls
hoge
$ echo 2 > hoge

というのが trf が 1 のケイスになるはず。

継続

open1 手続きはもう少しきちんと確認の方向で。