Lions' 本読み (103)

昨日朝、スーパーブロックな構造体を確認してる最中でタイムアウトした模様。とりあえず maknode 手続き掘削中、というところまで把握。

ialloc から getfs および iget を呼び出してるんですがちょっとそれぞれの手続きが一体何をしているのか、が明確にイメージできてないですね。


みたいな事を書いて終わっている。とりあえず確認したところでは

7072    fp = getfs(dev);

デバイス番号 -> スーパーブロックのポインタ変換して fp に格納。

7073    while(fp->s_ilock)
7074            sleep(&fp->s_ilock, PINOD);

ロック待機。で、なんとか確認できたのは最初のブロックのみ。

7076    if(fp->s_ninode > 0) {

から始まるヤツです。で、次の命令なんですが

7077            ino = fp->s_inode[--fp->s_ninode];

スーパーブロックな struct filsys 型の s_inode 属性ですが、コメントによると_インコア i ノード数 (0 - 100)_とあります。インコア?
あと配列添字のソレを見れば分かる通り、末端からになってますね。

時間切れ

んーと、このブロックでは

  • fp->s_inode[--fp->s_ninode] から i-node 番号取得して
  • iget 手続きで i-node なオブジェクト取得して
    • ここで参照カウント (i_count 属性?) が ++ される模様
  • i_mode 属性が 0 値なら未使用と判断
    • 初期設定して ip を戻しています
  • 終了しなかった場合、iput 手続きで i_count 属性の値を戻してループ先頭に戻る

というカンジなのかどうか。
で、s_ninode 属性が 0 未満 (0 値) だった場合の処理が以降に記載されているのですが、こちらについては別途で。