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 章以降を再読ということで。