Lions' 本読み (130)

朝練。諸々確認しつつ write 関連見つつ b_flags 云々まで見れるかどうか。
とりあえずフラグについて控え (書いて覚える的ナニ)。

  • av_ なリストから取り出す時、b_flags 属性は B_BUSY にされる
  • バッファの情報とディスクの情報が同一の状態であれば b_flags 属性は B_DONE フラグはオン
  • ディスクの情報よりバッファの情報のほうがより新しい場合、b_flags 属性は B_DELWRI フラグがオン

write 関連見ていきます。

  • bwirte 手続き
    • B_READ、B_DONE、B_ERROR、B_DELWRI フラグを落としている
    • b_wcount 属性を -256 で初期化している箇所が目に付くのですがとりあえずスルー
    • (B_READ フラグを落としているので) 書き込みリクエスト kickoff
    • B_ASYNC フラグがオフの場合、処理完了を待ってバッファを av_ なリストに戻す
    • B_ASYNC フラグがオンで、B_DELWRI フラグがオフなら geterror 手続き呼び出し
  • bdwrite 手続き
    • テープの場合 bawrite 手続きで書き込みとのこと
    • それ以外は b_flags 属性に B_DELWRI および B_DONW を設定してバッファを av_ なリストに戻す
  • bawrite 手続き
    • b_flags 属性に B_ASYNC を設定
    • bwrite 手続き呼び出し (処理完了待ちをしない)

B_DELWRI で xref 確認したら結構面白いです。ひとつは getblk 手続き。

4960    notavail(bp = bfreelist.av_forw);
4961    if (bp->b_flags & B_DELWRI) {
4962            bp->b_flags =| B_ASYNC;
4963            bwrite(bp);
4964            goto loop;

av_ なリストから除去しているあたりも絶妙。あら? これ以降どうなるのかな。つうか b_ なリストからの出し入れというあたりの理解が微妙なカンジ。

b_{forw,back} 属性

何とも微妙。そもそも構造体の属性の名前はカブッちゃ駄目、って話だったと思っていたのですが、これらは struct buf と struct devtab で名前が重複してます。

4520 struct buf
4521 {
4522    int b_flags;
4523    struct buf *b_forw;
4524    struct buf *b_back;

あるいは以下が struct devtab 型。

4551 struct devtab
4552 {
4553    char d_active;
4554    char d_errcnt;
4555    struct buf *b_forw;
4556    struct buf *b_back;
4557    struct buf *d_actf;

わざわざ b_ にしてるあたり、恣意的な何かを感じるのですが全然分からん。
ので、そこはスルーして xref で順に確認してみるに

  • b_forw 属性
    • b_ なリストを先頭から手繰る時に使われています (incore とか getblk)
    • 他で使われているのは getblk で bfreelist から外される時、dp な b_ リストの先頭に挿入される時と、binit での初期設定あたり
      • ここは b_back と同様

あ、分かった。名前を同じくしてるのって

4937            for (bp=dp->b_forw; bp != dp; bp = bp->b_forw) {

なあたりと何か関係があったりするのかな。それにしても binit の以下の部分とか今の常識的に色々凄い。

5076    for (bdp = bdevsw; bdp->d_open; bdp++) {
5077            dp = bdp->d_tab;
5078            if(dp) {
5079                    dp->b_forw = dp;
5080                    dp->b_back = dp;
5081            }
5082            i++;
5083    }

そして時間切れ

b_flags 云々については夜なのかどうなのか。