Lions' 本読み (119)

朝練エントリです。namei 手続き確認中。つうか、バッファ操作のあたりが完全に忘却の彼方というかあまりきちんと理解できてないのが敗因なカンジ。
とりあえず以下な部分ですが

7625            bp = bread(dp->i_dev,
7626                    bmap(dp, ldiv(u.u_offset[1], 512)));

ディレクトリエントリがあるデバイスと読み出し対象のブロックを計算して (?) bread 手続きに渡しているものと思われます。

あら?

もしかして_ディレクトリエントリの伸長_なんてことをする必要はないのかしらん。
ええと、eo は 0 のまんまで u.u_count が丁度ゼロになって、u.u_offset[1] も 512 境界に、というケイスってあり得るのかなぁ。この時 u.u_offset[1]&0777 はゼロのはず。
これ無理やり次のブロックに、ってことになるのかな。
とは言え、とりあえずの理解として

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

の else なブロックで u.u_offset[1] の操作を略してるのはそれまでに空きが無かったので末端使おうね、という意味でしかない、ということで良いのかな。
で、上記のケイスはそのまま次のブロック使う形を、なのかどうか。これは確認必要。

ええと

u.u_offset[1] のリセットと u.u_dent の関係は? って思ってしまったのですが、u.u_dent は繰り返す度にバッファから読み込まれてるのか。あ、u.u_offset[1] を 7638 で一つ先にしてるのは新規作成時でディレクトリエントリが一杯だった場合の保険なのか。
や、でも u.u_dent は直前に読みこまれた対象外のものなのかどうか、って日本語になってないですねorz
つうか、u.u_dent は wdir で上書きしてるのでいいのか。新規だし。

と、いうことで

なんとなく、ですが 7609 の謎は自分てきにはオチた状態なのかどうか。
どちらにしても、というかはっきりしたのは 14 章あたりから再読必要ですね。無条件に一つ先に書き出しちゃって無問題、って条件で 7609 の謎を収めちゃってるのも若干微妙です。

控え

  • 7626 の bmap 手続き (6415) について確認必要
  • bread から d_strategy (rkstrategy) から rkstart 経由して devstart なあたりの確認必要