Lions' 本読み (139)

unlnk 手続き掘削の巻。つうかテキスト読まねば、なんだけどなぁ。(ぇ
そもそも何故にこれを読むことになったのかといえば user 構造体の u_dent 属性なのか。とりあえずテキストの 408p の記述を確認しつつ、ということで。
まず namei 手続きを呼び出しています。

3515    pp = namei(&uchar, 2);

テキストの記述がアレ。

指定した名前を持つファイルを検索し、それが存在するならば、すぐ上の親ディレクトリの i ノードへのポインタを返す。

Lions' Commentary on UNIX より引用
削除対象なファイルの親ディレクトリの inode オブジェクトなポインタが戻ってきます。これはディレクトリエントリを云々するために必要なポインタ。つうか namei て何してるのだったかというと削除の場合は親ディレクトリの inode オブジェクトなポインタを戻していますね。

7657    if(flag==2 && c=='\0') {
7658            if(access(dp, IWRITE))
7659                    goto out;
7660            return(dp);
7661    }

とは言え、flag が 0 の時って何なのか、という疑問が出てきてたりして。例えば creat 手続きの以下の部分とか。

5781 creat()
5782 {
5783    register *ip;
5784    extern uchar;
5785
5786    ip = namei(&uchar, 1);
5787    if(ip == NULL) {

NULL なら云々、それ以外なら、という形になっています。あら、検索なリクエストで存在したらどうなるのかな、と思ったら cloop: なラベルに戻って

7550    if(c == '\0')
7551            return(dp);

で終了なのか。ちなみに dp は cloop に戻る前にリセットされてて

7664    dp = iget(bp, u.u_dent.u_ino);
7665    if(dp == NULL)
7666            return(NULL);
7667    goto cloop;

というアレ。ここで dp が NULL でない (何らかのファイルとしての実体がある) そしてパスがここで終了、ということであれば戻されるのは探索対象なファイルの inode なオブジェクトのポインタになる、はず。

unlink に戻って

この命令

3519    ip = iget(pp->i_dev, u.u_dent.u_ino);

これ、namei 前提になってますね。namei は削除対象なファイルが存在するディレクトリを戻して u.u_dent.u_ino は削除対象なファイルの inode 番号が、というあたりが色々とアレです。
あとは writei なパラメータを用意して

3524    u.u_offset[1] =- DIRSIZ+2;
3525    u.u_base = &u.u_dent;
3526    u.u_count = DIRSIZ+2;
3527    u.u_dent.u_ino = 0;

て、いっちゃん下がポイントですね。今の Linux でもディレクトリのサイズって小さくならないのか、ってあたりは別途確認の方向。
以降は writei してディレクトリの属性を云々。

3529    ip->i_nlink--;
3530    ip->i_flag =| IUPD;

この IUPD を追加した副作用、というソレを確認したいです。明日以降、稼動確保が可能であれば 16 章以降を再読ということで。