Lions' 本読み (114)

なんとなく、ざっくりベースで何をしているか、な纏め (?) を書いてみる。

  • 初期読み込み (7531-7540)
  • cloop: (7542)
  • 終了判定 (異常系および正常系) (7548-7551)
  • エラーチェック (7559-7564)
    • 処理対象となっているファイルがディレクトリで実行権限が付与されていること
  • 次の処理対象になるファイル名を取得 (7570-7581)
  • eloop のための初期処理 (7585-7590)
    • u.u_count の初期化 (dp なディレクトリの中のエントリの数)
  • eloop: (7592)
  • 全てのディレクトリエントリを走査し終わった場合の処理 (7600-7614)
  • 次、のディレクトリエントリなブロックを読み込む処理? (7622-7627)
  • ディレクトリエントリを取り出して処理続行判定 (7636-7647)
    • 空きエントリの場合、creat で云々? (7640-7644)
    • 同じ名前かどうか (7645-7647)
  • 同じ名前であった場合の処理 (7655-7667)

なんとなくざっくり把握はできたので例のエントリを見つつ深め掘削の方向。

ちょっと時間があるので

以下な部分の意味を考えてみることに。

7607                    if(eo)
7608                            u.u_offset[1] = eo-DIRSIZ-2; else
7609                            dp->i_flag =| IUPD;

7609 な分岐は諸々によれば flag が 1 なんだけどディレクトリエントリに空きが無い、という場合のはず。IUPD はディレクトリエントリを追加してよ、という意味なのかどうか。ちょっと xref を手繰ってみます。
ええと、i_flag 属性に IUPD (i ノードは変更されている) を追加しているのは

  • unlink
  • chmod
  • chown
  • link
  • writei
  • bmap
  • iupdat
    • 更新だけでなく参照 (i_flag&IUPD) してます
  • itrunc
  • maknode
  • pipe

これ、ここでセットされる u.u_offset って creat から呼び出される manknode から呼び出される wdir から呼び出される writei 手続きのためのもの?
でもそれがセットされてなくって i_flag が IUPD てどんな状態なのか。

とゆーことで

時間切れ